{"_id":"@anteros/sdk","_rev":"8-644f176eea0747553ad382f83c930c70","name":"@anteros/sdk","dist-tags":{"latest":"0.0.8"},"versions":{"0.0.1":{"name":"@anteros/sdk","version":"0.0.1","_id":"@anteros/sdk@0.0.1","maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"dist":{"shasum":"0128968430f9a0305f73209796e4472007b9dc93","tarball":"https://registry.npmjs.org/@anteros/sdk/-/sdk-0.0.1.tgz","fileCount":8,"integrity":"sha512-yHSnjuSvCMBzh6H0dsy0HosnAiGNZipONGZMnsbSvEAmpL6m63+cLX7VgZDSxdW8qTSeDlZxUOOJZjUJ7kvRdA==","signatures":[{"sig":"MEQCIGn3gh63vySIAg/bfmwOkPj/DcQvtysnxiphSIt/SGN7AiBTZ+20fUY4DJCE/EAS8XFKhVcVk+fqapN4W4svSMlXFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24595},"type":"module","module":"index.ts","shasum":"0128968430f9a0305f73209796e4472007b9dc93","private":false,"_npmUser":{"name":"dnaxio","email":"git@dnax.io"},"_integrity":"sha512-yHSnjuSvCMBzh6H0dsy0HosnAiGNZipONGZMnsbSvEAmpL6m63+cLX7VgZDSxdW8qTSeDlZxUOOJZjUJ7kvRdA==","_npmVersion":"10.8.3","description":"Anteros SDK","directories":{},"_nodeVersion":"24.3.0","dependencies":{"qs":"^6.15.0","ufo":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.0.1_1781910936907_0.4036879179728161","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@anteros/sdk","version":"0.0.2","_id":"@anteros/sdk@0.0.2","maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"dist":{"shasum":"35930bacb7a07b6d84a2be5e58c6fae324567220","tarball":"https://registry.npmjs.org/@anteros/sdk/-/sdk-0.0.2.tgz","fileCount":8,"integrity":"sha512-N8kM9oiUisQQBMkBG6NeoovDY/5ZikcM0J06pq5V3pF5tCwdzjnQD9YfZNU/hQcj6xC7wz3YfHV70B+W3+ck7Q==","signatures":[{"sig":"MEQCICi9VPUQnFGXmIGB/ExUgkSnP8tSDCOcl5486ixjaCPfAiAdOzMDT3dqdcLJHv4iKWEyhSzVUrZicXHqD3OxWL18Zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24712},"type":"module","module":"index.ts","shasum":"35930bacb7a07b6d84a2be5e58c6fae324567220","private":false,"_npmUser":{"name":"dnaxio","email":"git@dnax.io"},"_integrity":"sha512-N8kM9oiUisQQBMkBG6NeoovDY/5ZikcM0J06pq5V3pF5tCwdzjnQD9YfZNU/hQcj6xC7wz3YfHV70B+W3+ck7Q==","_npmVersion":"10.8.3","description":"Anteros SDK","directories":{},"_nodeVersion":"24.3.0","dependencies":{"qs":"^6.15.0","ufo":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.0.2_1781964575215_0.3817663536398297","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@anteros/sdk","version":"0.0.3","_id":"@anteros/sdk@0.0.3","maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"dist":{"shasum":"320761c1af7fae66b6ad8d995b481aec0c0d2eef","tarball":"https://registry.npmjs.org/@anteros/sdk/-/sdk-0.0.3.tgz","fileCount":8,"integrity":"sha512-GpJrT/HVQZtMu8EX5NzoELhVFJB12UoNPjFk39DDn+ZHXyOebGwGjX4KG/V9ncyYwcEYqsECxN30PWA0GxVErg==","signatures":[{"sig":"MEQCIBOI2a02/ruLExP4iRh9jcSkbORxEZaBGyfbvJjDbCo8AiAtYK48uSStIAN+I/TPyNMOWf748XAvy9tWmDZU9VuivQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24757},"type":"module","module":"index.ts","shasum":"320761c1af7fae66b6ad8d995b481aec0c0d2eef","private":false,"_npmUser":{"name":"dnaxio","email":"git@dnax.io"},"_integrity":"sha512-GpJrT/HVQZtMu8EX5NzoELhVFJB12UoNPjFk39DDn+ZHXyOebGwGjX4KG/V9ncyYwcEYqsECxN30PWA0GxVErg==","_npmVersion":"10.8.3","description":"Anteros SDK","directories":{},"_nodeVersion":"24.3.0","dependencies":{"qs":"^6.15.0","ufo":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.0.3_1783336896589_0.9264606428945874","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@anteros/sdk","version":"0.0.4","_id":"@anteros/sdk@0.0.4","maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"dist":{"shasum":"768f78c34e4dff82d748163c5fe23e60279861da","tarball":"https://registry.npmjs.org/@anteros/sdk/-/sdk-0.0.4.tgz","fileCount":8,"integrity":"sha512-RdKHL6OfwGsOMImGa6PRfbvH4iMC5wVnwFKSEJk6AcIT8ZCrboRA/FX6omU5qgXp5f7j1BT/lC7+1Q+An3U/XQ==","signatures":[{"sig":"MEUCIHEtwASxeeSlzatx+ql6fqpxWgt5HjFFWAR1pLE4P8MHAiEAiovVD/n7YOfJke85AWemiihZb4txzvrgfDwbB0J8+dY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24911},"type":"module","module":"index.ts","shasum":"768f78c34e4dff82d748163c5fe23e60279861da","private":false,"_npmUser":{"name":"dnaxio","email":"git@dnax.io"},"_integrity":"sha512-RdKHL6OfwGsOMImGa6PRfbvH4iMC5wVnwFKSEJk6AcIT8ZCrboRA/FX6omU5qgXp5f7j1BT/lC7+1Q+An3U/XQ==","_npmVersion":"10.8.3","description":"Anteros SDK","directories":{},"_nodeVersion":"24.3.0","dependencies":{"qs":"^6.15.0","ufo":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.0.4_1784137947130_0.35038446880119145","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@anteros/sdk","version":"0.0.5","_id":"@anteros/sdk@0.0.5","maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"dist":{"shasum":"683c21d63af2943ea3b7d68cf0c2983cf70c07c8","tarball":"https://registry.npmjs.org/@anteros/sdk/-/sdk-0.0.5.tgz","fileCount":8,"integrity":"sha512-UFdf+gbVE7YxRWMkjCAXej5LqQz/KBBtwDRsrFXLobpTfy7Edda4s9bie5OFp12Dy8OJJBs96nXcQomySZyg0g==","signatures":[{"sig":"MEUCIB2ZI7C5LO1agUO2mUGPcHe26T3JDcKSIKQWfZGEFaZeAiEAslkyJldDksCLhRbQ3hZS0Iy//ezzQEQvbQr6Y6aS6+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26416},"type":"module","module":"index.ts","shasum":"683c21d63af2943ea3b7d68cf0c2983cf70c07c8","private":false,"_npmUser":{"name":"dnaxio","email":"git@dnax.io"},"_integrity":"sha512-UFdf+gbVE7YxRWMkjCAXej5LqQz/KBBtwDRsrFXLobpTfy7Edda4s9bie5OFp12Dy8OJJBs96nXcQomySZyg0g==","_npmVersion":"10.8.3","description":"Anteros SDK","directories":{},"_nodeVersion":"24.3.0","dependencies":{"qs":"^6.15.0","ufo":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.0.5_1785925463722_0.8796697554605242","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@anteros/sdk","version":"0.0.6","_id":"@anteros/sdk@0.0.6","maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"dist":{"shasum":"a3936e4fb9996893fcfa2f08aab79a3b26f5e874","tarball":"https://registry.npmjs.org/@anteros/sdk/-/sdk-0.0.6.tgz","fileCount":7,"integrity":"sha512-m2cYMLR1qSyvOqE32aaq9ofGGzDxjrhE1MEjchz09CSTw7f4d6VdeBw725YTfVmp78Ry3wnELjadouSGX7gKHQ==","signatures":[{"sig":"MEQCIHhp0hPFhMXxrpblHpZGEc632b5gbe4YbYO6QL13/ZcpAiA5EGBypt1yaEdAWRHnoDMV7QGcAVe4AOhcRgj54kKtIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24974},"main":"index.ts","type":"module","module":"index.ts","shasum":"a3936e4fb9996893fcfa2f08aab79a3b26f5e874","private":false,"_npmUser":{"name":"dnaxio","email":"git@dnax.io"},"_integrity":"sha512-m2cYMLR1qSyvOqE32aaq9ofGGzDxjrhE1MEjchz09CSTw7f4d6VdeBw725YTfVmp78Ry3wnELjadouSGX7gKHQ==","_npmVersion":"10.8.3","description":"Anteros SDK","directories":{},"_nodeVersion":"24.3.0","dependencies":{"ufo":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.0.6_1785925730880_0.24494642402405842","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@anteros/sdk","version":"0.0.7","_id":"@anteros/sdk@0.0.7","maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"dist":{"shasum":"c8c6eebac6e8a42232aae8658720965fc9cc7d36","tarball":"https://registry.npmjs.org/@anteros/sdk/-/sdk-0.0.7.tgz","fileCount":7,"integrity":"sha512-riuwGZGKK1iPL8WIEYLehMhRKgxcbE8UcgRS25jkFY9+a6FEQulE/XMRb1JopsUEkWn+KvO9MKLztS4iQjbl+g==","signatures":[{"sig":"MEQCIBjKyqQiAb9BmkWem8BTN0PJ4kuUolTnOWqZwbhw8TeyAiB78MTRz75R7h1d5BoVI+LqP6F82IPSXnZy0VKicSLVJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25731},"main":"index.ts","type":"module","module":"index.ts","shasum":"c8c6eebac6e8a42232aae8658720965fc9cc7d36","private":false,"_npmUser":{"name":"dnaxio","email":"git@dnax.io"},"_integrity":"sha512-riuwGZGKK1iPL8WIEYLehMhRKgxcbE8UcgRS25jkFY9+a6FEQulE/XMRb1JopsUEkWn+KvO9MKLztS4iQjbl+g==","_npmVersion":"10.8.3","description":"Anteros SDK","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ufo":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.0.7_1786825092038_0.13454732602493746","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"_id":"@anteros/sdk@0.0.8","dist":{"shasum":"9a7e151a637e53048f1a8718bc4de0ff2d9da06c","tarball":"https://registry.npmjs.org/@anteros/sdk/-/sdk-0.0.8.tgz","fileCount":19,"integrity":"sha512-wJgth6d6Nbrj+P/fUH5LywBv5PDIuI4Vwnd2EhH/WroC0qK+DDIr1fg9wnRneAXxcORvPELrAmB1mwXNKzT4+A==","signatures":[{"sig":"MEUCIQDIsdC2rgr0W+k3Yr28nyGZtTXSdTvD9i8a+mZiW/OgmwIgCYVpm9irJm+c+PzDOhFkuEtCTw1O3y2TVxY0Jhra4KM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCbFPq8+XsH56tFvrECbIvcuA0VJizf8/BffJD/sAUrkgIgK2uEjXoTtnpRqJrxrDw0IkLkX2iZ1iMVhC/z26zUJSE="}],"unpackedSize":107029},"main":"index.ts","name":"@anteros/sdk","type":"module","module":"index.ts","shasum":"9a7e151a637e53048f1a8718bc4de0ff2d9da06c","private":false,"version":"0.0.8","_npmUser":{"name":"dnaxio","email":"git@dnax.io"},"_integrity":"sha512-wJgth6d6Nbrj+P/fUH5LywBv5PDIuI4Vwnd2EhH/WroC0qK+DDIr1fg9wnRneAXxcORvPELrAmB1mwXNKzT4+A==","_npmVersion":"10.8.3","description":"Anteros SDK","directories":{},"maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"_nodeVersion":"26.3.0","dependencies":{"ufo":"^1.6.3"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest"},"peerDependencies":{"typescript":"^6.0.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.0.8_1790204086294_0.7405533219988603"}}},"time":{"created":"2026-06-19T23:15:36.814Z","modified":"2026-09-23T22:54:46.578Z","0.0.1":"2026-06-19T23:15:37.057Z","0.0.2":"2026-06-20T14:09:35.334Z","0.0.3":"2026-07-06T11:21:36.784Z","0.0.4":"2026-07-15T17:52:27.261Z","0.0.5":"2026-08-05T10:24:23.867Z","0.0.6":"2026-08-05T10:28:51.025Z","0.0.7":"2026-08-15T20:18:12.180Z","0.0.8":"2026-09-23T22:54:46.411Z"},"description":"Anteros SDK","maintainers":[{"name":"dnaxio","email":"git@dnax.io"}],"readme":"# @anteros/sdk\n\nTypeScript REST client for the **Anteros** backend platform. Provides a typed, promise-based API to interact with your Anteros collections, services, files, and authentication endpoints — works in the browser, Node.js, and Bun.\n\n## Installation\n\n```bash\nbun add @anteros/sdk\n# or\nnpm install @anteros/sdk\n```\n\n> Requires `typescript` ^5 (peer dependency).\n\n## Two clients, one transport\n\nThe package ships **two classes** over the same HTTP transport — pick the one that reads better, they can even be used side by side:\n\n| Class | Surface |\n| --- | --- |\n| **`Anteros`** — `new Anteros({ server, tenant })` | **Namespaced** (recommended for new code): `api.collection(slug)`, `api.service(name).run`, `api.files`, `api.vars`, `api.agent(id)` |\n| **`Rest`** — `new Rest({ server, tenant })` | **Flat**, unchanged: `api.find(collection, …)`, `api.upload(…)`, `api.runService(…)`, `api.login(…)`… |\n\n**Nothing is deprecated and no call site has to move**: `Rest` keeps every method with the same signature (it simply talks to the server's current family URLs — the SDK builds the paths), while `Anteros` groups those same calls per family. `vars`, `agent(id)`, `getConfig()` and the header/token methods are shared by both.\n\n## Quick start\n\n```ts\nimport { Anteros } from \"@anteros/sdk\";\n\nconst api = new Anteros({\n  server: \"https://api.example.com\",\n  tenant: \"my-tenant\",\n  token: {\n    persist: true,        // auto-save token in localStorage\n    storageKey: \"anteros_token\",\n  },\n});\n\n// Login (an auth-enabled collection)\nconst users = api.collection(\"users\");\nconst { token, data: user } = await users.login({\n  email: \"john@example.com\",\n  password: \"secret\",\n});\n\n// CRUD — the slug is stated once, the row type once\nconst posts = api.collection<Post>(\"posts\");\nconst page = await posts.find({ $limit: 10 });\nconst post = await posts.insertOne({ title: \"Hello\" });\nawait posts.updateOne(post._id, { $set: { title: \"Updated\" } });\nawait posts.deleteOne(post._id);\n```\n\nThe same thing with the original client, unchanged:\n\n```ts\nimport { Rest } from \"@anteros/sdk\";\n\nconst api = new Rest({ server: \"https://api.example.com\", tenant: \"my-tenant\" });\n\nconst { token } = await api.login(\"users\", { email, password });\nconst page = await api.find(\"posts\", { $limit: 10 });\nconst post = await api.insertOne(\"posts\", { title: \"Hello\" });\nawait api.updateOne(\"posts\", post._id, { $set: { title: \"Updated\" } });\n```\n\n## API reference\n\n### Constructor\n\n```ts\nnew Anteros(options: RestClientOptions)   // namespaced\nnew Rest(options: RestClientOptions)      // flat (same options)\n```\n\n| Option             | Type                      | Description |\n|-------------------|--------------------------|-------------|\n| `server`          | `string`                 | Base URL of the Anteros server |\n| `tenant`          | `string`                 | Tenant identifier |\n| `headers`         | `Record<string, string>` | Default headers sent with every request |\n| `token`           | `object`                 | Token persistence settings |\n| `token.persist`   | `boolean`                | Persist token in `localStorage` (default: `true`) |\n| `token.storageKey`| `string`                 | localStorage key (default: `\"anteros_token\"`) |\n\n### Collections (CRUD)\n\nWith **`Anteros`**, the collection is bound once and the row type is given with it:\n\n```ts\nconst posts = api.collection<Post>(\"posts\");\n\nawait posts.find({ $limit: 10 });\nawait posts.findOne(id);\nawait posts.insertOne({ title: \"Hello\" });\nawait posts.aggregate([{ $group: { _id: \"$author\" } }]);\nawait posts.runAction(\"publish\", { at });\n```\n\nWith **`Rest`**, every method takes the collection first — the signatures are unchanged:\n\n| Method                                               | Description |\n|-----------------------------------------------------|-------------|\n| `find<T>(collection, params, options?)`              | Query documents with filters, sorting, pagination, lookups |\n| `findOne<T>(collection, id, params?, options?)`     | Get a single document by ID |\n| `insertOne<T, TBody>(collection, data, options?)`   | Insert one document |\n| `insertMany<T, TBody>(collection, data[], options?)`| Insert multiple documents |\n| `updateOne<T, TUpdate>(collection, id, update, options?)` | Update one document |\n| `updateMany<TUpdate>(collection, ids[], update, options?)` | Update multiple documents |\n| `deleteOne(collection, id, options?)`               | Delete one document |\n| `deleteMany(collection, ids[], options?)`            | Delete multiple documents |\n| `aggregate<T>(collection, pipeline, options?)`      | Run an aggregation pipeline |\n| `runAction<T>(collection, action, data?, options?)`  | Call a custom collection action |\n\n#### `FindOptions`\n\n```ts\n{\n  $limit?: number;\n  $skip?: number;\n  $sort?: { [key: string]: 1 | -1 };\n  $match?: Record<string, unknown>;\n  $project?: Record<string, unknown>;\n  $include?: Array<string | LookupOptions>;\n  $lookup?: Array<Record<string, any>>;\n  $graphLookup?: Array<Record<string, any>>;\n}\n```\n\n### Authentication\n\n```ts\n// Anteros — the collection owns its auth actions\nconst users = api.collection(\"users\");\nconst { token } = await users.login({ email, password });\nawait users.logout();\n\n// Rest — unchanged\nconst { token } = await api.login(\"users\", { email, password });\nawait api.logout(\"users\");\n```\n\nBoth clients drive their instance's token: shared by every later call of that instance.\n\n| Method                                           | Description |\n|-------------------------------------------------|-------------|\n| `login(...)`                                     | Login and automatically store the JWT token |\n| `logout(...)`                                    | Logout and clear the stored token |\n| `getToken()`                                    | Get the current token |\n| `clearToken()`                                  | Manually clear the token |\n| `setHeader(name, value)`                        | Set/unset a custom header |\n\n### File management\n\n```ts\n// Anteros — the files family\nconst file = await api.files.upload(\"photos\", blob, { title: \"My photo\" }, { fieldName: \"file\" });\nconst url = api.files.url(\"photos\", file._file.filename, { width: 400, format: \"webp\" });\nawait api.files.delete(\"photos\", file._id);\n\n// Rest — unchanged\nconst result = await api.upload(\"photos\", blob, { title: \"My photo\" }, { fieldName: \"file\" });\nconst legacyUrl = api.getFileUrl(\"photos\", \"abc123.jpg\", { width: 400, height: 300, format: \"webp\", quality: 80 });\nawait api.deleteFile(\"photos\", result._id);\n```\n\n### Services\n\n```ts\n// Anteros\nconst report = await api.service(\"email\").run(\"send\", { to: \"user@example.com\" });\n\n// Rest — unchanged\nconst legacy = await api.runService(\"email\", \"send\", { to: \"user@example.com\" });\n```\n\n### Configuration\n\n```ts\nconst config = await api.getConfig();\n// { tenants, collections, services, fileCollections }\n```\n\n### Request options\n\nEvery method accepts optional `RestRequestOptions`:\n\n```ts\n{\n  headers?: Record<string, string>;   // extra headers\n  signal?: AbortSignal;               // support for AbortController\n  query?: RestQueryOptions;           // query params\n  cleanDeep?: boolean;                // strip null/empty values from body\n}\n```\n\n## Utility: cleanDeep\n\nThe SDK exports a `cleanDeep` utility that recursively removes `null`, `undefined`, empty arrays, and empty objects from a value.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}