{"_id":"@bozonx/social-posting-conformance","_rev":"4-5b9251e01a60a012374ce71d8875a209","name":"@bozonx/social-posting-conformance","dist-tags":{"latest":"0.8.0"},"versions":{"0.4.0":{"name":"@bozonx/social-posting-conformance","version":"0.4.0","keywords":["social-media","posting","testing","contract-tests"],"author":"Ivan K","license":"MIT","_id":"@bozonx/social-posting-conformance@0.4.0","maintainers":[{"name":"bozonx","email":"ipkozyrin@gmail.com"}],"homepage":"https://github.com/bozonx/social-media-posting/tree/main/packages/conformance#readme","bugs":{"url":"https://github.com/bozonx/social-media-posting/issues"},"dist":{"shasum":"60b797b1985dca9a1a053b880e233259d877ce36","tarball":"https://registry.npmjs.org/@bozonx/social-posting-conformance/-/social-posting-conformance-0.4.0.tgz","fileCount":12,"integrity":"sha512-mbSKwTbWbGrQanX6nTaYUS1NtkdFA6uo1ItV1kR7ACgQse6WUXePYLeTOMh9b5mdPGymL4tz67h3dCtWf4gXIg==","signatures":[{"sig":"MEUCIQDUJeanHHbkecoEkxtEpJG62/RPkAe5/5Gf3MW5BTsCnwIgQkM4V67Ewjj/P4oFRRSZBGt/2eIQS6ANHyNKgyasGdM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29876},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","workerd":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"bozonx","email":"ipkozyrin@gmail.com"},"repository":{"url":"git+https://github.com/bozonx/social-media-posting.git","type":"git","directory":"packages/conformance"},"description":"Contract test suite every @bozonx/social-posting platform must pass","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@bozonx/social-posting":"0.4.0"},"peerDependencies":{"vitest":">=3","@bozonx/social-posting":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/social-posting-conformance_0.4.0_1787264532493_0.809360134472425","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@bozonx/social-posting-conformance","version":"0.5.1","keywords":["social-media","posting","testing","contract-tests"],"author":"Ivan K","license":"MIT","_id":"@bozonx/social-posting-conformance@0.5.1","maintainers":[{"name":"bozonx","email":"ipkozyrin@gmail.com"}],"homepage":"https://github.com/bozonx/social-media-posting/tree/main/packages/conformance#readme","bugs":{"url":"https://github.com/bozonx/social-media-posting/issues"},"dist":{"shasum":"eb79e80155d5929e4efbca5c68df4aeb6023a3fe","tarball":"https://registry.npmjs.org/@bozonx/social-posting-conformance/-/social-posting-conformance-0.5.1.tgz","fileCount":12,"integrity":"sha512-qA7gKog3wTJIBhNk/Iv7i0uoy4qFTz9EkGAKTGUNwSYg0vcjeKkadaM8dkBbs9L/h5IzbffgA1Wka0ufIw7L2g==","signatures":[{"sig":"MEUCIQCaHBSTbP59XiIP6Od1HX1udnzq68+TCYxOhfbx554N7wIgO2qeppjFRxZ4Q20DvWsKSv/73MfF0cBTnXwvSmeD7dg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29876},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","workerd":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"bozonx","email":"ipkozyrin@gmail.com"},"repository":{"url":"git+https://github.com/bozonx/social-media-posting.git","type":"git","directory":"packages/conformance"},"description":"Contract test suite every @bozonx/social-posting platform must pass","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@bozonx/social-posting":"0.5.1"},"peerDependencies":{"vitest":">=3","@bozonx/social-posting":"^0.5.1"},"_npmOperationalInternal":{"tmp":"tmp/social-posting-conformance_0.5.1_1787267091240_0.31524047635030517","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@bozonx/social-posting-conformance","version":"0.7.0","keywords":["social-media","posting","testing","contract-tests"],"author":"Ivan K","license":"MIT","_id":"@bozonx/social-posting-conformance@0.7.0","maintainers":[{"name":"bozonx","email":"ipkozyrin@gmail.com"}],"homepage":"https://github.com/bozonx/social-media-posting/tree/main/packages/conformance#readme","bugs":{"url":"https://github.com/bozonx/social-media-posting/issues"},"dist":{"shasum":"1773cfa3f033abb8aae0b90273d0932883a5f7df","tarball":"https://registry.npmjs.org/@bozonx/social-posting-conformance/-/social-posting-conformance-0.7.0.tgz","fileCount":12,"integrity":"sha512-WHYsSJV87h3KOsnZOrSHg0YLxXxzAr7Ia+9VRylUy8deKF2xn4vHRadMYv66iL7PVqjJ/IkMqLF5Bgb+mZRZ1A==","signatures":[{"sig":"MEUCIQCOve0v7TMQSzngtxyl89PY5tdMchao3GdiPHQz6cKAtAIgFLCD1taiEqB/AZzpzgNIsM6Y39pxNTQ+/ZXNvBPa0iA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29876},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","workerd":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"bozonx","email":"ipkozyrin@gmail.com"},"repository":{"url":"git+https://github.com/bozonx/social-media-posting.git","type":"git","directory":"packages/conformance"},"description":"Contract test suite every @bozonx/social-posting platform must pass","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@bozonx/social-posting":"0.7.0"},"peerDependencies":{"vitest":">=3","@bozonx/social-posting":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/social-posting-conformance_0.7.0_1788032539500_0.27157773743394964","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@bozonx/social-posting-conformance","version":"0.8.0","description":"Contract test suite every @bozonx/social-posting platform must pass","keywords":["social-media","posting","testing","contract-tests"],"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","workerd":"./dist/index.js","import":"./dist/index.js","default":"./dist/index.js"}},"dependencies":{},"peerDependencies":{"vitest":">=3","@bozonx/social-posting":"^0.8.0"},"devDependencies":{"vitest":"^4.1.11","@bozonx/social-posting":"0.8.0"},"repository":{"type":"git","url":"git+https://github.com/bozonx/social-media-posting.git","directory":"packages/conformance"},"bugs":{"url":"https://github.com/bozonx/social-media-posting/issues"},"homepage":"https://github.com/bozonx/social-media-posting/tree/main/packages/conformance#readme","publishConfig":{"access":"public","provenance":true},"sideEffects":false,"author":"Ivan K","license":"MIT","engines":{"node":">=24.0.0"},"scripts":{"build":"tsc -p tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_nodeVersion":"24.19.0","_id":"@bozonx/social-posting-conformance@0.8.0","dist":{"integrity":"sha512-KOv+NEF451MfNnMlkwQGj21mGr1UBwbbxb2aY0dBdejv1JAcQKMGvu37L6DkQphtTXY3cXYSQXDWCuAiU1OeoQ==","shasum":"8e55bcc913a4900c408ebb202fa81ba3da44099a","tarball":"https://registry.npmjs.org/@bozonx/social-posting-conformance/-/social-posting-conformance-0.8.0.tgz","fileCount":12,"unpackedSize":35816,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC53FQodkpIFQ2lS0PIncxkoMXjAexYRXJy1jj5c/OORgIhANNaMlTEta8Nbua+aomEZRiyTGo5EpPKu3RlrpziI6Gw"}]},"_npmUser":{"name":"bozonx","email":"ipkozyrin@gmail.com"},"directories":{},"maintainers":[{"name":"bozonx","email":"ipkozyrin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/social-posting-conformance_0.8.0_1788181097298_0.8927703599129051"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-20T22:22:12.318Z","modified":"2026-08-31T12:58:19.728Z","0.4.0":"2026-08-20T22:22:12.738Z","0.5.1":"2026-08-20T23:04:51.386Z","0.7.0":"2026-08-29T19:42:19.617Z","0.8.0":"2026-08-31T12:58:17.436Z"},"bugs":{"url":"https://github.com/bozonx/social-media-posting/issues"},"author":"Ivan K","license":"MIT","homepage":"https://github.com/bozonx/social-media-posting/tree/main/packages/conformance#readme","keywords":["social-media","posting","testing","contract-tests"],"repository":{"type":"git","url":"git+https://github.com/bozonx/social-media-posting.git","directory":"packages/conformance"},"description":"Contract test suite every @bozonx/social-posting platform must pass","maintainers":[{"name":"bozonx","email":"ipkozyrin@gmail.com"}],"readme":"# @bozonx/social-posting-conformance\n\nThe contract suite every `@bozonx/social-posting` platform must pass.\n\nAdding a social network is meant to be \"implement `IPlatform`, describe the network in a\n`PlatformCapabilities`, and run this\". Publish a package that passes the suite and the network is\ndone — including networks maintained outside this repository.\n\n```ts\nimport { describePlatformContract } from '@bozonx/social-posting-conformance';\nimport { mastodon } from '../src/index.js';\n\ndescribePlatformContract({\n  module: mastodon,\n  createHarness,          // installs a transport double; only you know your endpoints\n  requests: { post: … },  // one valid request per declared post type\n  errorCases: [ … ],      // recorded failures and the classification each must produce\n  resumable: { … },       // for networks whose publication takes several calls\n});\n```\n\n## What it checks\n\n- Every post type the descriptor declares round-trips.\n- Declared limits are enforced locally, without a wasted API call.\n- Each recorded failure maps to the right `ErrorCode` with the right `retryable`, `retryAfterMs`\n  and `httpStatus` — the fields a host's backoff actually reads.\n- An already-aborted signal makes no API call; an abort mid-flight stops the publication.\n- Publishing mutates no global state and writes to no ambient logger.\n- Preview agrees with publish about what is valid.\n- An interrupted multi-step publication resumes from its `ResumeHandle` rather than restarting —\n  which is what would otherwise upload a second file and create a second post.\n\nSee `CONTRIBUTING-PLATFORMS.md` in the repository for the full walkthrough.\n","readmeFilename":""}