{"_id":"@blopai/ingest","_rev":"4-f735230ad1c4295c2c4635efc415c487","name":"@blopai/ingest","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@blopai/ingest","version":"0.1.0","keywords":["blop","testing","ingest","cloudevents","junit","vitest","ci","qa"],"license":"MIT","_id":"@blopai/ingest@0.1.0","maintainers":[{"name":"hananinas","email":"hanani.nas@gmail.com"}],"homepage":"https://github.com/blop-oss/blop-app/tree/main/packages/ingest-client#readme","bugs":{"url":"https://github.com/blop-oss/blop-app/issues"},"bin":{"blop-ingest":"dist/cli.js"},"dist":{"shasum":"04f12809a7e25a9056fe8da50f371077eeb59e4e","tarball":"https://registry.npmjs.org/@blopai/ingest/-/ingest-0.1.0.tgz","fileCount":18,"integrity":"sha512-BSQMp9gmV/dHVHJ11e8faCRnpfdrfWMYNA6/g1FZnwcjVnGi8QOqDigaAYdrzILd81qANL7QEjewqgqOp83GHQ==","signatures":[{"sig":"MEYCIQC6tiFrWMCvW7xQNM4/Wgv9CV6NSQ4/uTP7pJkbcco37AIhAMPnoRMze7+CK0OdnD0Ng9SQZ1xtwxmMwbhf1XSHXx9A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86695},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"./vitest":{"types":"./dist/vitest.d.ts","default":"./dist/vitest.js"}},"gitHead":"7358a57400b97db525f454be4e644ef744b5e088","scripts":{"test":"bun test","build":"tsc && chmod +x dist/cli.js","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"hananinas","email":"hanani.nas@gmail.com"},"repository":{"url":"git+https://github.com/blop-oss/blop-app.git","type":"git","directory":"packages/ingest-client"},"_npmVersion":"10.9.4","description":"Universal test-result ingestion client for Blop Cloud. Emits CloudEvents (qa.run.started/step.finished/finished.v1) and uploads artifacts from any test runner — blop CLI, vitest, pytest, Go, or any framework that emits JUnit XML.","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.3","@types/node":"^22.15.18"},"peerDependencies":{"vitest":"^1.0.0 || ^2.0.0 || ^3.0.0"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ingest_0.1.0_1784824850950_0.2856195989843151","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@blopai/ingest","version":"0.1.1","keywords":["blop","testing","ingest","cloudevents","junit","vitest","ci","qa"],"license":"MIT","_id":"@blopai/ingest@0.1.1","maintainers":[{"name":"hananinas","email":"hanani.nas@gmail.com"}],"homepage":"https://github.com/blop-oss/blop-app/tree/main/packages/ingest-client#readme","bugs":{"url":"https://github.com/blop-oss/blop-app/issues"},"bin":{"blop-ingest":"dist/cli.js"},"dist":{"shasum":"09ce1c7bfb115f7f9e21a810e7209d54a4231582","tarball":"https://registry.npmjs.org/@blopai/ingest/-/ingest-0.1.1.tgz","fileCount":18,"integrity":"sha512-cezeC3bOcJSLucj4H38DlwNiD5kXfVzg/WLYyjqdBe6ppeNkDVM17OnFtdjnsTnmCU7ZbttMnpUXgNx8zVpYCw==","signatures":[{"sig":"MEYCIQDH69iVl0D2es035zzwATHCsLz1CUufKhVMMP7PrQ8qAAIhAMfZ1/zED6QTJf8LvgH69S3h+7sQmhCuzUnL96PS4D1b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86695},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"./vitest":{"types":"./dist/vitest.d.ts","default":"./dist/vitest.js"}},"gitHead":"5c7b48c5a5cf8c3a2add3df6888e8d29aaf0a75e","scripts":{"test":"bun test","build":"tsc && chmod +x dist/cli.js","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b188c519-4b26-440c-aa30-7d3406fc3dc6"}},"repository":{"url":"git+https://github.com/blop-oss/blop-app.git","type":"git","directory":"packages/ingest-client"},"_npmVersion":"11.5.1","description":"Universal test-result ingestion client for Blop Cloud. Emits CloudEvents (qa.run.started/step.finished/finished.v1) and uploads artifacts from any test runner — blop CLI, vitest, pytest, Go, or any framework that emits JUnit XML.","directories":{},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.3","@types/node":"^22.15.18"},"peerDependencies":{"vitest":"^1.0.0 || ^2.0.0 || ^3.0.0"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ingest_0.1.1_1784825346784_0.3889968409882443","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@blopai/ingest","version":"0.1.2","keywords":["blop","testing","ingest","cloudevents","junit","vitest","ci","qa"],"license":"MIT","_id":"@blopai/ingest@0.1.2","maintainers":[{"name":"hananinas","email":"hanani.nas@gmail.com"}],"homepage":"https://github.com/blop-oss/blop-app/tree/main/packages/ingest-client#readme","bugs":{"url":"https://github.com/blop-oss/blop-app/issues"},"bin":{"blop-ingest":"dist/cli.js"},"dist":{"shasum":"211731d0e42b9da753eeaa4ef4505be6fb71763d","tarball":"https://registry.npmjs.org/@blopai/ingest/-/ingest-0.1.2.tgz","fileCount":18,"integrity":"sha512-1SFSmc4o6TGhPmkubiKY3IesqpTHcszdX3DwKxK7g4GK4ot4bjuZbA3FMsgc55QmEnDF5xF3e9ycc4S2E8BFgw==","signatures":[{"sig":"MEYCIQCoZryD8aaE7yfpYaWmHII5xy/ZJ1Eu0wxSzhDNRqjfIgIhAPwuorSjf0/3/qiDYw5RU48/j8BJDMoeN7Np58h22pCv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87476},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"./vitest":{"types":"./dist/vitest.d.ts","default":"./dist/vitest.js"}},"gitHead":"8e397d9c3ae3ee0ec1c0b12ddf6a3718fe1e6e0b","scripts":{"test":"bun test","build":"tsc && chmod +x dist/cli.js","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b188c519-4b26-440c-aa30-7d3406fc3dc6"}},"repository":{"url":"git+https://github.com/blop-oss/blop-app.git","type":"git","directory":"packages/ingest-client"},"_npmVersion":"11.5.1","description":"Universal test-result ingestion client for Blop Cloud. Emits CloudEvents (qa.run.started/step.finished/finished.v1) and uploads artifacts from any test runner — blop CLI, vitest, pytest, Go, or any framework that emits JUnit XML.","directories":{},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","typescript":"^5.8.3","@types/node":"^22.15.18"},"peerDependencies":{"vitest":"^1.0.0 || ^2.0.0 || ^3.0.0"},"peerDependenciesMeta":{"vitest":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/ingest_0.1.2_1787701126044_0.9618864202573294","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@blopai/ingest","version":"0.2.0","description":"Universal test-result ingestion client for Blop Cloud. Emits CloudEvents (qa.run.started/step.finished/finished.v1) and uploads artifacts from any test runner — blop CLI, vitest, pytest, Go, or any framework that emits JUnit XML.","license":"MIT","type":"module","bin":{"blop-ingest":"dist/cli.js"},"exports":{".":{"types":"./dist/client.d.ts","default":"./dist/client.js"},"./vitest":{"types":"./dist/vitest.d.ts","default":"./dist/vitest.js"},"./classify":{"types":"./dist/classify.d.ts","default":"./dist/classify.js"}},"keywords":["blop","testing","ingest","cloudevents","junit","vitest","ci","qa"],"repository":{"type":"git","url":"git+https://github.com/blop-oss/blop-app.git","directory":"packages/ingest-client"},"homepage":"https://github.com/blop-oss/blop-app/tree/main/packages/ingest-client#readme","bugs":{"url":"https://github.com/blop-oss/blop-app/issues"},"scripts":{"typecheck":"tsc --noEmit","build":"tsc && chmod +x dist/cli.js","prepare":"tsc && chmod +x dist/cli.js","test":"bun test","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"devDependencies":{"@types/node":"^22.15.18","typescript":"^5.8.3","vitest":"^3.0.0"},"peerDependencies":{"vitest":"^1.0.0 || ^2.0.0 || ^3.0.0"},"peerDependenciesMeta":{"vitest":{"optional":true}},"engines":{"node":">=20"},"publishConfig":{"access":"public"},"_id":"@blopai/ingest@0.2.0","gitHead":"69a29eb567a15cab4b0a366a547462bbd93187e7","_nodeVersion":"22.14.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-pH1LGmCdxbmbtRPgeRcAQ2lUAGg2Ehucf6IcWViMn82yNUAhPY6w10u0fajw47t4HnOyMEFQYaKBCrZksuDHMg==","shasum":"c01a698f2c8cd80718e3735e421f9f2793f9c13b","tarball":"https://registry.npmjs.org/@blopai/ingest/-/ingest-0.2.0.tgz","fileCount":24,"unpackedSize":137754,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDwt3YMWMh6RQbF+EAgqNxHWgD6mnn5dJLF+P9VpcMtjQIhAPHw3zp8mHRFoiPqpyTvRe9POcMGY5NwMfD2kZ8q2YSn"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b188c519-4b26-440c-aa30-7d3406fc3dc6"}},"directories":{},"maintainers":[{"name":"hananinas","email":"hanani.nas@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ingest_0.2.0_1788379453847_0.8711064440779832"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-23T16:40:50.768Z","modified":"2026-09-02T20:04:14.180Z","0.1.0":"2026-07-23T16:40:51.111Z","0.1.1":"2026-07-23T16:49:06.978Z","0.1.2":"2026-08-25T23:38:46.217Z","0.2.0":"2026-09-02T20:04:14.001Z"},"bugs":{"url":"https://github.com/blop-oss/blop-app/issues"},"license":"MIT","homepage":"https://github.com/blop-oss/blop-app/tree/main/packages/ingest-client#readme","keywords":["blop","testing","ingest","cloudevents","junit","vitest","ci","qa"],"repository":{"type":"git","url":"git+https://github.com/blop-oss/blop-app.git","directory":"packages/ingest-client"},"description":"Universal test-result ingestion client for Blop Cloud. Emits CloudEvents (qa.run.started/step.finished/finished.v1) and uploads artifacts from any test runner — blop CLI, vitest, pytest, Go, or any framework that emits JUnit XML.","maintainers":[{"name":"hananinas","email":"hanani.nas@gmail.com"}],"readme":"# @blopai/ingest\n\nUniversal test-result ingestion client for [Blop](https://blop.ai) Cloud.\n\nEmits [CloudEvents](https://cloudevents.io) (`qa.run.started.v1`,\n`qa.run.step.finished.v1`, `qa.run.finished.v1`) and uploads artifacts via\npresigned URLs to the Blop platform — from **any** test runner.\n\n## Adapters\n\n- **blop CLI** — built-in (the `@blopai/cli` package uses this internally).\n- **Vitest** — `@blopai/ingest/vitest` reporter (see [Vitest integration](https://blop.ai/guides/vitest)).\n- **Any framework via JUnit XML** — `blop-ingest upload --junit report.xml`\n  works with pytest, Go, RSpec, PHPUnit, Jest, Mocha, Gradle, .NET, and more\n  (see [Any framework via JUnit](https://blop.ai/guides/junit-upload)).\n\n## Install\n\n```bash\npnpm add -D @blopai/ingest\n```\n\n## Quick start (Vitest)\n\n```ts\n// vitest.config.ts\nimport { defineConfig } from \"vitest/config\";\n\nexport default defineConfig({\n  test: {\n    reporters: [\"default\", \"@blopai/ingest/vitest\"],\n  },\n});\n```\n\n```yaml\n# .github/workflows/test.yml\n- run: pnpm test\n  env:\n    BLOP_INGEST_URL: ${{ vars.BLOP_INGEST_URL }}\n    BLOP_INGEST_SECRET: ${{ secrets.BLOP_INGEST_SECRET }}\n    BLOP_PROJECT_ID: ${{ vars.BLOP_PROJECT_ID }}\n```\n\n## Quick start (any framework via JUnit XML)\n\n```bash\npytest --junitxml=report.xml\nnpx @blopai/ingest upload --junit report.xml\n```\n\n## Environment variables\n\n| Variable | Required | Role |\n|----------|----------|------|\n| `BLOP_INGEST_URL` | yes | Platform ingest endpoint |\n| `BLOP_INGEST_SECRET` | yes | Per-project ingest secret |\n| `BLOP_PROJECT_ID` | yes | Project id |\n| `BLOP_RUN_ID` | no | Run id (auto-generated if unset) |\n| `BLOP_TRIGGER` | no | Trigger source (`ci` \\| `manual` \\| `schedule` \\| `healer_verify`) |\n\n## Programmatic API\n\n```ts\nimport { createIngestClient } from \"@blopai/ingest\";\n\nconst client = createIngestClient();\nif (client) {\n  await client.emitStarted();\n  await client.emitFinished({\n    status: \"failed\",\n    counts: { passed: 3, failed: 2, skipped: 1 },\n  tests: [\n    { suite: \"checkout\", classname: \"tests/checkout.py\", name: \"test_guest\", status: \"passed\", duration_ms: 120 },\n    { suite: \"checkout\", classname: \"tests/checkout.py\", name: \"test_card\", status: \"failed\", message: \"AssertionError\" },\n  ],\n    durationMs: 5000,\n    topFailures: [{ test_file: \"tests/auth.test.ts\", message: \"login failed\" }],\n  });\n}\n```\n\nWhen config is missing, `createIngestClient()` returns `null` — callers\nshould treat upload as skipped, not an error.\n\n## License\n\nMIT","readmeFilename":"README.md"}