{"id":17043364,"url":"https://github.com/mmiscool/nurbs","last_synced_at":"2025-03-23T01:43:20.885Z","repository":{"id":248324834,"uuid":"828387009","full_name":"mmiscool/NURBS","owner":"mmiscool","description":"(will possibly be eventually) Complete Javascript NURBS library","archived":false,"fork":false,"pushed_at":"2024-07-15T01:09:30.000Z","size":206,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-14T16:54:49.114Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mmiscool.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-14T01:51:17.000Z","updated_at":"2025-01-16T16:10:20.000Z","dependencies_parsed_at":"2024-07-14T02:46:46.890Z","dependency_job_id":"c643fada-a280-4d77-97be-7bc66b6a8c9a","html_url":"https://github.com/mmiscool/NURBS","commit_stats":null,"previous_names":["mmiscool/nurbs"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mmiscool%2FNURBS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mmiscool%2FNURBS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mmiscool%2FNURBS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mmiscool%2FNURBS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mmiscool","download_url":"https://codeload.github.com/mmiscool/NURBS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245044493,"owners_count":20551898,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-14T09:29:21.186Z","updated_at":"2025-03-23T01:43:20.860Z","avatar_url":"https://github.com/mmiscool.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NURBS\nComplete Javascript NURBS library\n\n## Features\n- Handle NURBS curves and surfaces\n- Basic primitives (points, vectors)\n- Utility functions for creating standard geometry pieces (lines, circles, ellipses, arcs)\n- Trimming NURBS curves and surfaces\n- Rational NURBS (weights for control points)\n- NURBS curve and surface derivatives\n- NURBS curve and surface refinement\n- NURBS curve and surface knot insertion and removal\n- NURBS curve and surface degree elevation\n- NURBS curve and surface intersection\n- NURBS curve and surface approximation\n\n## Usage\n\n### Creating a Point\n```javascript\nconst point = new Point(1, 2, 3);\nconsole.log(point.getX()); // 1\nconsole.log(point.getY()); // 2\nconsole.log(point.getZ()); // 3\n```\n\n### Creating a Vector\n```javascript\nconst vector1 = new Vector(1, 2, 3);\nconst vector2 = new Vector(4, 5, 6);\nconst result = vector1.add(vector2);\nconsole.log(result); // Vector { x: 5, y: 7, z: 9 }\n```\n\n### Creating a NURBS Curve\n```javascript\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst knotVector = [0, 0, 0, 1, 1, 1];\nconst curve = new Curve(controlPoints, degree, knotVector);\nconst pointOnCurve = curve.evaluate(0.5);\nconsole.log(pointOnCurve); // { x: 1, y: 0.5, z: 0 }\n```\n\n### Creating a NURBS Surface\n```javascript\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees = [2, 2];\nconst knotVectors = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst surface = new Surface(controlPoints, degrees, knotVectors);\nconst pointOnSurface = surface.evaluate(0.5, 0.5);\nconsole.log(pointOnSurface); // { x: 1, y: 1, z: 0 }\n```\n\n### Creating a Line\n```javascript\nimport { createLine } from './src/NURBS/CurvePrimitives';\n\nconst startPoint = new Point(0, 0, 0);\nconst endPoint = new Point(1, 1, 1);\nconst line = createLine(startPoint, endPoint);\nconsole.log(line);\n```\n\n### Creating a Circle\n```javascript\nimport { createCircle } from './src/NURBS/CurvePrimitives';\n\nconst center = new Point(0, 0, 0);\nconst radius = 1;\nconst circle = createCircle(center, radius);\nconsole.log(circle);\n```\n\n### Creating an Ellipse\n```javascript\nimport { createEllipse } from './src/NURBS/CurvePrimitives';\n\nconst center = new Point(0, 0, 0);\nconst radiusX = 2;\nconst radiusY = 1;\nconst ellipse = createEllipse(center, radiusX, radiusY);\nconsole.log(ellipse);\n```\n\n### Creating an Arc\n```javascript\nimport { createArc } from './src/NURBS/CurvePrimitives';\n\nconst center = new Point(0, 0, 0);\nconst radius = 1;\nconst startAngle = 0;\nconst endAngle = Math.PI / 2;\nconst arc = createArc(center, radius, startAngle, endAngle);\nconsole.log(arc);\n```\n\n### Creating a Bezier Curve\n```javascript\nimport { createBezierCurve } from './src/NURBS/CurvePrimitives';\n\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 2, 0), new Point(2, 0, 0)];\nconst bezierCurve = createBezierCurve(controlPoints);\nconsole.log(bezierCurve);\n```\n\n### Creating a Parabola\n```javascript\nimport { createParabola } from './src/NURBS/CurvePrimitives';\n\nconst vertex = new Point(0, 0, 0);\nconst focus = new Point(0, 1, 0);\nconst parabola = createParabola(vertex, focus);\nconsole.log(parabola);\n```\n\n### Creating a Hyperbola\n```javascript\nimport { createHyperbola } from './src/NURBS/CurvePrimitives';\n\nconst center = new Point(0, 0, 0);\nconst a = 1;\nconst b = 1;\nconst hyperbola = createHyperbola(center, a, b);\nconsole.log(hyperbola);\n```\n\n### Creating a Spline\n```javascript\nimport { createSpline } from './src/NURBS/CurvePrimitives';\n\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 2, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst spline = createSpline(controlPoints, degree);\nconsole.log(spline);\n```\n\n### Creating a Rational NURBS Curve\n```javascript\nimport { createRationalNURBSCurve } from './src/NURBS/CurvePrimitives';\n\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst weights = [1, 0.5, 1];\nconst degree = 2;\nconst rationalCurve = createRationalNURBSCurve(controlPoints, weights, degree);\nconsole.log(rationalCurve);\n```\n\n### Trimming a NURBS Curve\n```javascript\nimport { trimCurve } from './src/NURBS/CurvePrimitives';\n\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst weights = [1, 0.5, 1];\nconst degree = 2;\nconst curve = createRationalNURBSCurve(controlPoints, weights, degree);\nconst trimmedCurve = trimCurve(curve, 0, 1);\nconsole.log(trimmedCurve);\n```\n\n### Creating a Plane\n```javascript\nimport { createPlane } from './src/NURBS/SurfacePrimitives';\n\nconst width = 2;\nconst height = 2;\nconst plane = createPlane(width, height);\nconsole.log(plane);\n```\n\n### Creating a Cylinder\n```javascript\nimport { createCylinder } from './src/NURBS/SurfacePrimitives';\n\nconst radius = 1;\nconst height = 2;\nconst cylinder = createCylinder(radius, height);\nconsole.log(cylinder);\n```\n\n### Creating a Cone\n```javascript\nimport { createCone } from './src/NURBS/SurfacePrimitives';\n\nconst radius = 1;\nconst height = 2;\nconst cone = createCone(radius, height);\nconsole.log(cone);\n```\n\n### Creating a Sphere\n```javascript\nimport { createSphere } from './src/NURBS/SurfacePrimitives';\n\nconst radius = 1;\nconst sphere = createSphere(radius);\nconsole.log(sphere);\n```\n\n### Creating a Rational NURBS Surface\n```javascript\nimport { createRationalNURBSSurface } from './src/NURBS/SurfacePrimitives';\n\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst weights = [\n  [1, 0.5, 1],\n  [0.5, 0.25, 0.5],\n  [1, 0.5, 1]\n];\nconst degrees = [2, 2];\nconst rationalSurface = createRationalNURBSSurface(controlPoints, weights, degrees);\nconsole.log(rationalSurface);\n```\n\n### Trimming a NURBS Surface\n```javascript\nimport { trimSurface } from './src/NURBS/SurfacePrimitives';\n\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst weights = [\n  [1, 0.5, 1],\n  [0.5, 0.25, 0.5],\n  [1, 0.5, 1]\n];\nconst degrees = [2, 2];\nconst surface = createRationalNURBSSurface(controlPoints, weights, degrees);\nconst trimmedSurface = trimSurface(surface, 0, 1, 0, 1);\nconsole.log(trimmedSurface);\n```\n\n### Evaluating NURBS Curve Derivatives\n```javascript\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst knotVector = [0, 0, 0, 1, 1, 1];\nconst curve = new Curve(controlPoints, degree, knotVector);\nconst derivative = curve.derivative(0.5, 1);\nconsole.log(derivative); // { x: 1, y: 0, z: 0 }\n```\n\n### Evaluating NURBS Surface Derivatives\n```javascript\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees = [2, 2];\nconst knotVectors = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst surface = new Surface(controlPoints, degrees, knotVectors);\nconst derivative = surface.derivative(0.5, 0.5, 1, 1);\nconsole.log(derivative); // { x: 1, y: 1, z: 0 }\n```\n\n### Refining a NURBS Curve\n```javascript\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst knotVector = [0, 0, 0, 1, 1, 1];\nconst curve = new Curve(controlPoints, degree, knotVector);\nconst refinedCurve = curve.refine([0.5]);\nconsole.log(refinedCurve);\n```\n\n### Refining a NURBS Surface\n```javascript\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees = [2, 2];\nconst knotVectors = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst surface = new Surface(controlPoints, degrees, knotVectors);\nconst refinedSurface = surface.refine([[0.5], [0.5]]);\nconsole.log(refinedSurface);\n```\n\n### Inserting a Knot into a NURBS Curve\n```javascript\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst knotVector = [0, 0, 0, 1, 1, 1];\nconst curve = new Curve(controlPoints, degree, knotVector);\nconst newCurve = curve.insertKnot(0.5);\nconsole.log(newCurve);\n```\n\n### Inserting a Knot into a NURBS Surface\n```javascript\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees = [2, 2];\nconst knotVectors = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst surface = new Surface(controlPoints, degrees, knotVectors);\nconst newSurface = surface.insertKnot(0.5, 0.5);\nconsole.log(newSurface);\n```\n\n### Removing a Knot from a NURBS Curve\n```javascript\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst knotVector = [0, 0, 0, 0.5, 1, 1, 1];\nconst curve = new Curve(controlPoints, degree, knotVector);\nconst newCurve = curve.removeKnot(0.5);\nconsole.log(newCurve);\n```\n\n### Removing a Knot from a NURBS Surface\n```javascript\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees = [2, 2];\nconst knotVectors = [\n  [0, 0, 0, 0.5, 1, 1, 1],\n  [0, 0, 0, 0.5, 1, 1, 1]\n];\nconst surface = new Surface(controlPoints, degrees, knotVectors);\nconst newSurface = surface.removeKnot(0.5, 0.5);\nconsole.log(newSurface);\n```\n\n### Elevating the Degree of a NURBS Curve\n```javascript\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst knotVector = [0, 0, 0, 1, 1, 1];\nconst curve = new Curve(controlPoints, degree, knotVector);\nconst newCurve = curve.elevateDegree();\nconsole.log(newCurve);\n```\n\n### Elevating the Degree of a NURBS Surface\n```javascript\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees = [2, 2];\nconst knotVectors = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst surface = new Surface(controlPoints, degrees, knotVectors);\nconst newSurface = surface.elevateDegree();\nconsole.log(newSurface);\n```\n\n### Intersecting NURBS Curves\n```javascript\nconst controlPoints1 = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree1 = 2;\nconst knotVector1 = [0, 0, 0, 1, 1, 1];\nconst curve1 = new Curve(controlPoints1, degree1, knotVector1);\n\nconst controlPoints2 = [new Point(0, 1, 0), new Point(1, 0, 0), new Point(2, 1, 0)];\nconst degree2 = 2;\nconst knotVector2 = [0, 0, 0, 1, 1, 1];\nconst curve2 = new Curve(controlPoints2, degree2, knotVector2);\n\nconst intersections = curve1.intersect(curve2);\nconsole.log(intersections);\n```\n\n### Intersecting NURBS Surfaces\n```javascript\nconst controlPoints1 = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees1 = [2, 2];\nconst knotVectors1 = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst surface1 = new Surface(controlPoints1, degrees1, knotVectors1);\n\nconst controlPoints2 = [\n  [new Point(0, 0, 1), new Point(1, 0, 1), new Point(2, 0, 1)],\n  [new Point(0, 1, 1), new Point(1, 1, 1), new Point(2, 1, 1)],\n  [new Point(0, 2, 1), new Point(1, 2, 1), new Point(2, 2, 1)]\n];\nconst degrees2 = [2, 2];\nconst knotVectors2 = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst surface2 = new Surface(controlPoints2, degrees2, knotVectors2);\n\nconst intersections = surface1.intersect(surface2);\nconsole.log(intersections);\n```\n\n### Intersecting a NURBS Curve and Surface\n```javascript\nconst controlPointsCurve = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degreeCurve = 2;\nconst knotVectorCurve = [0, 0, 0, 1, 1, 1];\nconst curve = new Curve(controlPointsCurve, degreeCurve, knotVectorCurve);\n\nconst controlPointsSurface = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degreesSurface = [2, 2];\nconst knotVectorsSurface = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst surface = new Surface(controlPointsSurface, degreesSurface, knotVectorsSurface);\n\nconst intersections = curve.intersectSurface(surface);\nconsole.log(intersections);\n```\n\n### Approximating a NURBS Curve\n```javascript\nconst points = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst curve = Curve.approximate(points, degree);\nconsole.log(curve);\n```\n\n### Approximating a NURBS Surface\n```javascript\nconst points = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees = [2, 2];\nconst surface = Surface.approximate(points, degrees);\nconsole.log(surface);\n```\n\n### Creating a NURBS Face\n```javascript\nimport { createNURBSFace } from './src/NURBS/SurfacePrimitives';\n\nconst controlPoints = [\n  [new Point(0, 0, 0), new Point(1, 0, 0), new Point(2, 0, 0)],\n  [new Point(0, 1, 0), new Point(1, 1, 0), new Point(2, 1, 0)],\n  [new Point(0, 2, 0), new Point(1, 2, 0), new Point(2, 2, 0)]\n];\nconst degrees = [2, 2];\nconst knotVectors = [\n  [0, 0, 0, 1, 1, 1],\n  [0, 0, 0, 1, 1, 1]\n];\nconst face = createNURBSFace(controlPoints, degrees, knotVectors);\nconsole.log(face);\n```\n\n### Creating a NURBS Edge\n```javascript\nimport { createNURBSEdge } from './src/NURBS/CurvePrimitives';\n\nconst controlPoints = [new Point(0, 0, 0), new Point(1, 1, 0), new Point(2, 0, 0)];\nconst degree = 2;\nconst knotVector = [0, 0, 0, 1, 1, 1];\nconst edge = createNURBSEdge(controlPoints, degree, knotVector);\nconsole.log(edge);\n```\n\n### Creating a BREP Taurus\n```javascript\nimport { BREP } from './src/BREP/BREP';\n\nconst brep = new BREP();\nconst taurus = brep.createBREPTaurus(5, 2);\nconsole.log(taurus);\n```\n\n### Creating a BREP Cylinder\n```javascript\nimport { BREP } from './src/BREP/BREP';\n\nconst brep = new BREP();\nconst cylinder = brep.createBREPCylinder(3, 7);\nconsole.log(cylinder);\n```\n\n### Creating a BREP Cone\n```javascript\nimport { BREP } from './src/BREP/BREP';\n\nconst brep = new BREP();\nconst cone = brep.createBREPCone(3, 7);\nconsole.log(cone);\n```\n\n### Creating a BREP Cube\n```javascript\nimport { BREP } from './src/BREP/BREP';\n\nconst brep = new BREP();\nconst cube = brep.createBREPCube(3, 3, 3);\nconsole.log(cube);\n```\n\n### Tracking IDs for Faces and Edges in BREP Data Structures\nThe BREP data structures now support tracking unique IDs for faces and edges. Each face and edge is assigned a unique ID when it is created. This allows for easier identification and management of faces and edges within the BREP data structures.\n\n#### Creating a BREP Edge with ID\n```javascript\nimport { BREPEdge } from './src/BREP/BREPEdge';\n\nconst startVertex = new Point(0, 0, 0);\nconst endVertex = new Point(1, 1, 1);\nconst edge = new BREPEdge(startVertex, endVertex, 1);\nconsole.log(edge.id); // 1\n```\n\n#### Creating a BREP Face with ID\n```javascript\nimport { BREPFace } from './src/BREP/BREPFace';\n\nconst surface = new Surface(controlPoints, degrees, knotVectors);\nconst face = new BREPFace(surface, 1);\nconsole.log(face.id); // 1\n```\n\n### Exporting a BREP Solid as an STL File\n```javascript\nimport { BREP } from './src/BREP/BREP';\n\nconst brep = new BREP();\nconst cube = brep.createBREPCube(3, 3, 3);\nconst stlContent = brep.exportToSTL();\nconsole.log(stlContent);\n```\n\n## Running Tests\n\nTo run the test suite using Jest, follow these steps:\n\n1. Install the dependencies:\n   ```bash\n   npm install\n   ```\n\n2. Run the tests:\n   ```bash\n   npm test\n   ```\n\nThe test files are located in the `tests/test-suite.js` file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmmiscool%2Fnurbs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmmiscool%2Fnurbs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmmiscool%2Fnurbs/lists"}