{"_id":"@remix-run/assert","_rev":"7-ba8d643ff686061c1c2cf12f568454c0","name":"@remix-run/assert","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.0":{"name":"@remix-run/assert","version":"0.0.0","license":"MIT","_id":"@remix-run/assert@0.0.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"41532b5120f7c20a088cf9401f31a83cbdfcbffe","tarball":"https://registry.npmjs.org/@remix-run/assert/-/assert-0.0.0.tgz","fileCount":2,"integrity":"sha512-CJyv0VteWpWFQxx+icEHvz3BT38JXvFoJwclFdKjhLaB6t2YEUc/hxbP4kIhpsL+CJ2I9UxNSMkq4VkNsAt0Uw==","signatures":[{"sig":"MEUCIQCYfi0LhRLcwzEM89N7GCCTJG1Amd3ZM/VsOZ3Y0xRCWgIgUhi0CpYsQQTQfmquv8ZTx8Bn5xncjU8g9o+ALo8HFWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":459},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/assert"},"_npmVersion":"11.12.1","description":"Placeholder package for Remix CI/OIDC setup","directories":{},"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/assert_0.0.0_1776815449150_0.3071912263225005","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@remix-run/assert","version":"0.1.0","keywords":["assert","assertions","remix","testing"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/assert@0.1.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/assert#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"ce70429710036968e2be3b7f080e717644b1fe73","tarball":"https://registry.npmjs.org/@remix-run/assert/-/assert-0.1.0.tgz","fileCount":11,"integrity":"sha512-O1iWBv1W+q996h2WvxumWddOdLWwuE+FNYHOGNWGcoa0JJ3WS7WmGbeA6NkrAmMhzwkkNS2/9ezkFBSlDiLmvw==","signatures":[{"sig":"MEYCIQCkofIXiUNCpJ1rUK5WyvQ78FNL6dmTqB8OtHi4ySxClQIhAM6wc9k8eBtDqYjucWfW+zTX+ucKxpAJzUOxJFp6MhiS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fassert@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":33542},"type":"module","_from":"file:remix-run-assert-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f7af6643-9144-4188-a219-aa78e1b4b2af"}},"_resolved":"/tmp/9a7b58b096c9a3aef9f1d385217f87b2/remix-run-assert-0.1.0.tgz","_integrity":"sha512-O1iWBv1W+q996h2WvxumWddOdLWwuE+FNYHOGNWGcoa0JJ3WS7WmGbeA6NkrAmMhzwkkNS2/9ezkFBSlDiLmvw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/assert"},"_npmVersion":"11.12.1","description":"Assertion utilities for Remix","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.1.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/assert_0.1.0_1776904633760_0.5933232125042351","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@remix-run/assert","version":"0.2.0","keywords":["assert","assertions","remix","testing"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/assert@0.2.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/assert#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"ca8f8ca500d58bac7f216b84fc41a6cf06612ba8","tarball":"https://registry.npmjs.org/@remix-run/assert/-/assert-0.2.0.tgz","fileCount":15,"integrity":"sha512-SNfcxPQstoIBr/hbRSsTYLNnmIXMgiL4cY8o5HH9PE7Ue/NQcIwqNJtvV0xVrk3pY/ywxHhAwSl2V8ao1Is9Cg==","signatures":[{"sig":"MEUCIQClVuJAuJuoQCoD9sHjlWGrVqNQxlX0XuJHUEL3rFuz6QIgM7dUSKAlbZ3VEy0MS6SmRSKA/VKzYHDPWewacjjH9/o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fassert@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":79751},"type":"module","_from":"file:remix-run-assert-0.2.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f7af6643-9144-4188-a219-aa78e1b4b2af"}},"_resolved":"/tmp/df57e1bc018fae7e1755ca99e69f3eb8/remix-run-assert-0.2.0.tgz","_integrity":"sha512-SNfcxPQstoIBr/hbRSsTYLNnmIXMgiL4cY8o5HH9PE7Ue/NQcIwqNJtvV0xVrk3pY/ywxHhAwSl2V8ao1Is9Cg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/assert"},"_npmVersion":"11.11.0","description":"Node assert-compatible utilities for any JavaScript environment","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/assert_0.2.0_1777576228906_0.9964140495463327","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@remix-run/assert","version":"0.2.1","keywords":["assert","assertions","remix","testing"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/assert@0.2.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/assert#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"7a26f856d1472d93f9fba74a64c4b6d8f65680cc","tarball":"https://registry.npmjs.org/@remix-run/assert/-/assert-0.2.1.tgz","fileCount":15,"integrity":"sha512-jHoxChSCIbueiED3ZeMqWGNZMVYFN/7Eo51PkID174dPloRHeXLL7Kj9Ck1phtXPalEyofzWsxdWwKUnQYHzCw==","signatures":[{"sig":"MEQCIA+IbZ8S33jsB7l1J2wYyAcdB1cV6qE5oqCCAc5c4qf9AiByY3Pn4cZVPi4qN+wOzS6wEhI2MK1+0aT6XylJRRsUwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fassert@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":80883},"type":"module","_from":"file:remix-run-assert-0.2.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f7af6643-9144-4188-a219-aa78e1b4b2af"}},"_resolved":"/tmp/8ca1e4aca111b89d02f8612ef5611064/remix-run-assert-0.2.1.tgz","_integrity":"sha512-jHoxChSCIbueiED3ZeMqWGNZMVYFN/7Eo51PkID174dPloRHeXLL7Kj9Ck1phtXPalEyofzWsxdWwKUnQYHzCw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/assert"},"_npmVersion":"11.12.1","description":"Node assert-compatible utilities for any JavaScript environment","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/assert_0.2.1_1779308171367_0.8416861811247283","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@remix-run/assert","version":"0.3.0","keywords":["assert","assertions","remix","testing"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/assert@0.3.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/assert#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"d2a4d5bf6b68d09168dcd02b2d13a54b4fcb81b6","tarball":"https://registry.npmjs.org/@remix-run/assert/-/assert-0.3.0.tgz","fileCount":19,"integrity":"sha512-GBA9klvJdG5YSTwRNur54LQcfqDOtir+x1TDbv3dzB9FS2Li9CEiRLp1EpBcaYrj4ByO03WJCWFBiY8bTMy4vQ==","signatures":[{"sig":"MEYCIQCqshn8wgg1CBCbpCUvnUZ5L/rjvDvYmie9vJxMzS3GMwIhALk3N9tvxiGj+MyINnDyPXbnV0R04cjeXwwzTGolvaZh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fassert@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":133900},"type":"module","_from":"file:remix-run-assert-0.3.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:f7af6643-9144-4188-a219-aa78e1b4b2af"}},"_resolved":"/tmp/a090f933e86f06d552e3528c88d58054/remix-run-assert-0.3.0.tgz","_integrity":"sha512-GBA9klvJdG5YSTwRNur54LQcfqDOtir+x1TDbv3dzB9FS2Li9CEiRLp1EpBcaYrj4ByO03WJCWFBiY8bTMy4vQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/assert"},"_npmVersion":"11.13.0","description":"Node assert-compatible utilities for any JavaScript environment","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/assert_0.3.0_1780683900809_0.9489042665990663","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@remix-run/assert","version":"0.3.1","keywords":["assert","assertions","remix","testing"],"author":{"name":"Shopify Inc."},"license":"MIT","_id":"@remix-run/assert@0.3.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/assert#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"78dce13c92229e6a95a0f4357b465f66f98105f3","tarball":"https://registry.npmjs.org/@remix-run/assert/-/assert-0.3.1.tgz","fileCount":19,"integrity":"sha512-+qJFbRzc3TeK5E5DUxuHVrukwpJjmpyPxOMjc371Z+X3zuyf11q/yvWZc3YJH/gOxll467azPmDs6PNgQk3Fgg==","signatures":[{"sig":"MEQCIHTyupDLrop/ME/sjnLF4cZ0VP517hjkyyOQByDro9haAiAYIjoWeTNlILk7/tuUUYd+27um4GKnqH/TVaderc8gpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDvATUUDxzhiEfD6hLT0HK/xvPmHkeeg+8MXfypDJ/YawIgVWX3GcNIQPLUPnEgGIMxcahoC5oKdlzHfZSxalm3SEA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fassert@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":133882},"type":"module","_from":"file:/tmp/remix-publish-assert-S2aa11/remix-run-assert-0.3.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"f7af6643-9144-4188-a219-aa78e1b4b2af"}},"_resolved":"/tmp/remix-publish-assert-S2aa11/remix-run-assert-0.3.1.tgz","_integrity":"sha512-+qJFbRzc3TeK5E5DUxuHVrukwpJjmpyPxOMjc371Z+X3zuyf11q/yvWZc3YJH/gOxll467azPmDs6PNgQk3Fgg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/assert"},"_npmVersion":"11.19.0","description":"Node assert-compatible utilities for any JavaScript environment","directories":{},"sideEffects":false,"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0"},"_npmOperationalInternal":{"tmp":"tmp/assert_0.3.1_1790631656663_0.3231960209454485","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"_id":"@remix-run/assert@1.0.0","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"b58a5a5bdec40844321170b981339f86558fa6c5","tarball":"https://registry.npmjs.org/@remix-run/assert/-/assert-1.0.0.tgz","fileCount":19,"integrity":"sha512-ygVYpSz7uc7Wg72Ty0rN29J9Qtna30BVwwHF8K/M8WcSt28peoe8jRAAivUQe+7haSizemwUL3E7UxTCBycW9w==","signatures":[{"sig":"MEUCIQCUbf6KLS8HVEjzSxKAA1gLtaFdJ7JCjGSu6owBOokSHgIgBFM4ea1IFAUpENVsuAxMayCZel02f1k/8jGZfNJVd3U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDbj3PXPzyslXOnso9UvkVitTdeylO2N/jZpiEghOUrZgIgJAT+svI3NTrFskxFBihOQss3TDtUavHB+bhtEVR3R1A="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2fassert@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":133882},"name":"@remix-run/assert","type":"module","_from":"file:/tmp/remix-publish-assert-7cJqW9/remix-run-assert-1.0.0.tgz","author":{"name":"Shopify Inc."},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"license":"MIT","scripts":{"test":"node --test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun test","typecheck":"tsc --noEmit"},"version":"1.0.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"f7af6643-9144-4188-a219-aa78e1b4b2af"}},"homepage":"https://github.com/remix-run/remix/tree/main/packages/assert#readme","keywords":["assert","assertions","remix","testing"],"_resolved":"/tmp/remix-publish-assert-7cJqW9/remix-run-assert-1.0.0.tgz","_integrity":"sha512-ygVYpSz7uc7Wg72Ty0rN29J9Qtna30BVwwHF8K/M8WcSt28peoe8jRAAivUQe+7haSizemwUL3E7UxTCBycW9w==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/assert"},"_npmVersion":"11.19.0","description":"Node assert-compatible utilities for any JavaScript environment","directories":{},"maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/assert_1.0.0_1790895281668_0.15462773510040595"}}},"time":{"created":"2026-04-21T23:50:49.022Z","modified":"2026-10-01T22:54:42.100Z","0.0.0":"2026-04-21T23:50:49.287Z","0.1.0":"2026-04-23T00:37:13.902Z","0.2.0":"2026-04-30T19:10:29.053Z","0.2.1":"2026-05-20T20:16:11.563Z","0.3.0":"2026-06-05T18:25:00.944Z","0.3.1":"2026-09-28T21:40:56.744Z","1.0.0":"2026-10-01T22:54:41.760Z"},"bugs":{"url":"https://github.com/remix-run/remix/issues"},"author":{"name":"Shopify Inc."},"license":"MIT","homepage":"https://github.com/remix-run/remix/tree/main/packages/assert#readme","keywords":["assert","assertions","remix","testing"],"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/assert"},"description":"Node assert-compatible utilities for any JavaScript environment","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"readme":"# assert\n\nA compatible subset of `node:assert/strict` that works in any JavaScript environment, including browsers — plus a vitest-/jest-style `expect` API for tests that prefer chainable matchers.\n\nUses strict equality (`Object.is`) for all comparisons — no type coercion.\n\n## Features\n\n- `AssertionError` — compatible with `node:assert.AssertionError` (`actual`, `expected`, `operator`, `name`)\n- `assert.ok` — truthy check\n- `assert.equal` / `assert.notEqual` — strict equality (`Object.is` / `!Object.is`)\n- `assert.deepEqual` / `assert.partialDeepEqual` / `assert.notDeepEqual` — recursive strict deep equality\n- `assert.match` — string matches a regexp\n- `assert.fail` — unconditional failure\n- `assert.throws` — synchronous throw assertion with optional error validation\n- `assert.rejects` — async rejection assertion with optional error validation\n- `expect(value)` — chainable matchers with `.not`, `.rejects`, `.resolves`, plus `expect.objectContaining(...)` for partial matches\n\n## Installation\n\n```sh\nnpm i remix\n```\n\n## Usage\n\nMirrors `node:assert/strict` — uses strict equality (`Object.is`), so `1 !== '1'`, `null !== undefined`, `NaN` equals `NaN`, and `0` does not equal `-0`.\n\n```ts\nimport assert from 'remix/assert'\n\nassert.ok(true)\nassert(true)\nassert.equal(1, 1)\nassert.equal(1, '1') // throws — different types\nassert.equal(NaN, NaN)\nassert.notEqual('a', 'b')\nassert.deepEqual({ a: 1 }, { a: 1 })\nassert.deepEqual({ a: 1 }, { a: '1' }) // throws — different types\nassert.partialDeepEqual({ a: 1, b: 2 }, { a: 1 })\nassert.match('hello world', /world/)\nassert.fail('should not reach here')\n\nawait assert.rejects(() => Promise.reject(new Error('oops')))\nassert.throws(() => {\n  throw new TypeError('bad')\n}, TypeError)\n\nassert.throws(\n  () => {\n    let error = new Error('Invalid value') as Error & { code: string }\n    error.code = 'ERR_INVALID_ARG_VALUE'\n    throw error\n  },\n  { code: 'ERR_INVALID_ARG_VALUE', message: /Invalid value/ },\n)\n```\n\n### Named exports\n\nEach assertion is also exported as a named function:\n\n```ts\nimport {\n  ok,\n  assert, // alias of ok()\n  equal,\n  notEqual,\n  deepEqual,\n  partialDeepEqual,\n  notDeepEqual,\n  match,\n  doesNotMatch,\n  fail,\n  throws,\n  doesNotThrow,\n  rejects,\n  doesNotReject,\n} from 'remix/assert'\n```\n\n### `expect`\n\nA vitest-/jest-style chainable matcher API on top of the same `AssertionError`. Use `.not` to negate, `.rejects` / `.resolves` to assert on a promise. Mock-aware matchers work with `mock.fn()` / `mock.method()` from `remix/test`.\n\n```ts\nimport { expect } from 'remix/assert'\n\nexpect(value).toBe(42)\nexpect({ a: 1, b: 2 }).toEqual({ a: 1, b: 2 })\nexpect({ a: 1, b: 2 }).toEqual(expect.objectContaining({ a: 1 }))\nexpect({ a: { b: 1, c: 2 } }).toMatchObject({ a: { b: 1 } })\nexpect(value).not.toBeNull()\nexpect(arr).toHaveLength(3)\nexpect(spy).toHaveBeenCalledWith('hello', 1)\n\nawait expect(fetch('/missing')).rejects.toThrow('Not found')\nawait expect(loadModule()).resolves.toBeUndefined()\n```\n\nAvailable matchers:\n\n| Group           | Matchers                                                                                                                 |\n| --------------- | ------------------------------------------------------------------------------------------------------------------------ |\n| Equality        | `toBe`, `toEqual`, `toBeNull`, `toBeUndefined`, `toBeDefined`, `toBeTruthy`, `toBeInstanceOf`                            |\n| Numbers         | `toBeGreaterThan`, `toBeGreaterThanOrEqual`, `toBeLessThan`, `toBeLessThanOrEqual`, `toBeCloseTo`                        |\n| String/iterable | `toContain`, `toMatch`, `toHaveLength`                                                                                   |\n| Object shape    | `toHaveProperty(path, value?)`, `toMatchObject(partial)`                                                                 |\n| Throwing        | `toThrow(expected?)`                                                                                                     |\n| Mock-aware      | `toHaveBeenCalled`, `toHaveBeenCalledTimes(n)`, `toHaveBeenCalledWith(...args)`, `toHaveBeenNthCalledWith(nth, ...args)` |\n\n`expect.objectContaining(partial)` is an asymmetric matcher recognized by `toEqual` (and any matcher that uses deep equality under the hood). It passes when the actual value has at least the keys in `partial` with matching values — extra keys are allowed.\n\n## License\n\nSee [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)\n","readmeFilename":"README.md"}