{"_id":"@ahr-ahr/selftest","name":"@ahr-ahr/selftest","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@ahr-ahr/selftest","version":"1.0.0","description":"Universal self-test runner with JSON output and CLI support","main":"core.cjs","module":"core.mjs","exports":{".":{"require":"./core.cjs","import":"./core.mjs"},"./package.json":"./package.json"},"bin":{"selftest":"core.cjs"},"scripts":{"test":"node core.cjs examples/tests.json --dev"},"keywords":["test","universal","cli","unit-test","cross-language"],"author":{"name":"Ahmad Haikal Rizal"},"license":"MIT","dependencies":{"chalk":"^4.1.2","cli-progress":"^3.12.0","minimist":"^1.2.8"},"repository":{"type":"git","url":"git+https://github.com/ahr-ahr/SelfTest.git"},"bugs":{"url":"https://github.com/ahr-ahr/SelfTest/issues"},"homepage":"https://github.com/ahr-ahr/SelfTest#readme","_id":"@ahr-ahr/selftest@1.0.0","gitHead":"808241c5a72a6e61a7f7dd93d16b3f3ee56881d9","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-3lFagiUMNHPO3yXBCBwxK1elveOyOLg1EzmA2kBtZweJ4J5n7XxUs4JeZjgbK8D/fxU31J4l0nFDI1B+Qc+XJA==","shasum":"7f69fbc6b37850b562161392c29bc65f931c5127","tarball":"https://registry.npmjs.org/@ahr-ahr/selftest/-/selftest-1.0.0.tgz","fileCount":13,"unpackedSize":19142,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE++le7Z7y9pWRNW8nKdM44XkgWyWHIXrZjBckXW0CT6AiB4I7Y+iix1Vqj33+JxNP9Ye/aZJtRe6mmJWaWNxvAdeA=="}]},"_npmUser":{"name":"ahr-ahr","email":"ahr2396@gmail.com"},"directories":{},"maintainers":[{"name":"ahr-ahr","email":"ahr2396@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/selftest_1.0.0_1759237178405_0.5330372526128471"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-30T12:59:38.294Z","1.0.0":"2025-09-30T12:59:38.613Z","modified":"2025-09-30T12:59:38.907Z"},"maintainers":[{"name":"ahr-ahr","email":"ahr2396@gmail.com"}],"description":"Universal self-test runner with JSON output and CLI support","homepage":"https://github.com/ahr-ahr/SelfTest#readme","keywords":["test","universal","cli","unit-test","cross-language"],"repository":{"type":"git","url":"git+https://github.com/ahr-ahr/SelfTest.git"},"author":{"name":"Ahmad Haikal Rizal"},"bugs":{"url":"https://github.com/ahr-ahr/SelfTest/issues"},"license":"MIT","readme":"# SelfTest\r\n\r\nUniversal self-test runner lintas bahasa (JavaScript, PHP, Python) dengan output konsisten ke **terminal** dan **JSON**.\r\n\r\n[![Node.js CI](https://github.com/ahr-ahr/selftest/actions/workflows/node.yml/badge.svg)](https://github.com/ahr-ahr/selftest/actions/workflows/node.yml)\r\n[![PHP CI](https://github.com/ahr-ahr/selftest/actions/workflows/php.yml/badge.svg)](https://github.com/ahr-ahr/selftest/actions/workflows/php.yml)\r\n[![Python CI](https://github.com/ahr-ahr/selftest/actions/workflows/python.yml/badge.svg)](https://github.com/ahr-ahr/selftest/actions/workflows/python.yml)\r\n\r\n---\r\n\r\n## ✨ Fitur\r\n\r\n- API sederhana: `selftest(name, fn)` + `run()`.\r\n- Output CLI interaktif + JSON.\r\n- Bisa dipanggil dari JS, PHP, atau Python.\r\n- Mendukung **cache** hasil test di `.cache/`.\r\n\r\n---\r\n\r\n## 📦 Instalasi\r\n\r\n### Node.js (wajib, core di sini)\r\n\r\n```bash\r\nnpm install selftest\r\n```\r\n\r\n### PHP Wrapper\r\n\r\nPastikan `php` ada di PATH, lalu copy `wrapper/php/selftest.php` ke project.\r\n\r\n### Python Wrapper\r\n\r\nPastikan `python` ada di PATH, lalu copy `wrapper/python/selftest.py` ke project.\r\n\r\n---\r\n\r\n## 🚀 Cara Pakai\r\n\r\n### JavaScript\r\n\r\n```js\r\nconst { selftest, run } = require(\"selftest\");\r\n\r\nselftest(\"math add\", () => {\r\n  expect(1 + 2).toBe(3);\r\n});\r\n\r\nselftest(\"truthy test\", () => {\r\n  expect(true).toBeTruthy();\r\n});\r\n\r\nconst result = run({ dev: true, keepCache: false });\r\nconsole.log(\"Summary:\", result.summary);\r\n```\r\n\r\n### PHP\r\n\r\n```php\r\n<?php\r\nrequire_once __DIR__ . \"/../selftest.php\";\r\n\r\nSelfTest::selftest(\"math add\", function () {\r\n    return \"expect(1 + 2).toBe(3);\";\r\n});\r\n\r\nSelfTest::selftest(\"truthy test\", function () {\r\n    return \"expect(true).toBeTruthy();\";\r\n});\r\n\r\n$result = SelfTest::run(dev:true, keepCache:true);\r\nprint_r($result);\r\n```\r\n\r\n### Python\r\n\r\n```python\r\nfrom selftest import selftest, run\r\n\r\nselftest(\"math add\", \"expect(1 + 2).toBe(3)\")\r\nselftest(\"truthy test\", \"expect(True).toBeTruthy()\")\r\n\r\nresult = run(dev=True, keep_cache=True)\r\nprint(\"Summary:\", result[\"summary\"])\r\n```\r\n\r\n---\r\n\r\n## ⚙️ Opsi Wrapper\r\n\r\n- `dev: true` → tampilkan log progres + detail.\r\n- `dev: false` → diam, hasil langsung JSON.\r\n- `keepCache: true` → file JSON test & result tetap disimpan di `.cache/`.\r\n- `keepCache: false` → file otomatis dihapus.\r\n\r\n---\r\n\r\n## 📂 Struktur Direktori\r\n\r\n```\r\nselftest/\r\n ├─ core.cjs        # Core runner CJS\r\n ├─ core.mjs        # Core runner ESM\r\n ├─ wrapper/\r\n │   ├─ js/selftest-wrapper.js\r\n │   ├─ php/selftest.php\r\n │   └─ python/selftest.py\r\n └─ examples/\r\n     └─ tests.json\r\n```\r\n\r\n---\r\n\r\n## 📊 Output\r\n\r\n### Mode Dev\r\n\r\n```\r\nRUNNING [██████████] 100% | 2/2 tests\r\n✔ math add (0ms)\r\n✔ truthy test (0ms)\r\n\r\n=== SUMMARY ===\r\nTotal: 2\r\nPassed: 2\r\nFailed: 0\r\nDuration: 0 ms\r\n```\r\n\r\n### Mode JSON\r\n\r\n```json\r\n{\r\n  \"total\": 2,\r\n  \"passed\": 2,\r\n  \"failed\": 0,\r\n  \"duration_ms\": 0\r\n}\r\n```\r\n\r\n---\r\n\r\n## 📝 Tips\r\n\r\n- Tambahkan `.cache/` ke `.gitignore`.\r\n- Bisa dipanggil lintas bahasa via CLI:\r\n\r\n  ```bash\r\n  npx selftest examples/tests.json --json result.json\r\n  ```\r\n\r\n---\r\n\r\n## ⚡ CI/CD dengan GitHub Actions\r\n\r\nTambahkan workflow berikut ke repo Anda:\r\n\r\n### `.github/workflows/node.yml`\r\n\r\n```yaml\r\nname: Node.js CI\r\non: [push, pull_request]\r\njobs:\r\n  test:\r\n    runs-on: ubuntu-latest\r\n    strategy:\r\n      matrix:\r\n        node-version: [18, 20]\r\n    steps:\r\n      - uses: actions/checkout@v3\r\n      - uses: actions/setup-node@v3\r\n        with:\r\n          node-version: ${{ matrix.node-version }}\r\n      - run: npm install\r\n      - run: npm test\r\n```\r\n\r\n### `.github/workflows/php.yml`\r\n\r\n```yaml\r\nname: PHP CI\r\non: [push, pull_request]\r\njobs:\r\n  test:\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - uses: actions/checkout@v3\r\n      - uses: shivammathur/setup-php@v2\r\n        with:\r\n          php-version: \"8.2\"\r\n      - run: php wrapper/php/examples/test_math.php\r\n```\r\n\r\n### `.github/workflows/python.yml`\r\n\r\n```yaml\r\nname: Python CI\r\non: [push, pull_request]\r\njobs:\r\n  test:\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - uses: actions/checkout@v3\r\n      - uses: actions/setup-python@v4\r\n        with:\r\n          python-version: \"3.11\"\r\n      - run: python wrapper/python/examples/test_math.py\r\n```\r\n\r\n---\r\n\r\n## 📜 Lisensi\r\n\r\nMIT\r\n","readmeFilename":"README.md","_rev":"1-9f806c4b622fbbf21666534550d5d7ac"}