thuban 0.3.4 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/README.md +2 -0
- package/dist/cli.js +1 -1
- package/dist/packages/crucible/.golden/golden-master.json +414 -0
- package/dist/packages/crucible/badge-generator.js +1 -0
- package/dist/packages/crucible/banner.js +1 -0
- package/dist/packages/crucible/ci-integration.js +1 -0
- package/dist/packages/crucible/golden-master.js +1 -0
- package/dist/packages/crucible/index.js +1 -0
- package/dist/packages/crucible/kenny-mode.js +1 -0
- package/dist/packages/crucible/leaderboard.js +1 -0
- package/dist/packages/crucible/mutation-engine.js +1 -0
- package/dist/packages/crucible/pattern-learner.js +1 -0
- package/dist/packages/crucible/report-generator.js +1 -0
- package/dist/packages/crucible/rule-loader.js +1 -0
- package/dist/packages/crucible/seeding-engine.js +1 -0
- package/dist/packages/crucible/seeds/csharp/seed-001.cs +28 -0
- package/dist/packages/crucible/seeds/csharp/seed-002.cs +24 -0
- package/dist/packages/crucible/seeds/csharp/seed-003.cs +30 -0
- package/dist/packages/crucible/seeds/csharp/seed-004.cs +31 -0
- package/dist/packages/crucible/seeds/csharp/seed-005.cs +28 -0
- package/dist/packages/crucible/seeds/csharp/seed-006.cs +25 -0
- package/dist/packages/crucible/seeds/csharp/seed-007.cs +34 -0
- package/dist/packages/crucible/seeds/csharp/seed-008.cs +23 -0
- package/dist/packages/crucible/seeds/csharp/seed-009.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-010.cs +29 -0
- package/dist/packages/crucible/seeds/csharp/seed-011.cs +32 -0
- package/dist/packages/crucible/seeds/csharp/seed-012.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-013.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-014.cs +26 -0
- package/dist/packages/crucible/seeds/csharp/seed-015.cs +33 -0
- package/dist/packages/crucible/seeds/csharp/seed-016.cs +25 -0
- package/dist/packages/crucible/seeds/csharp/seed-017.cs +22 -0
- package/dist/packages/crucible/seeds/csharp/seed-018.cs +26 -0
- package/dist/packages/crucible/seeds/csharp/seed-019.cs +25 -0
- package/dist/packages/crucible/seeds/csharp/seed-020.cs +22 -0
- package/dist/packages/crucible/seeds/csharp/seed-021.cs +28 -0
- package/dist/packages/crucible/seeds/csharp/seed-022.cs +25 -0
- package/dist/packages/crucible/seeds/csharp/seed-023.cs +33 -0
- package/dist/packages/crucible/seeds/csharp/seed-024.cs +31 -0
- package/dist/packages/crucible/seeds/csharp/seed-025.cs +31 -0
- package/dist/packages/crucible/seeds/csharp/seed-026.cs +25 -0
- package/dist/packages/crucible/seeds/csharp/seed-027.cs +29 -0
- package/dist/packages/crucible/seeds/csharp/seed-028.cs +25 -0
- package/dist/packages/crucible/seeds/csharp/seed-029.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-030.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-031.cs +28 -0
- package/dist/packages/crucible/seeds/csharp/seed-032.cs +30 -0
- package/dist/packages/crucible/seeds/csharp/seed-033.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-034.cs +25 -0
- package/dist/packages/crucible/seeds/csharp/seed-035.cs +32 -0
- package/dist/packages/crucible/seeds/csharp/seed-036.cs +28 -0
- package/dist/packages/crucible/seeds/csharp/seed-037.cs +29 -0
- package/dist/packages/crucible/seeds/csharp/seed-038.cs +28 -0
- package/dist/packages/crucible/seeds/csharp/seed-039.cs +29 -0
- package/dist/packages/crucible/seeds/csharp/seed-040.cs +28 -0
- package/dist/packages/crucible/seeds/csharp/seed-041.cs +33 -0
- package/dist/packages/crucible/seeds/csharp/seed-042.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-043.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-044.cs +25 -0
- package/dist/packages/crucible/seeds/csharp/seed-045.cs +30 -0
- package/dist/packages/crucible/seeds/csharp/seed-046.cs +29 -0
- package/dist/packages/crucible/seeds/csharp/seed-047.cs +26 -0
- package/dist/packages/crucible/seeds/csharp/seed-048.cs +31 -0
- package/dist/packages/crucible/seeds/csharp/seed-049.cs +27 -0
- package/dist/packages/crucible/seeds/csharp/seed-050.cs +30 -0
- package/dist/packages/crucible/seeds/csharp/seed-051.cs +34 -0
- package/dist/packages/crucible/seeds/csharp/seed-052.cs +36 -0
- package/dist/packages/crucible/seeds/go/seed-001.go +29 -0
- package/dist/packages/crucible/seeds/go/seed-002.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-003.go +31 -0
- package/dist/packages/crucible/seeds/go/seed-004.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-005.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-006.go +29 -0
- package/dist/packages/crucible/seeds/go/seed-007.go +24 -0
- package/dist/packages/crucible/seeds/go/seed-008.go +25 -0
- package/dist/packages/crucible/seeds/go/seed-009.go +30 -0
- package/dist/packages/crucible/seeds/go/seed-010.go +35 -0
- package/dist/packages/crucible/seeds/go/seed-011.go +24 -0
- package/dist/packages/crucible/seeds/go/seed-012.go +24 -0
- package/dist/packages/crucible/seeds/go/seed-013.go +31 -0
- package/dist/packages/crucible/seeds/go/seed-014.go +35 -0
- package/dist/packages/crucible/seeds/go/seed-015.go +25 -0
- package/dist/packages/crucible/seeds/go/seed-016.go +19 -0
- package/dist/packages/crucible/seeds/go/seed-017.go +23 -0
- package/dist/packages/crucible/seeds/go/seed-018.go +23 -0
- package/dist/packages/crucible/seeds/go/seed-019.go +22 -0
- package/dist/packages/crucible/seeds/go/seed-020.go +31 -0
- package/dist/packages/crucible/seeds/go/seed-021.go +22 -0
- package/dist/packages/crucible/seeds/go/seed-022.go +29 -0
- package/dist/packages/crucible/seeds/go/seed-023.go +26 -0
- package/dist/packages/crucible/seeds/go/seed-024.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-025.go +23 -0
- package/dist/packages/crucible/seeds/go/seed-026.go +29 -0
- package/dist/packages/crucible/seeds/go/seed-027.go +26 -0
- package/dist/packages/crucible/seeds/go/seed-028.go +23 -0
- package/dist/packages/crucible/seeds/go/seed-029.go +28 -0
- package/dist/packages/crucible/seeds/go/seed-030.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-031.go +28 -0
- package/dist/packages/crucible/seeds/go/seed-032.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-033.go +29 -0
- package/dist/packages/crucible/seeds/go/seed-034.go +22 -0
- package/dist/packages/crucible/seeds/go/seed-035.go +32 -0
- package/dist/packages/crucible/seeds/go/seed-036.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-037.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-038.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-039.go +26 -0
- package/dist/packages/crucible/seeds/go/seed-040.go +37 -0
- package/dist/packages/crucible/seeds/go/seed-041.go +23 -0
- package/dist/packages/crucible/seeds/go/seed-042.go +32 -0
- package/dist/packages/crucible/seeds/go/seed-043.go +35 -0
- package/dist/packages/crucible/seeds/go/seed-044.go +25 -0
- package/dist/packages/crucible/seeds/go/seed-045.go +26 -0
- package/dist/packages/crucible/seeds/go/seed-046.go +34 -0
- package/dist/packages/crucible/seeds/go/seed-047.go +26 -0
- package/dist/packages/crucible/seeds/go/seed-048.go +29 -0
- package/dist/packages/crucible/seeds/go/seed-049.go +24 -0
- package/dist/packages/crucible/seeds/go/seed-050.go +27 -0
- package/dist/packages/crucible/seeds/go/seed-051.go +38 -0
- package/dist/packages/crucible/seeds/go/seed-052.go +27 -0
- package/dist/packages/crucible/seeds/java/seed-001.java +23 -0
- package/dist/packages/crucible/seeds/java/seed-002.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-003.java +28 -0
- package/dist/packages/crucible/seeds/java/seed-004.java +26 -0
- package/dist/packages/crucible/seeds/java/seed-005.java +33 -0
- package/dist/packages/crucible/seeds/java/seed-006.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-007.java +21 -0
- package/dist/packages/crucible/seeds/java/seed-008.java +29 -0
- package/dist/packages/crucible/seeds/java/seed-009.java +24 -0
- package/dist/packages/crucible/seeds/java/seed-010.java +30 -0
- package/dist/packages/crucible/seeds/java/seed-011.java +25 -0
- package/dist/packages/crucible/seeds/java/seed-012.java +20 -0
- package/dist/packages/crucible/seeds/java/seed-013.java +26 -0
- package/dist/packages/crucible/seeds/java/seed-014.java +23 -0
- package/dist/packages/crucible/seeds/java/seed-015.java +25 -0
- package/dist/packages/crucible/seeds/java/seed-016.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-017.java +24 -0
- package/dist/packages/crucible/seeds/java/seed-018.java +24 -0
- package/dist/packages/crucible/seeds/java/seed-019.java +38 -0
- package/dist/packages/crucible/seeds/java/seed-020.java +24 -0
- package/dist/packages/crucible/seeds/java/seed-021.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-022.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-023.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-024.java +25 -0
- package/dist/packages/crucible/seeds/java/seed-025.java +27 -0
- package/dist/packages/crucible/seeds/java/seed-026.java +25 -0
- package/dist/packages/crucible/seeds/java/seed-027.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-028.java +21 -0
- package/dist/packages/crucible/seeds/java/seed-029.java +28 -0
- package/dist/packages/crucible/seeds/java/seed-030.java +27 -0
- package/dist/packages/crucible/seeds/java/seed-031.java +23 -0
- package/dist/packages/crucible/seeds/java/seed-032.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-033.java +24 -0
- package/dist/packages/crucible/seeds/java/seed-034.java +24 -0
- package/dist/packages/crucible/seeds/java/seed-035.java +29 -0
- package/dist/packages/crucible/seeds/java/seed-036.java +25 -0
- package/dist/packages/crucible/seeds/java/seed-037.java +30 -0
- package/dist/packages/crucible/seeds/java/seed-038.java +29 -0
- package/dist/packages/crucible/seeds/java/seed-039.java +26 -0
- package/dist/packages/crucible/seeds/java/seed-040.java +31 -0
- package/dist/packages/crucible/seeds/java/seed-041.java +20 -0
- package/dist/packages/crucible/seeds/java/seed-042.java +26 -0
- package/dist/packages/crucible/seeds/java/seed-043.java +31 -0
- package/dist/packages/crucible/seeds/java/seed-044.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-045.java +25 -0
- package/dist/packages/crucible/seeds/java/seed-046.java +22 -0
- package/dist/packages/crucible/seeds/java/seed-047.java +26 -0
- package/dist/packages/crucible/seeds/java/seed-048.java +24 -0
- package/dist/packages/crucible/seeds/java/seed-049.java +28 -0
- package/dist/packages/crucible/seeds/java/seed-050.java +29 -0
- package/dist/packages/crucible/seeds/java/seed-051.java +25 -0
- package/dist/packages/crucible/seeds/java/seed-052.java +32 -0
- package/dist/packages/crucible/seeds/js/seed-001.js +27 -0
- package/dist/packages/crucible/seeds/js/seed-002.js +28 -0
- package/dist/packages/crucible/seeds/js/seed-003.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-004.js +28 -0
- package/dist/packages/crucible/seeds/js/seed-005.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-006.js +28 -0
- package/dist/packages/crucible/seeds/js/seed-007.js +26 -0
- package/dist/packages/crucible/seeds/js/seed-008.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-009.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-010.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-011.js +34 -0
- package/dist/packages/crucible/seeds/js/seed-012.js +32 -0
- package/dist/packages/crucible/seeds/js/seed-013.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-014.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-015.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-016.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-017.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-018.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-019.js +32 -0
- package/dist/packages/crucible/seeds/js/seed-020.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-021.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-022.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-023.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-024.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-025.js +34 -0
- package/dist/packages/crucible/seeds/js/seed-026.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-027.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-028.js +33 -0
- package/dist/packages/crucible/seeds/js/seed-029.js +33 -0
- package/dist/packages/crucible/seeds/js/seed-030.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-031.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-032.js +34 -0
- package/dist/packages/crucible/seeds/js/seed-033.js +33 -0
- package/dist/packages/crucible/seeds/js/seed-034.js +33 -0
- package/dist/packages/crucible/seeds/js/seed-035.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-036.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-037.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-038.js +31 -0
- package/dist/packages/crucible/seeds/js/seed-039.js +34 -0
- package/dist/packages/crucible/seeds/js/seed-040.js +35 -0
- package/dist/packages/crucible/seeds/js/seed-041.js +32 -0
- package/dist/packages/crucible/seeds/js/seed-042.js +32 -0
- package/dist/packages/crucible/seeds/js/seed-043.js +27 -0
- package/dist/packages/crucible/seeds/js/seed-044.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-045.js +33 -0
- package/dist/packages/crucible/seeds/js/seed-046.js +33 -0
- package/dist/packages/crucible/seeds/js/seed-047.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-048.js +29 -0
- package/dist/packages/crucible/seeds/js/seed-049.js +34 -0
- package/dist/packages/crucible/seeds/js/seed-050.js +34 -0
- package/dist/packages/crucible/seeds/js/seed-051.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-052.js +30 -0
- package/dist/packages/crucible/seeds/js/seed-053.js +26 -0
- package/dist/packages/crucible/seeds/js/seed-054.js +35 -0
- package/dist/packages/crucible/seeds/js/seed-055.js +33 -0
- package/dist/packages/crucible/seeds/kotlin/seed-001.kt +24 -0
- package/dist/packages/crucible/seeds/kotlin/seed-002.kt +27 -0
- package/dist/packages/crucible/seeds/kotlin/seed-003.kt +29 -0
- package/dist/packages/crucible/seeds/kotlin/seed-004.kt +24 -0
- package/dist/packages/crucible/seeds/kotlin/seed-005.kt +29 -0
- package/dist/packages/crucible/seeds/kotlin/seed-006.kt +21 -0
- package/dist/packages/crucible/seeds/kotlin/seed-007.kt +23 -0
- package/dist/packages/crucible/seeds/kotlin/seed-008.kt +25 -0
- package/dist/packages/crucible/seeds/kotlin/seed-009.kt +21 -0
- package/dist/packages/crucible/seeds/kotlin/seed-010.kt +28 -0
- package/dist/packages/crucible/seeds/kotlin/seed-011.kt +22 -0
- package/dist/packages/crucible/seeds/kotlin/seed-012.kt +25 -0
- package/dist/packages/crucible/seeds/kotlin/seed-013.kt +30 -0
- package/dist/packages/crucible/seeds/kotlin/seed-014.kt +27 -0
- package/dist/packages/crucible/seeds/kotlin/seed-015.kt +24 -0
- package/dist/packages/crucible/seeds/kotlin/seed-016.kt +28 -0
- package/dist/packages/crucible/seeds/kotlin/seed-017.kt +33 -0
- package/dist/packages/crucible/seeds/kotlin/seed-018.kt +31 -0
- package/dist/packages/crucible/seeds/kotlin/seed-019.kt +28 -0
- package/dist/packages/crucible/seeds/kotlin/seed-020.kt +31 -0
- package/dist/packages/crucible/seeds/kotlin/seed-021.kt +34 -0
- package/dist/packages/crucible/seeds/kotlin/seed-022.kt +29 -0
- package/dist/packages/crucible/seeds/kotlin/seed-023.kt +20 -0
- package/dist/packages/crucible/seeds/kotlin/seed-024.kt +23 -0
- package/dist/packages/crucible/seeds/kotlin/seed-025.kt +23 -0
- package/dist/packages/crucible/seeds/kotlin/seed-026.kt +26 -0
- package/dist/packages/crucible/seeds/kotlin/seed-027.kt +29 -0
- package/dist/packages/crucible/seeds/kotlin/seed-028.kt +24 -0
- package/dist/packages/crucible/seeds/kotlin/seed-029.kt +27 -0
- package/dist/packages/crucible/seeds/kotlin/seed-030.kt +26 -0
- package/dist/packages/crucible/seeds/kotlin/seed-031.kt +28 -0
- package/dist/packages/crucible/seeds/kotlin/seed-032.kt +29 -0
- package/dist/packages/crucible/seeds/kotlin/seed-033.kt +30 -0
- package/dist/packages/crucible/seeds/kotlin/seed-034.kt +26 -0
- package/dist/packages/crucible/seeds/kotlin/seed-035.kt +33 -0
- package/dist/packages/crucible/seeds/kotlin/seed-036.kt +25 -0
- package/dist/packages/crucible/seeds/kotlin/seed-037.kt +26 -0
- package/dist/packages/crucible/seeds/kotlin/seed-038.kt +25 -0
- package/dist/packages/crucible/seeds/kotlin/seed-039.kt +29 -0
- package/dist/packages/crucible/seeds/kotlin/seed-040.kt +28 -0
- package/dist/packages/crucible/seeds/kotlin/seed-041.kt +31 -0
- package/dist/packages/crucible/seeds/kotlin/seed-042.kt +27 -0
- package/dist/packages/crucible/seeds/kotlin/seed-043.kt +26 -0
- package/dist/packages/crucible/seeds/kotlin/seed-044.kt +27 -0
- package/dist/packages/crucible/seeds/kotlin/seed-045.kt +27 -0
- package/dist/packages/crucible/seeds/kotlin/seed-046.kt +33 -0
- package/dist/packages/crucible/seeds/kotlin/seed-047.kt +32 -0
- package/dist/packages/crucible/seeds/kotlin/seed-048.kt +20 -0
- package/dist/packages/crucible/seeds/kotlin/seed-049.kt +23 -0
- package/dist/packages/crucible/seeds/kotlin/seed-050.kt +19 -0
- package/dist/packages/crucible/seeds/php/seed-001.php +23 -0
- package/dist/packages/crucible/seeds/php/seed-002.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-003.php +25 -0
- package/dist/packages/crucible/seeds/php/seed-004.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-005.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-006.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-007.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-008.php +19 -0
- package/dist/packages/crucible/seeds/php/seed-009.php +24 -0
- package/dist/packages/crucible/seeds/php/seed-010.php +24 -0
- package/dist/packages/crucible/seeds/php/seed-011.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-012.php +24 -0
- package/dist/packages/crucible/seeds/php/seed-013.php +23 -0
- package/dist/packages/crucible/seeds/php/seed-014.php +20 -0
- package/dist/packages/crucible/seeds/php/seed-015.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-016.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-017.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-018.php +17 -0
- package/dist/packages/crucible/seeds/php/seed-019.php +24 -0
- package/dist/packages/crucible/seeds/php/seed-020.php +19 -0
- package/dist/packages/crucible/seeds/php/seed-021.php +22 -0
- package/dist/packages/crucible/seeds/php/seed-022.php +15 -0
- package/dist/packages/crucible/seeds/php/seed-023.php +24 -0
- package/dist/packages/crucible/seeds/php/seed-024.php +22 -0
- package/dist/packages/crucible/seeds/php/seed-025.php +20 -0
- package/dist/packages/crucible/seeds/php/seed-026.php +22 -0
- package/dist/packages/crucible/seeds/php/seed-027.php +15 -0
- package/dist/packages/crucible/seeds/php/seed-028.php +15 -0
- package/dist/packages/crucible/seeds/php/seed-029.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-030.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-031.php +23 -0
- package/dist/packages/crucible/seeds/php/seed-032.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-033.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-034.php +24 -0
- package/dist/packages/crucible/seeds/php/seed-035.php +22 -0
- package/dist/packages/crucible/seeds/php/seed-036.php +17 -0
- package/dist/packages/crucible/seeds/php/seed-037.php +19 -0
- package/dist/packages/crucible/seeds/php/seed-038.php +20 -0
- package/dist/packages/crucible/seeds/php/seed-039.php +15 -0
- package/dist/packages/crucible/seeds/php/seed-040.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-041.php +20 -0
- package/dist/packages/crucible/seeds/php/seed-042.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-043.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-044.php +25 -0
- package/dist/packages/crucible/seeds/php/seed-045.php +25 -0
- package/dist/packages/crucible/seeds/php/seed-046.php +20 -0
- package/dist/packages/crucible/seeds/php/seed-047.php +21 -0
- package/dist/packages/crucible/seeds/php/seed-048.php +19 -0
- package/dist/packages/crucible/seeds/php/seed-049.php +18 -0
- package/dist/packages/crucible/seeds/php/seed-050.php +20 -0
- package/dist/packages/crucible/seeds/python/seed-001.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-002.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-003.py +31 -0
- package/dist/packages/crucible/seeds/python/seed-004.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-005.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-006.py +34 -0
- package/dist/packages/crucible/seeds/python/seed-007.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-008.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-009.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-010.py +42 -0
- package/dist/packages/crucible/seeds/python/seed-011.py +30 -0
- package/dist/packages/crucible/seeds/python/seed-012.py +35 -0
- package/dist/packages/crucible/seeds/python/seed-013.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-014.py +40 -0
- package/dist/packages/crucible/seeds/python/seed-015.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-016.py +34 -0
- package/dist/packages/crucible/seeds/python/seed-017.py +34 -0
- package/dist/packages/crucible/seeds/python/seed-018.py +30 -0
- package/dist/packages/crucible/seeds/python/seed-019.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-020.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-021 2.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-021.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-022 2.py +34 -0
- package/dist/packages/crucible/seeds/python/seed-022.py +34 -0
- package/dist/packages/crucible/seeds/python/seed-023 2.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-023.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-024 2.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-024.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-025 2.py +40 -0
- package/dist/packages/crucible/seeds/python/seed-025.py +40 -0
- package/dist/packages/crucible/seeds/python/seed-026 2.py +35 -0
- package/dist/packages/crucible/seeds/python/seed-026.py +35 -0
- package/dist/packages/crucible/seeds/python/seed-027 2.py +35 -0
- package/dist/packages/crucible/seeds/python/seed-027.py +35 -0
- package/dist/packages/crucible/seeds/python/seed-028 2.py +42 -0
- package/dist/packages/crucible/seeds/python/seed-028.py +42 -0
- package/dist/packages/crucible/seeds/python/seed-029.py +42 -0
- package/dist/packages/crucible/seeds/python/seed-030 2.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-030.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-031 2.py +34 -0
- package/dist/packages/crucible/seeds/python/seed-031.py +34 -0
- package/dist/packages/crucible/seeds/python/seed-032.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-033.py +32 -0
- package/dist/packages/crucible/seeds/python/seed-034.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-035.py +35 -0
- package/dist/packages/crucible/seeds/python/seed-036 2.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-036.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-037 2.py +41 -0
- package/dist/packages/crucible/seeds/python/seed-037.py +41 -0
- package/dist/packages/crucible/seeds/python/seed-038 2.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-038.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-039 2.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-039.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-040 2.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-040.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-041 2.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-041.py +37 -0
- package/dist/packages/crucible/seeds/python/seed-042 2.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-042.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-043 2.py +32 -0
- package/dist/packages/crucible/seeds/python/seed-043.py +32 -0
- package/dist/packages/crucible/seeds/python/seed-044 2.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-044.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-045 2.py +36 -0
- package/dist/packages/crucible/seeds/python/seed-045.py +36 -0
- package/dist/packages/crucible/seeds/python/seed-046 2.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-046.py +33 -0
- package/dist/packages/crucible/seeds/python/seed-047 2.py +44 -0
- package/dist/packages/crucible/seeds/python/seed-047.py +44 -0
- package/dist/packages/crucible/seeds/python/seed-048 2.py +35 -0
- package/dist/packages/crucible/seeds/python/seed-048.py +35 -0
- package/dist/packages/crucible/seeds/python/seed-049 2.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-049.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-050 2.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-050.py +39 -0
- package/dist/packages/crucible/seeds/python/seed-051 2.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-051.py +38 -0
- package/dist/packages/crucible/seeds/python/seed-052 2.py +41 -0
- package/dist/packages/crucible/seeds/python/seed-052.py +41 -0
- package/dist/packages/crucible/seeds/ruby/seed-001 2.rb +15 -0
- package/dist/packages/crucible/seeds/ruby/seed-001.rb +15 -0
- package/dist/packages/crucible/seeds/ruby/seed-002 2.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-002.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-003 2.rb +25 -0
- package/dist/packages/crucible/seeds/ruby/seed-003.rb +25 -0
- package/dist/packages/crucible/seeds/ruby/seed-004 2.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-004.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-005 2.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-005.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-006 2.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-006.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-007 2.rb +16 -0
- package/dist/packages/crucible/seeds/ruby/seed-007.rb +16 -0
- package/dist/packages/crucible/seeds/ruby/seed-008 2.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-008.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-009 2.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-009.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-010 2.rb +24 -0
- package/dist/packages/crucible/seeds/ruby/seed-010.rb +24 -0
- package/dist/packages/crucible/seeds/ruby/seed-011 2.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-011.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-012 2.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-012.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-013 2.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-013.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-014 2.rb +16 -0
- package/dist/packages/crucible/seeds/ruby/seed-014.rb +16 -0
- package/dist/packages/crucible/seeds/ruby/seed-015 2.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-015.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-016 2.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-016.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-017 2.rb +25 -0
- package/dist/packages/crucible/seeds/ruby/seed-017.rb +25 -0
- package/dist/packages/crucible/seeds/ruby/seed-018 2.rb +23 -0
- package/dist/packages/crucible/seeds/ruby/seed-018.rb +23 -0
- package/dist/packages/crucible/seeds/ruby/seed-019 2.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-019.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-020 2.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-020.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-021 2.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-021.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-022 2.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-022.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-023 2.rb +19 -0
- package/dist/packages/crucible/seeds/ruby/seed-023.rb +19 -0
- package/dist/packages/crucible/seeds/ruby/seed-024 2.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-024.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-025 2.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-025.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-026 2.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-026.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-027 2.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-027.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-028 2.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-028.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-029 2.rb +19 -0
- package/dist/packages/crucible/seeds/ruby/seed-029.rb +19 -0
- package/dist/packages/crucible/seeds/ruby/seed-030 2.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-030.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-031 2.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-031.rb +17 -0
- package/dist/packages/crucible/seeds/ruby/seed-032 2.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-032.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-033 2.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-033.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-034 2.rb +19 -0
- package/dist/packages/crucible/seeds/ruby/seed-034.rb +19 -0
- package/dist/packages/crucible/seeds/ruby/seed-035 2.rb +19 -0
- package/dist/packages/crucible/seeds/ruby/seed-035.rb +19 -0
- package/dist/packages/crucible/seeds/ruby/seed-036 2.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-036.rb +18 -0
- package/dist/packages/crucible/seeds/ruby/seed-037 2.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-037.rb +21 -0
- package/dist/packages/crucible/seeds/ruby/seed-038 2.rb +24 -0
- package/dist/packages/crucible/seeds/ruby/seed-038.rb +24 -0
- package/dist/packages/crucible/seeds/ruby/seed-039 2.rb +24 -0
- package/dist/packages/crucible/seeds/ruby/seed-039.rb +24 -0
- package/dist/packages/crucible/seeds/ruby/seed-040 2.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-040.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-041 2.rb +23 -0
- package/dist/packages/crucible/seeds/ruby/seed-041.rb +23 -0
- package/dist/packages/crucible/seeds/ruby/seed-042 2.rb +25 -0
- package/dist/packages/crucible/seeds/ruby/seed-042.rb +25 -0
- package/dist/packages/crucible/seeds/ruby/seed-043 2.rb +23 -0
- package/dist/packages/crucible/seeds/ruby/seed-043.rb +23 -0
- package/dist/packages/crucible/seeds/ruby/seed-044 2.rb +16 -0
- package/dist/packages/crucible/seeds/ruby/seed-044.rb +16 -0
- package/dist/packages/crucible/seeds/ruby/seed-045 2.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-045.rb +22 -0
- package/dist/packages/crucible/seeds/ruby/seed-046 2.rb +27 -0
- package/dist/packages/crucible/seeds/ruby/seed-046.rb +27 -0
- package/dist/packages/crucible/seeds/ruby/seed-047 2.rb +26 -0
- package/dist/packages/crucible/seeds/ruby/seed-047.rb +26 -0
- package/dist/packages/crucible/seeds/ruby/seed-048 2.rb +24 -0
- package/dist/packages/crucible/seeds/ruby/seed-048.rb +24 -0
- package/dist/packages/crucible/seeds/ruby/seed-049 2.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-049.rb +20 -0
- package/dist/packages/crucible/seeds/ruby/seed-050 2.rb +27 -0
- package/dist/packages/crucible/seeds/ruby/seed-050.rb +27 -0
- package/dist/packages/crucible/seeds/rust/seed-001 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-001.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-002 2.rs +20 -0
- package/dist/packages/crucible/seeds/rust/seed-002.rs +20 -0
- package/dist/packages/crucible/seeds/rust/seed-003 2.rs +23 -0
- package/dist/packages/crucible/seeds/rust/seed-003.rs +23 -0
- package/dist/packages/crucible/seeds/rust/seed-004 2.rs +21 -0
- package/dist/packages/crucible/seeds/rust/seed-004.rs +21 -0
- package/dist/packages/crucible/seeds/rust/seed-005 2.rs +21 -0
- package/dist/packages/crucible/seeds/rust/seed-005.rs +21 -0
- package/dist/packages/crucible/seeds/rust/seed-006 2.rs +24 -0
- package/dist/packages/crucible/seeds/rust/seed-006.rs +24 -0
- package/dist/packages/crucible/seeds/rust/seed-007 2.rs +20 -0
- package/dist/packages/crucible/seeds/rust/seed-007.rs +20 -0
- package/dist/packages/crucible/seeds/rust/seed-008 2.rs +19 -0
- package/dist/packages/crucible/seeds/rust/seed-008.rs +19 -0
- package/dist/packages/crucible/seeds/rust/seed-009 2.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-009.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-010 2.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-010.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-011 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-011.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-012 2.rs +31 -0
- package/dist/packages/crucible/seeds/rust/seed-012.rs +31 -0
- package/dist/packages/crucible/seeds/rust/seed-013 2.rs +27 -0
- package/dist/packages/crucible/seeds/rust/seed-013.rs +27 -0
- package/dist/packages/crucible/seeds/rust/seed-014 2.rs +30 -0
- package/dist/packages/crucible/seeds/rust/seed-014.rs +30 -0
- package/dist/packages/crucible/seeds/rust/seed-015 2.rs +33 -0
- package/dist/packages/crucible/seeds/rust/seed-015.rs +33 -0
- package/dist/packages/crucible/seeds/rust/seed-016 2.rs +22 -0
- package/dist/packages/crucible/seeds/rust/seed-016.rs +22 -0
- package/dist/packages/crucible/seeds/rust/seed-017 2.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-017.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-018 2.rs +21 -0
- package/dist/packages/crucible/seeds/rust/seed-018.rs +21 -0
- package/dist/packages/crucible/seeds/rust/seed-019 2.rs +36 -0
- package/dist/packages/crucible/seeds/rust/seed-019.rs +36 -0
- package/dist/packages/crucible/seeds/rust/seed-020 2.rs +27 -0
- package/dist/packages/crucible/seeds/rust/seed-020.rs +27 -0
- package/dist/packages/crucible/seeds/rust/seed-021 2.rs +26 -0
- package/dist/packages/crucible/seeds/rust/seed-021.rs +26 -0
- package/dist/packages/crucible/seeds/rust/seed-022 2.rs +23 -0
- package/dist/packages/crucible/seeds/rust/seed-022.rs +23 -0
- package/dist/packages/crucible/seeds/rust/seed-023 2.rs +22 -0
- package/dist/packages/crucible/seeds/rust/seed-023.rs +22 -0
- package/dist/packages/crucible/seeds/rust/seed-024 2.rs +24 -0
- package/dist/packages/crucible/seeds/rust/seed-024.rs +24 -0
- package/dist/packages/crucible/seeds/rust/seed-025 2.rs +29 -0
- package/dist/packages/crucible/seeds/rust/seed-025.rs +29 -0
- package/dist/packages/crucible/seeds/rust/seed-026 2.rs +23 -0
- package/dist/packages/crucible/seeds/rust/seed-026.rs +23 -0
- package/dist/packages/crucible/seeds/rust/seed-027 2.rs +24 -0
- package/dist/packages/crucible/seeds/rust/seed-027.rs +24 -0
- package/dist/packages/crucible/seeds/rust/seed-028 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-028.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-029 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-029.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-030 2.rs +30 -0
- package/dist/packages/crucible/seeds/rust/seed-030.rs +30 -0
- package/dist/packages/crucible/seeds/rust/seed-031 2.rs +22 -0
- package/dist/packages/crucible/seeds/rust/seed-031.rs +22 -0
- package/dist/packages/crucible/seeds/rust/seed-032 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-032.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-033 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-033.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-034 2.rs +20 -0
- package/dist/packages/crucible/seeds/rust/seed-034.rs +20 -0
- package/dist/packages/crucible/seeds/rust/seed-035 2.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-035.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-036 2.rs +26 -0
- package/dist/packages/crucible/seeds/rust/seed-036.rs +26 -0
- package/dist/packages/crucible/seeds/rust/seed-037 2.rs +31 -0
- package/dist/packages/crucible/seeds/rust/seed-037.rs +31 -0
- package/dist/packages/crucible/seeds/rust/seed-038 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-038.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-039 2.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-039.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-040 2.rs +27 -0
- package/dist/packages/crucible/seeds/rust/seed-040.rs +27 -0
- package/dist/packages/crucible/seeds/rust/seed-041 2.rs +32 -0
- package/dist/packages/crucible/seeds/rust/seed-041.rs +32 -0
- package/dist/packages/crucible/seeds/rust/seed-042 2.rs +27 -0
- package/dist/packages/crucible/seeds/rust/seed-042.rs +27 -0
- package/dist/packages/crucible/seeds/rust/seed-043 2.rs +29 -0
- package/dist/packages/crucible/seeds/rust/seed-043.rs +29 -0
- package/dist/packages/crucible/seeds/rust/seed-044 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-044.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-045 2.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-045.rs +28 -0
- package/dist/packages/crucible/seeds/rust/seed-046 2.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-046.rs +25 -0
- package/dist/packages/crucible/seeds/rust/seed-047 2.rs +34 -0
- package/dist/packages/crucible/seeds/rust/seed-047.rs +34 -0
- package/dist/packages/crucible/seeds/rust/seed-048 2.rs +21 -0
- package/dist/packages/crucible/seeds/rust/seed-048.rs +21 -0
- package/dist/packages/crucible/seeds/rust/seed-049 2.rs +26 -0
- package/dist/packages/crucible/seeds/rust/seed-049.rs +26 -0
- package/dist/packages/crucible/seeds/rust/seed-050 2.rs +23 -0
- package/dist/packages/crucible/seeds/rust/seed-050.rs +23 -0
- package/dist/packages/crucible/seeds/ts/seed-001 2.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-001.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-002 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-002.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-003 2.ts +28 -0
- package/dist/packages/crucible/seeds/ts/seed-003.ts +28 -0
- package/dist/packages/crucible/seeds/ts/seed-004 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-004.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-005 2.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-005.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-006 2.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-006.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-007 2.ts +28 -0
- package/dist/packages/crucible/seeds/ts/seed-007.ts +28 -0
- package/dist/packages/crucible/seeds/ts/seed-008 2.ts +40 -0
- package/dist/packages/crucible/seeds/ts/seed-008.ts +40 -0
- package/dist/packages/crucible/seeds/ts/seed-009 2.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-009.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-010 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-010.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-011 2.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-011.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-012 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-012.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-013 2.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-013.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-014 2.ts +36 -0
- package/dist/packages/crucible/seeds/ts/seed-014.ts +36 -0
- package/dist/packages/crucible/seeds/ts/seed-015 2.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-015.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-016 2.ts +37 -0
- package/dist/packages/crucible/seeds/ts/seed-016.ts +37 -0
- package/dist/packages/crucible/seeds/ts/seed-017 2.ts +44 -0
- package/dist/packages/crucible/seeds/ts/seed-017.ts +44 -0
- package/dist/packages/crucible/seeds/ts/seed-018 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-018.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-019 2.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-019.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-020 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-020.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-021 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-021.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-022 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-022.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-023 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-023.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-024 2.ts +35 -0
- package/dist/packages/crucible/seeds/ts/seed-024.ts +35 -0
- package/dist/packages/crucible/seeds/ts/seed-025 2.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-025.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-026 2.ts +36 -0
- package/dist/packages/crucible/seeds/ts/seed-026.ts +36 -0
- package/dist/packages/crucible/seeds/ts/seed-027 2.ts +30 -0
- package/dist/packages/crucible/seeds/ts/seed-027.ts +30 -0
- package/dist/packages/crucible/seeds/ts/seed-028 2.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-028.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-029 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-029.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-030 2.ts +37 -0
- package/dist/packages/crucible/seeds/ts/seed-030.ts +37 -0
- package/dist/packages/crucible/seeds/ts/seed-031 2.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-031.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-032 2.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-032.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-033 2.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-033.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-034 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-034.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-035 2.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-035.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-036 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-036.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-037 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-037.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-038 2.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-038.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-039 2.ts +35 -0
- package/dist/packages/crucible/seeds/ts/seed-039.ts +35 -0
- package/dist/packages/crucible/seeds/ts/seed-040 2.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-040.ts +31 -0
- package/dist/packages/crucible/seeds/ts/seed-041 2.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-041.ts +29 -0
- package/dist/packages/crucible/seeds/ts/seed-042 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-042.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-043 2.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-043.ts +32 -0
- package/dist/packages/crucible/seeds/ts/seed-044 2.ts +36 -0
- package/dist/packages/crucible/seeds/ts/seed-044.ts +36 -0
- package/dist/packages/crucible/seeds/ts/seed-045 2.ts +39 -0
- package/dist/packages/crucible/seeds/ts/seed-045.ts +39 -0
- package/dist/packages/crucible/seeds/ts/seed-046 2.ts +41 -0
- package/dist/packages/crucible/seeds/ts/seed-046.ts +41 -0
- package/dist/packages/crucible/seeds/ts/seed-047 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-047.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-048 2.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-048.ts +33 -0
- package/dist/packages/crucible/seeds/ts/seed-049 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-049.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-050 2.ts +41 -0
- package/dist/packages/crucible/seeds/ts/seed-050.ts +41 -0
- package/dist/packages/crucible/seeds/ts/seed-051 2.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-051.ts +34 -0
- package/dist/packages/crucible/seeds/ts/seed-052 2.ts +36 -0
- package/dist/packages/crucible/seeds/ts/seed-052.ts +36 -0
- package/dist/packages/crucible/self-attack.js +1 -0
- package/dist/packages/scanner/ai-confidence-scorer.js +1 -1
- package/dist/packages/scanner/alert-manager.js +1 -1
- package/dist/packages/scanner/ast-analyzer.js +1 -0
- package/dist/packages/scanner/baseline-manager.js +1 -1
- package/dist/packages/scanner/cfg-analyzer.js +1 -0
- package/dist/packages/scanner/code-scanner.js +1 -1
- package/dist/packages/scanner/dependency-graph.js +1 -1
- package/dist/packages/scanner/drift-detector.js +1 -1
- package/dist/packages/scanner/executive-report.js +1 -1
- package/dist/packages/scanner/export-verifier.js +1 -0
- package/dist/packages/scanner/file-collector.js +1 -1
- package/dist/packages/scanner/file-watcher.js +1 -1
- package/dist/packages/scanner/ghost-code-detector.js +1 -1
- package/dist/packages/scanner/go-ast-analyzer.js +1 -0
- package/dist/packages/scanner/hallucination-detector.js +1 -1
- package/dist/packages/scanner/html-report.js +1 -1
- package/dist/packages/scanner/license-manager.js +1 -1
- package/dist/packages/scanner/master-health-checker.js +1 -1
- package/dist/packages/scanner/monitor-service.js +1 -1
- package/dist/packages/scanner/monitor-store.js +1 -1
- package/dist/packages/scanner/python-ast-analyzer.js +1 -0
- package/dist/packages/scanner/secret-scanner.js +1 -1
- package/dist/packages/scanner/sentinel-core.js +1 -1
- package/dist/packages/scanner/taint-tracker.js +1 -0
- package/dist/packages/scanner/tech-debt-analyzer.js +1 -1
- package/dist/packages/scanner/tech-debt-cost.js +1 -1
- package/dist/packages/scanner/widget-generator.js +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: path_traversal
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: path traversal via typed file service with user-controlled subdirectory
|
|
6
|
+
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
|
|
10
|
+
interface FileServiceConfig {
|
|
11
|
+
baseDir: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class FileService {
|
|
15
|
+
private readonly baseDir: string;
|
|
16
|
+
|
|
17
|
+
constructor(config: FileServiceConfig) {
|
|
18
|
+
this.baseDir = config.baseDir;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
readUserFile(userId: string, fileName: string): string {
|
|
22
|
+
// No normalization check — fileName can be "../../../etc/passwd"
|
|
23
|
+
const filePath = path.join(this.baseDir, userId, fileName);
|
|
24
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
listDirectory(userId: string, subDir: string): string[] {
|
|
28
|
+
// subDir from user — directory traversal possible
|
|
29
|
+
const dirPath = path.join(this.baseDir, userId, subDir);
|
|
30
|
+
return fs.readdirSync(dirPath);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
deleteFile(userId: string, fileName: string): void {
|
|
34
|
+
const filePath = path.join(this.baseDir, userId, fileName);
|
|
35
|
+
fs.unlinkSync(filePath);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: path_traversal
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: path traversal via typed file service with user-controlled subdirectory
|
|
6
|
+
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
|
|
10
|
+
interface FileServiceConfig {
|
|
11
|
+
baseDir: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class FileService {
|
|
15
|
+
private readonly baseDir: string;
|
|
16
|
+
|
|
17
|
+
constructor(config: FileServiceConfig) {
|
|
18
|
+
this.baseDir = config.baseDir;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
readUserFile(userId: string, fileName: string): string {
|
|
22
|
+
// No normalization check — fileName can be "../../../etc/passwd"
|
|
23
|
+
const filePath = path.join(this.baseDir, userId, fileName);
|
|
24
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
listDirectory(userId: string, subDir: string): string[] {
|
|
28
|
+
// subDir from user — directory traversal possible
|
|
29
|
+
const dirPath = path.join(this.baseDir, userId, subDir);
|
|
30
|
+
return fs.readdirSync(dirPath);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
deleteFile(userId: string, fileName: string): void {
|
|
34
|
+
const filePath = path.join(this.baseDir, userId, fileName);
|
|
35
|
+
fs.unlinkSync(filePath);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: path_traversal
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: path traversal in NestJS controller via user-controlled template name
|
|
6
|
+
|
|
7
|
+
import { Controller, Get, Query, Res } from '@nestjs/common';
|
|
8
|
+
import { Response } from 'express';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
|
|
12
|
+
const TEMPLATES_DIR = path.resolve(__dirname, '..', 'templates');
|
|
13
|
+
|
|
14
|
+
@Controller('email')
|
|
15
|
+
export class EmailController {
|
|
16
|
+
@Get('preview')
|
|
17
|
+
previewTemplate(
|
|
18
|
+
@Query('name') templateName: string,
|
|
19
|
+
@Query('locale') locale: string,
|
|
20
|
+
@Res() res: Response
|
|
21
|
+
): void {
|
|
22
|
+
// templateName from query — attacker sends "../../config/database"
|
|
23
|
+
const templatePath = path.join(TEMPLATES_DIR, locale, `${templateName}.html`);
|
|
24
|
+
try {
|
|
25
|
+
const html = fs.readFileSync(templatePath, 'utf-8');
|
|
26
|
+
res.type('text/html').send(html);
|
|
27
|
+
} catch {
|
|
28
|
+
res.status(404).send('Template not found');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: path_traversal
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: path traversal in NestJS controller via user-controlled template name
|
|
6
|
+
|
|
7
|
+
import { Controller, Get, Query, Res } from '@nestjs/common';
|
|
8
|
+
import { Response } from 'express';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
|
|
12
|
+
const TEMPLATES_DIR = path.resolve(__dirname, '..', 'templates');
|
|
13
|
+
|
|
14
|
+
@Controller('email')
|
|
15
|
+
export class EmailController {
|
|
16
|
+
@Get('preview')
|
|
17
|
+
previewTemplate(
|
|
18
|
+
@Query('name') templateName: string,
|
|
19
|
+
@Query('locale') locale: string,
|
|
20
|
+
@Res() res: Response
|
|
21
|
+
): void {
|
|
22
|
+
// templateName from query — attacker sends "../../config/database"
|
|
23
|
+
const templatePath = path.join(TEMPLATES_DIR, locale, `${templateName}.html`);
|
|
24
|
+
try {
|
|
25
|
+
const html = fs.readFileSync(templatePath, 'utf-8');
|
|
26
|
+
res.type('text/html').send(html);
|
|
27
|
+
} catch {
|
|
28
|
+
res.status(404).send('Template not found');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: path_traversal
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: zip-slip path traversal via user-uploaded archive with unvalidated entry names
|
|
6
|
+
|
|
7
|
+
import AdmZip from 'adm-zip';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
|
|
11
|
+
const EXTRACT_BASE = '/var/app/uploads/extracted';
|
|
12
|
+
|
|
13
|
+
export function extractArchive(zipBuffer: Buffer, userId: string): string[] {
|
|
14
|
+
const zip = new AdmZip(zipBuffer);
|
|
15
|
+
const entries = zip.getEntries();
|
|
16
|
+
const extractedPaths: string[] = [];
|
|
17
|
+
|
|
18
|
+
for (const entry of entries) {
|
|
19
|
+
// entry.entryName can contain "../" — writes outside EXTRACT_BASE (zip-slip)
|
|
20
|
+
const outputPath = path.join(EXTRACT_BASE, userId, entry.entryName);
|
|
21
|
+
|
|
22
|
+
if (entry.isDirectory) {
|
|
23
|
+
fs.mkdirSync(outputPath, { recursive: true });
|
|
24
|
+
} else {
|
|
25
|
+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
26
|
+
fs.writeFileSync(outputPath, entry.getData());
|
|
27
|
+
extractedPaths.push(outputPath);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return extractedPaths;
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: path_traversal
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: zip-slip path traversal via user-uploaded archive with unvalidated entry names
|
|
6
|
+
|
|
7
|
+
import AdmZip from 'adm-zip';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
|
|
11
|
+
const EXTRACT_BASE = '/var/app/uploads/extracted';
|
|
12
|
+
|
|
13
|
+
export function extractArchive(zipBuffer: Buffer, userId: string): string[] {
|
|
14
|
+
const zip = new AdmZip(zipBuffer);
|
|
15
|
+
const entries = zip.getEntries();
|
|
16
|
+
const extractedPaths: string[] = [];
|
|
17
|
+
|
|
18
|
+
for (const entry of entries) {
|
|
19
|
+
// entry.entryName can contain "../" — writes outside EXTRACT_BASE (zip-slip)
|
|
20
|
+
const outputPath = path.join(EXTRACT_BASE, userId, entry.entryName);
|
|
21
|
+
|
|
22
|
+
if (entry.isDirectory) {
|
|
23
|
+
fs.mkdirSync(outputPath, { recursive: true });
|
|
24
|
+
} else {
|
|
25
|
+
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
26
|
+
fs.writeFileSync(outputPath, entry.getData());
|
|
27
|
+
extractedPaths.push(outputPath);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return extractedPaths;
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: path_traversal
|
|
3
|
+
// severity: medium
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: path traversal via multer upload with user-controlled destination folder
|
|
6
|
+
|
|
7
|
+
import multer, { StorageEngine } from 'multer';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import { Request } from 'express';
|
|
11
|
+
|
|
12
|
+
const UPLOADS_ROOT = '/var/uploads';
|
|
13
|
+
|
|
14
|
+
const storage: StorageEngine = multer.diskStorage({
|
|
15
|
+
destination: (req: Request, file, cb) => {
|
|
16
|
+
const folder = req.body.folder as string || 'default';
|
|
17
|
+
// folder from request body — allows writing to arbitrary locations
|
|
18
|
+
const destPath = path.join(UPLOADS_ROOT, req.user?.id ?? 'anon', folder);
|
|
19
|
+
fs.mkdirSync(destPath, { recursive: true });
|
|
20
|
+
cb(null, destPath);
|
|
21
|
+
},
|
|
22
|
+
filename: (req: Request, file, cb) => {
|
|
23
|
+
const prefix = req.body.prefix as string || '';
|
|
24
|
+
// prefix + originalname — originalname may include path separators
|
|
25
|
+
cb(null, `${prefix}_${file.originalname}`);
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export const upload = multer({
|
|
30
|
+
storage,
|
|
31
|
+
limits: { fileSize: 50 * 1024 * 1024 },
|
|
32
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: path_traversal
|
|
3
|
+
// severity: medium
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: path traversal via multer upload with user-controlled destination folder
|
|
6
|
+
|
|
7
|
+
import multer, { StorageEngine } from 'multer';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import { Request } from 'express';
|
|
11
|
+
|
|
12
|
+
const UPLOADS_ROOT = '/var/uploads';
|
|
13
|
+
|
|
14
|
+
const storage: StorageEngine = multer.diskStorage({
|
|
15
|
+
destination: (req: Request, file, cb) => {
|
|
16
|
+
const folder = req.body.folder as string || 'default';
|
|
17
|
+
// folder from request body — allows writing to arbitrary locations
|
|
18
|
+
const destPath = path.join(UPLOADS_ROOT, req.user?.id ?? 'anon', folder);
|
|
19
|
+
fs.mkdirSync(destPath, { recursive: true });
|
|
20
|
+
cb(null, destPath);
|
|
21
|
+
},
|
|
22
|
+
filename: (req: Request, file, cb) => {
|
|
23
|
+
const prefix = req.body.prefix as string || '';
|
|
24
|
+
// prefix + originalname — originalname may include path separators
|
|
25
|
+
cb(null, `${prefix}_${file.originalname}`);
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export const upload = multer({
|
|
30
|
+
storage,
|
|
31
|
+
limits: { fileSize: 50 * 1024 * 1024 },
|
|
32
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: MD5 used for password hashing in typed auth service
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
import { Pool } from 'pg';
|
|
9
|
+
|
|
10
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
11
|
+
|
|
12
|
+
export class AuthService {
|
|
13
|
+
private hashPassword(password: string): string {
|
|
14
|
+
// MD5 is cryptographically broken — should use bcrypt/argon2
|
|
15
|
+
return crypto.createHash('md5').update(password).digest('hex');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async register(email: string, password: string): Promise<void> {
|
|
19
|
+
const hash = this.hashPassword(password);
|
|
20
|
+
await pool.query(
|
|
21
|
+
'INSERT INTO users (email, password_hash) VALUES ($1, $2)',
|
|
22
|
+
[email, hash]
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async login(email: string, password: string): Promise<boolean> {
|
|
27
|
+
const hash = this.hashPassword(password);
|
|
28
|
+
const { rows } = await pool.query(
|
|
29
|
+
'SELECT id FROM users WHERE email = $1 AND password_hash = $2',
|
|
30
|
+
[email, hash]
|
|
31
|
+
);
|
|
32
|
+
return rows.length > 0;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: MD5 used for password hashing in typed auth service
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
import { Pool } from 'pg';
|
|
9
|
+
|
|
10
|
+
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
11
|
+
|
|
12
|
+
export class AuthService {
|
|
13
|
+
private hashPassword(password: string): string {
|
|
14
|
+
// MD5 is cryptographically broken — should use bcrypt/argon2
|
|
15
|
+
return crypto.createHash('md5').update(password).digest('hex');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async register(email: string, password: string): Promise<void> {
|
|
19
|
+
const hash = this.hashPassword(password);
|
|
20
|
+
await pool.query(
|
|
21
|
+
'INSERT INTO users (email, password_hash) VALUES ($1, $2)',
|
|
22
|
+
[email, hash]
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async login(email: string, password: string): Promise<boolean> {
|
|
27
|
+
const hash = this.hashPassword(password);
|
|
28
|
+
const { rows } = await pool.query(
|
|
29
|
+
'SELECT id FROM users WHERE email = $1 AND password_hash = $2',
|
|
30
|
+
[email, hash]
|
|
31
|
+
);
|
|
32
|
+
return rows.length > 0;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: Math.random() used for security tokens, SHA1 for HMAC
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
export function generateSessionId(): string {
|
|
10
|
+
// Math.random() is not cryptographically secure
|
|
11
|
+
return Math.random().toString(36).slice(2) + Date.now().toString(36);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function generateCsrfToken(): string {
|
|
15
|
+
// Predictable timestamp-based token
|
|
16
|
+
return Buffer.from(`csrf_${Date.now()}_${Math.random()}`).toString('base64');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function generatePasswordResetToken(userId: string): string {
|
|
20
|
+
// SHA1 HMAC with weak source of randomness
|
|
21
|
+
const rand = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString();
|
|
22
|
+
return crypto.createHmac('sha1', 'static-hmac-secret').update(userId + rand).digest('hex');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function generateApiKey(): string {
|
|
26
|
+
// Only 32 bits of entropy — trivially brute-forceable
|
|
27
|
+
const rand = Math.floor(Math.random() * 0xffffffff).toString(16).padStart(8, '0');
|
|
28
|
+
return `key_${rand}`;
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: Math.random() used for security tokens, SHA1 for HMAC
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
export function generateSessionId(): string {
|
|
10
|
+
// Math.random() is not cryptographically secure
|
|
11
|
+
return Math.random().toString(36).slice(2) + Date.now().toString(36);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function generateCsrfToken(): string {
|
|
15
|
+
// Predictable timestamp-based token
|
|
16
|
+
return Buffer.from(`csrf_${Date.now()}_${Math.random()}`).toString('base64');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function generatePasswordResetToken(userId: string): string {
|
|
20
|
+
// SHA1 HMAC with weak source of randomness
|
|
21
|
+
const rand = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString();
|
|
22
|
+
return crypto.createHmac('sha1', 'static-hmac-secret').update(userId + rand).digest('hex');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function generateApiKey(): string {
|
|
26
|
+
// Only 32 bits of entropy — trivially brute-forceable
|
|
27
|
+
const rand = Math.floor(Math.random() * 0xffffffff).toString(16).padStart(8, '0');
|
|
28
|
+
return `key_${rand}`;
|
|
29
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: AES-ECB mode with no IV and RC4 weak cipher usage
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
type CipherAlgorithm = 'aes-128-ecb' | 'aes-256-ecb' | 'rc4';
|
|
10
|
+
|
|
11
|
+
export class LegacyCrypto {
|
|
12
|
+
private key: Buffer;
|
|
13
|
+
|
|
14
|
+
constructor(hexKey: string) {
|
|
15
|
+
this.key = Buffer.from(hexKey, 'hex');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// ECB mode: identical plaintext blocks produce identical ciphertext
|
|
19
|
+
encryptECB(data: string): string {
|
|
20
|
+
const cipher = crypto.createCipheriv('aes-128-ecb', this.key.slice(0, 16), null);
|
|
21
|
+
return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
decryptECB(data: string): string {
|
|
25
|
+
const decipher = crypto.createDecipheriv('aes-128-ecb', this.key.slice(0, 16), null);
|
|
26
|
+
return decipher.update(data, 'hex', 'utf8') + decipher.final('utf8');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// RC4 is broken — key reuse leads to plaintext recovery
|
|
30
|
+
encryptRC4(data: string): string {
|
|
31
|
+
const cipher = crypto.createCipheriv('rc4', this.key.slice(0, 16), null);
|
|
32
|
+
return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: AES-ECB mode with no IV and RC4 weak cipher usage
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
type CipherAlgorithm = 'aes-128-ecb' | 'aes-256-ecb' | 'rc4';
|
|
10
|
+
|
|
11
|
+
export class LegacyCrypto {
|
|
12
|
+
private key: Buffer;
|
|
13
|
+
|
|
14
|
+
constructor(hexKey: string) {
|
|
15
|
+
this.key = Buffer.from(hexKey, 'hex');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// ECB mode: identical plaintext blocks produce identical ciphertext
|
|
19
|
+
encryptECB(data: string): string {
|
|
20
|
+
const cipher = crypto.createCipheriv('aes-128-ecb', this.key.slice(0, 16), null);
|
|
21
|
+
return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
decryptECB(data: string): string {
|
|
25
|
+
const decipher = crypto.createDecipheriv('aes-128-ecb', this.key.slice(0, 16), null);
|
|
26
|
+
return decipher.update(data, 'hex', 'utf8') + decipher.final('utf8');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// RC4 is broken — key reuse leads to plaintext recovery
|
|
30
|
+
encryptRC4(data: string): string {
|
|
31
|
+
const cipher = crypto.createCipheriv('rc4', this.key.slice(0, 16), null);
|
|
32
|
+
return cipher.update(data, 'utf8', 'hex') + cipher.final('hex');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: medium
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: timing attack via string comparison of HMAC signatures
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET ?? 'fallback-secret';
|
|
10
|
+
|
|
11
|
+
export function computeSignature(payload: string): string {
|
|
12
|
+
return crypto.createHmac('sha256', WEBHOOK_SECRET).update(payload).digest('hex');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function verifyWebhookSignature(payload: string, receivedSig: string): boolean {
|
|
16
|
+
const expectedSig = computeSignature(payload);
|
|
17
|
+
// Timing attack: early exit on first mismatch leaks signature length/prefix
|
|
18
|
+
return expectedSig === receivedSig;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function verifyApiKey(providedKey: string, storedKey: string): boolean {
|
|
22
|
+
// Direct string comparison — vulnerable to timing oracle attack
|
|
23
|
+
return providedKey === storedKey;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function checkTokenMatch(a: string, b: string): boolean {
|
|
27
|
+
if (a.length !== b.length) return false;
|
|
28
|
+
// Character-by-character comparison — timing side-channel
|
|
29
|
+
for (let i = 0; i < a.length; i++) {
|
|
30
|
+
if (a[i] !== b[i]) return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: medium
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: timing attack via string comparison of HMAC signatures
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
const WEBHOOK_SECRET = process.env.WEBHOOK_SECRET ?? 'fallback-secret';
|
|
10
|
+
|
|
11
|
+
export function computeSignature(payload: string): string {
|
|
12
|
+
return crypto.createHmac('sha256', WEBHOOK_SECRET).update(payload).digest('hex');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function verifyWebhookSignature(payload: string, receivedSig: string): boolean {
|
|
16
|
+
const expectedSig = computeSignature(payload);
|
|
17
|
+
// Timing attack: early exit on first mismatch leaks signature length/prefix
|
|
18
|
+
return expectedSig === receivedSig;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function verifyApiKey(providedKey: string, storedKey: string): boolean {
|
|
22
|
+
// Direct string comparison — vulnerable to timing oracle attack
|
|
23
|
+
return providedKey === storedKey;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function checkTokenMatch(a: string, b: string): boolean {
|
|
27
|
+
if (a.length !== b.length) return false;
|
|
28
|
+
// Character-by-character comparison — timing side-channel
|
|
29
|
+
for (let i = 0; i < a.length; i++) {
|
|
30
|
+
if (a[i] !== b[i]) return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: PBKDF2 with low iteration count and SHA1, plus MD5 data integrity check
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
interface DerivedKey {
|
|
10
|
+
key: Buffer;
|
|
11
|
+
salt: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function deriveEncryptionKey(password: string): DerivedKey {
|
|
15
|
+
const salt = 'static-application-salt-2024'; // Should be random and stored per-key
|
|
16
|
+
// Only 1000 iterations — NIST recommends 600,000+ for SHA-1
|
|
17
|
+
const key = crypto.pbkdf2Sync(password, salt, 1000, 32, 'sha1');
|
|
18
|
+
return { key, salt };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function checksumFile(data: Buffer): string {
|
|
22
|
+
// MD5 is collision-prone — not suitable for integrity checks
|
|
23
|
+
return crypto.createHash('md5').update(data).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function fingerprintUser(userId: string, email: string): string {
|
|
27
|
+
// SHA1 fingerprint — deprecated for new security applications
|
|
28
|
+
return crypto.createHash('sha1').update(`${userId}:${email}`).digest('hex');
|
|
29
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: insecure_crypto
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: PBKDF2 with low iteration count and SHA1, plus MD5 data integrity check
|
|
6
|
+
|
|
7
|
+
import * as crypto from 'crypto';
|
|
8
|
+
|
|
9
|
+
interface DerivedKey {
|
|
10
|
+
key: Buffer;
|
|
11
|
+
salt: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function deriveEncryptionKey(password: string): DerivedKey {
|
|
15
|
+
const salt = 'static-application-salt-2024'; // Should be random and stored per-key
|
|
16
|
+
// Only 1000 iterations — NIST recommends 600,000+ for SHA-1
|
|
17
|
+
const key = crypto.pbkdf2Sync(password, salt, 1000, 32, 'sha1');
|
|
18
|
+
return { key, salt };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function checksumFile(data: Buffer): string {
|
|
22
|
+
// MD5 is collision-prone — not suitable for integrity checks
|
|
23
|
+
return crypto.createHash('md5').update(data).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function fingerprintUser(userId: string, email: string): string {
|
|
27
|
+
// SHA1 fingerprint — deprecated for new security applications
|
|
28
|
+
return crypto.createHash('sha1').update(`${userId}:${email}`).digest('hex');
|
|
29
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via typed recursive merge accepting user object
|
|
6
|
+
|
|
7
|
+
interface DeepObject {
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function deepMerge<T extends DeepObject>(target: T, source: DeepObject): T {
|
|
12
|
+
for (const key of Object.keys(source)) {
|
|
13
|
+
const srcVal = source[key];
|
|
14
|
+
// TypeScript types don't prevent __proto__ key at runtime
|
|
15
|
+
if (srcVal !== null && typeof srcVal === 'object' && !Array.isArray(srcVal)) {
|
|
16
|
+
if (!(target as DeepObject)[key]) (target as DeepObject)[key] = {};
|
|
17
|
+
deepMerge((target as DeepObject)[key] as DeepObject, srcVal as DeepObject);
|
|
18
|
+
} else {
|
|
19
|
+
(target as DeepObject)[key] = srcVal;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return target;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
import { Request, Response, Router } from 'express';
|
|
26
|
+
const router = Router();
|
|
27
|
+
|
|
28
|
+
router.post('/settings', (req: Request, res: Response) => {
|
|
29
|
+
const defaults = { theme: 'light', language: 'en', notifications: true };
|
|
30
|
+
// req.body directly passed — attacker sends {"__proto__": {"isAdmin": true}}
|
|
31
|
+
const merged = deepMerge(defaults, req.body as DeepObject);
|
|
32
|
+
res.json({ settings: merged });
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export default router;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// [CRUCIBLE-SEED]
|
|
2
|
+
// category: prototype_pollution
|
|
3
|
+
// severity: high
|
|
4
|
+
// language: typescript
|
|
5
|
+
// expected: prototype pollution via typed recursive merge accepting user object
|
|
6
|
+
|
|
7
|
+
interface DeepObject {
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function deepMerge<T extends DeepObject>(target: T, source: DeepObject): T {
|
|
12
|
+
for (const key of Object.keys(source)) {
|
|
13
|
+
const srcVal = source[key];
|
|
14
|
+
// TypeScript types don't prevent __proto__ key at runtime
|
|
15
|
+
if (srcVal !== null && typeof srcVal === 'object' && !Array.isArray(srcVal)) {
|
|
16
|
+
if (!(target as DeepObject)[key]) (target as DeepObject)[key] = {};
|
|
17
|
+
deepMerge((target as DeepObject)[key] as DeepObject, srcVal as DeepObject);
|
|
18
|
+
} else {
|
|
19
|
+
(target as DeepObject)[key] = srcVal;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return target;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
import { Request, Response, Router } from 'express';
|
|
26
|
+
const router = Router();
|
|
27
|
+
|
|
28
|
+
router.post('/settings', (req: Request, res: Response) => {
|
|
29
|
+
const defaults = { theme: 'light', language: 'en', notifications: true };
|
|
30
|
+
// req.body directly passed — attacker sends {"__proto__": {"isAdmin": true}}
|
|
31
|
+
const merged = deepMerge(defaults, req.body as DeepObject);
|
|
32
|
+
res.json({ settings: merged });
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export default router;
|