diff --git a/index.json b/index.json
index 09fa87b1..9ca8642f 100644
--- a/index.json
+++ b/index.json
@@ -1,6 +1,6 @@
{
"version": "1.0",
- "updatedAt": "2026-06-05T07:10:28.660Z",
+ "updatedAt": "2026-06-16T01:35:20.706Z",
"materials": [
"Fiberon ASA-CF08",
"Fiberon PA12-CF10",
@@ -114,6 +114,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -130,6 +133,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -146,6 +152,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -162,6 +171,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -178,6 +190,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -268,6 +285,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -284,6 +304,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -362,6 +385,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -426,6 +454,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -442,6 +473,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -458,6 +492,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -474,6 +511,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -600,6 +640,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -616,6 +659,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -632,6 +678,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -648,6 +697,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -726,6 +778,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -806,6 +863,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -822,6 +882,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -964,6 +1027,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -980,6 +1046,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -996,6 +1065,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1076,6 +1148,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1092,6 +1167,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1234,6 +1312,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1250,6 +1331,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1266,6 +1350,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1298,6 +1385,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -1346,6 +1438,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1362,6 +1457,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1378,6 +1476,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1456,6 +1557,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -1504,6 +1610,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1520,6 +1629,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1536,6 +1648,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1614,6 +1729,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -1646,6 +1766,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1678,6 +1801,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1694,6 +1820,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1710,6 +1839,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -1858,6 +1990,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -6224,6 +6359,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -6240,6 +6380,10 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Direct Drive TPU High Flow"
]
},
{
@@ -6256,6 +6400,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -6272,6 +6421,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -6288,6 +6440,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -6588,6 +6745,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -6604,6 +6764,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -6620,6 +6785,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -6636,6 +6806,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -6684,6 +6859,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -9076,6 +9256,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -9092,6 +9277,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -9188,6 +9378,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -9246,6 +9441,10 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden High Flow"
]
},
{
@@ -9262,6 +9461,10 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden High Flow"
]
},
{
@@ -10098,6 +10301,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10107,13 +10313,16 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Max/BBL/H2S/BambuStudio/Polymaker ABS Max @BBL H2S.json",
"filename": "Polymaker ABS Max @BBL H2S.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10154,7 +10363,7 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Pro/BBL/H2C/BambuStudio/Polymaker ABS Pro @BBL H2C.json",
"filename": "Polymaker ABS Pro @BBL H2C.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
@@ -10177,6 +10386,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10186,7 +10398,7 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Pro/BBL/P1S/BambuStudio/Polymaker ABS Pro @BBL P1S.json",
"filename": "Polymaker ABS Pro @BBL P1S.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
@@ -10217,13 +10429,16 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Pro/BBL/P2S/BambuStudio/Polymaker ABS Pro @BBL P2S.json",
"filename": "Polymaker ABS Pro @BBL P2S.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10233,13 +10448,18 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Pro/BBL/X2D/BambuStudio/Polymaker ABS Pro @BBL X2D.json",
"filename": "Polymaker ABS Pro @BBL X2D.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -10249,7 +10469,7 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Pro Galaxy/BBL/H2C/BambuStudio/Polymaker ABS Pro Galaxy @BBL H2C.json",
"filename": "Polymaker ABS Pro Galaxy @BBL H2C.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
@@ -10272,6 +10492,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10281,7 +10504,7 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Pro Galaxy/BBL/P1S/BambuStudio/Polymaker ABS Pro Galaxy @BBL P1S.json",
"filename": "Polymaker ABS Pro Galaxy @BBL P1S.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
@@ -10312,13 +10535,16 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Pro Galaxy/BBL/P2S/BambuStudio/Polymaker ABS Pro Galaxy @BBL P2S.json",
"filename": "Polymaker ABS Pro Galaxy @BBL P2S.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10328,13 +10554,18 @@
"slicer": "BambuStudio",
"path": "preset/Polymaker ABS Pro Galaxy/BBL/X2D/BambuStudio/Polymaker ABS Pro Galaxy @BBL X2D.json",
"filename": "Polymaker ABS Pro Galaxy @BBL X2D.json",
- "updatedAt": "2026-06-05T15:01:19+08:00",
+ "updatedAt": "2026-06-05T15:12:35+08:00",
"compatiblePrinters": [
{
"brand": "BBL",
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -10351,6 +10582,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10367,6 +10601,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10494,6 +10731,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -10695,6 +10937,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10711,6 +10956,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10727,6 +10975,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10774,6 +11025,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10790,6 +11044,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -10869,6 +11128,9 @@
"model": "H2C",
"fullName": "Bambu Lab H2C 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10885,6 +11147,9 @@
"model": "H2D",
"fullName": "Bambu Lab H2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10901,6 +11166,9 @@
"model": "H2S",
"fullName": "Bambu Lab H2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10948,6 +11216,9 @@
"model": "P2S",
"fullName": "Bambu Lab P2S 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow"
]
},
{
@@ -10964,6 +11235,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -11276,6 +11552,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
@@ -11466,6 +11747,11 @@
"model": "X2D",
"fullName": "Bambu Lab X2D 0.4 nozzle"
}
+ ],
+ "missingExtruderVariants": [
+ "Direct Drive High Flow",
+ "Bowden Standard",
+ "Bowden High Flow"
]
},
{
diff --git a/scripts/generate-index-json.mjs b/scripts/generate-index-json.mjs
index 8194ac51..6340a619 100644
--- a/scripts/generate-index-json.mjs
+++ b/scripts/generate-index-json.mjs
@@ -104,6 +104,29 @@ function extractCompatiblePrinters(presetData) {
return printers;
}
+/**
+ * Find extruder/nozzle variants that have no tuned values.
+ * A preset is multi-variant when filament_extruder_variant has length > 1.
+ * The authority field is nozzle_temperature, aligned index-for-index.
+ * Any column equal to the string "nil" means that variant was not authored.
+ * @param {any} presetData
+ * @returns {string[]} names of missing variants (empty when none / not applicable)
+ */
+function extractMissingExtruderVariants(presetData) {
+ if (!presetData) return [];
+ const variants = presetData.filament_extruder_variant;
+ const temps = presetData.nozzle_temperature;
+ if (!Array.isArray(variants) || variants.length <= 1) return [];
+ if (!Array.isArray(temps) || temps.length !== variants.length) return [];
+ const missing = [];
+ for (let i = 0; i < variants.length; i++) {
+ if (String(temps[i]).toLowerCase() === 'nil') {
+ missing.push(variants[i]);
+ }
+ }
+ return missing;
+}
+
function cmp(a, b) {
return a < b ? -1 : a > b ? 1 : 0;
}
@@ -152,11 +175,13 @@ async function main() {
// Read the preset JSON content to extract compatible_printers
let compatiblePrinters = [];
+ let missingExtruderVariants = [];
if (extension === '.json') {
try {
const fileContent = await fs.readFile(absFile, 'utf8');
const presetData = JSON.parse(fileContent);
compatiblePrinters = extractCompatiblePrinters(presetData);
+ missingExtruderVariants = extractMissingExtruderVariants(presetData);
} catch (e) {
console.warn(`Failed to parse ${relFromPreset}: ${e.message}`);
}
@@ -175,7 +200,8 @@ async function main() {
path: relPath,
filename,
updatedAt,
- compatiblePrinters: compatiblePrinters
+ compatiblePrinters: compatiblePrinters,
+ ...(missingExtruderVariants.length ? { missingExtruderVariants } : {})
});
}
diff --git a/scripts/generate-index-json.test.mjs b/scripts/generate-index-json.test.mjs
index 41f14a27..43f3a2dc 100644
--- a/scripts/generate-index-json.test.mjs
+++ b/scripts/generate-index-json.test.mjs
@@ -360,10 +360,74 @@ describe('Preset Files', () => {
const presetFiles = await walkPresetFiles(PRESET_DIR);
- assert.strictEqual(index.presets.length, presetFiles.length,
+ assert.strictEqual(index.presets.length, presetFiles.length,
`index.json should have ${presetFiles.length} presets, but has ${index.presets.length}`);
});
});
+
+ describe('extractMissingExtruderVariants function', () => {
+ // Mirrors the helper in generate-index-json.mjs
+ function extractMissingExtruderVariants(presetData) {
+ if (!presetData) return [];
+ const variants = presetData.filament_extruder_variant;
+ const temps = presetData.nozzle_temperature;
+ if (!Array.isArray(variants) || variants.length <= 1) return [];
+ if (!Array.isArray(temps) || temps.length !== variants.length) return [];
+ const missing = [];
+ for (let i = 0; i < variants.length; i++) {
+ if (String(temps[i]).toLowerCase() === 'nil') {
+ missing.push(variants[i]);
+ }
+ }
+ return missing;
+ }
+
+ it('returns the names of variants whose nozzle_temperature is nil', () => {
+ const data = {
+ filament_extruder_variant: [
+ 'Direct Drive Standard', 'Direct Drive High Flow', 'Bowden Standard', 'Bowden High Flow'
+ ],
+ nozzle_temperature: ['280', 'nil', 'nil', 'nil']
+ };
+ assert.deepStrictEqual(
+ extractMissingExtruderVariants(data),
+ ['Direct Drive High Flow', 'Bowden Standard', 'Bowden High Flow']
+ );
+ });
+
+ it('returns [] when every column has a value', () => {
+ const data = {
+ filament_extruder_variant: ['Direct Drive Standard', 'Direct Drive High Flow'],
+ nozzle_temperature: ['280', '290']
+ };
+ assert.deepStrictEqual(extractMissingExtruderVariants(data), []);
+ });
+
+ it('returns [] for single-variant presets', () => {
+ const data = {
+ filament_extruder_variant: ['Direct Drive Standard'],
+ nozzle_temperature: ['280']
+ };
+ assert.deepStrictEqual(extractMissingExtruderVariants(data), []);
+ });
+
+ it('returns [] when filament_extruder_variant is missing', () => {
+ assert.deepStrictEqual(extractMissingExtruderVariants({ nozzle_temperature: ['280', 'nil'] }), []);
+ });
+
+ it('returns [] when array lengths mismatch (skips detection safely)', () => {
+ const data = {
+ filament_extruder_variant: ['Direct Drive Standard', 'Direct Drive High Flow'],
+ nozzle_temperature: ['280']
+ };
+ assert.deepStrictEqual(extractMissingExtruderVariants(data), []);
+ });
+
+ it('returns [] for null/undefined preset data', () => {
+ assert.deepStrictEqual(extractMissingExtruderVariants(null), []);
+ assert.deepStrictEqual(extractMissingExtruderVariants(undefined), []);
+ });
+ });
});
// Cleanup after tests
diff --git a/scripts/missing-variant-warning.test.mjs b/scripts/missing-variant-warning.test.mjs
new file mode 100644
index 00000000..0e8aa28e
--- /dev/null
+++ b/scripts/missing-variant-warning.test.mjs
@@ -0,0 +1,53 @@
+import { describe, it } from 'node:test';
+import assert from 'node:assert';
+
+// Mirrors collectMissingVariantWarnings() in app.js.
+// Aggregates the currently-selected presets into one de-duplicated list of
+// { material, model, variants } entries for presets that have missing variants.
+function collectMissingVariantWarnings(selectedPresets) {
+ var seen = {};
+ var items = [];
+ for (var key in selectedPresets) {
+ if (!Object.prototype.hasOwnProperty.call(selectedPresets, key)) continue;
+ var p = selectedPresets[key];
+ var missing = p && p.missingExtruderVariants;
+ if (!missing || !missing.length) continue;
+ var dedupKey = (p.material || '') + '||' + (p.model || '') + '||' + missing.join(',');
+ if (seen[dedupKey]) continue;
+ seen[dedupKey] = true;
+ items.push({ material: p.material || '', model: p.model || '', variants: missing.slice() });
+ }
+ return items;
+}
+
+describe('collectMissingVariantWarnings', () => {
+ it('returns [] when nothing is selected', () => {
+ assert.deepStrictEqual(collectMissingVariantWarnings({}), []);
+ });
+
+ it('returns [] when no selected preset has missing variants', () => {
+ const sel = {
+ a: { material: 'PolyLite PLA', model: 'X1', missingExtruderVariants: [] },
+ b: { material: 'Polymaker PLA', model: 'A1' }
+ };
+ assert.deepStrictEqual(collectMissingVariantWarnings(sel), []);
+ });
+
+ it('collects affected presets with material, model and variant names', () => {
+ const sel = {
+ a: { material: 'PolyLite PLA', model: 'X2D', missingExtruderVariants: ['Direct Drive High Flow', 'Bowden Standard'] },
+ b: { material: 'Polymaker PLA', model: 'A1', missingExtruderVariants: [] }
+ };
+ assert.deepStrictEqual(collectMissingVariantWarnings(sel), [
+ { material: 'PolyLite PLA', model: 'X2D', variants: ['Direct Drive High Flow', 'Bowden Standard'] }
+ ]);
+ });
+
+ it('de-duplicates identical material+model+variants entries', () => {
+ const sel = {
+ a: { material: 'PolyLite PLA', model: 'X2D', missingExtruderVariants: ['Bowden Standard'] },
+ b: { material: 'PolyLite PLA', model: 'X2D', missingExtruderVariants: ['Bowden Standard'] }
+ };
+ assert.strictEqual(collectMissingVariantWarnings(sel).length, 1);
+ });
+});
diff --git a/style.css b/style.css
index cb0c00e2..71a096f8 100644
--- a/style.css
+++ b/style.css
@@ -2160,3 +2160,15 @@ body.theme-wiki .warning-modal-link a:active {
gap: 0.75rem;
padding-top: 0.5rem;
}
+
+/* Missing extruder-variant warning */
+.missing-variant-list {
+ margin: 12px 0;
+ padding-left: 20px;
+ list-style: disc;
+}
+
+.missing-variant-list li {
+ margin-bottom: 6px;
+ line-height: 1.4;
+}