{"_id":"@borta/user-pictures","_rev":"4-d59aff0a3804d3022894e28688b7d8a0","name":"@borta/user-pictures","dist-tags":{"latest":"1.2.1"},"versions":{"1.0.0":{"name":"@borta/user-pictures","version":"1.0.0","_id":"@borta/user-pictures@1.0.0","maintainers":[{"name":"brunoborta","email":"khalisto@gmail.com"}],"homepage":"https://github.com/borta/erasys-test#readme","bugs":{"url":"https://github.com/borta/erasys-test/issues"},"dist":{"shasum":"22025c116539de1af4bd0de7e79f64ed7b5721c7","tarball":"https://registry.npmjs.org/@borta/user-pictures/-/user-pictures-1.0.0.tgz","fileCount":7,"integrity":"sha512-aik7jHAoebZD//XssqlmxYIH54WxLbCv2UgzshqBBOzqsDLxiQheJ/FVnehbou91AaOUzd1K8huq+yJucHdhNA==","signatures":[{"sig":"MEQCIGZJg9Yy9yQ1LwX6/aYJGFeDsIJNXV6lbcCraHjB5Hx9AiBoesavhY9qI+fWP2WHHKgyfkU4+8j8i29EyUwUIlLNQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14380},"main":"./dist/index.cjs","type":"module","_from":"file:borta-user-pictures-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"brunoborta","email":"khalisto@gmail.com"},"_resolved":"C:\\Users\\khali\\AppData\\Local\\Temp\\8af4f8fa36bb7021ea3636b0cb9d1be3\\borta-user-pictures-1.0.0.tgz","_integrity":"sha512-aik7jHAoebZD//XssqlmxYIH54WxLbCv2UgzshqBBOzqsDLxiQheJ/FVnehbou91AaOUzd1K8huq+yJucHdhNA==","repository":{"url":"git+https://github.com/borta/erasys-test.git","type":"git","directory":"packages/user-pictures"},"_npmVersion":"10.9.0","description":"Shared user pictures SDK for Erasys Test","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.0.18","typescript":"^5.9.3","@vitest/coverage-v8":"4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/user-pictures_1.0.0_1770477543478_0.8311347325317215","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@borta/user-pictures","version":"1.1.0","_id":"@borta/user-pictures@1.1.0","maintainers":[{"name":"brunoborta","email":"khalisto@gmail.com"}],"homepage":"https://github.com/borta/erasys-test#readme","bugs":{"url":"https://github.com/borta/erasys-test/issues"},"dist":{"shasum":"6b48993c94479eddfd78819ee4189f13ef816278","tarball":"https://registry.npmjs.org/@borta/user-pictures/-/user-pictures-1.1.0.tgz","fileCount":7,"integrity":"sha512-1S7uKYAewfuocaWQcI3zIqilXXK7VJWooyhK/lcINdhNBrVqB77l4u3foHVmXHCxDKUAYnRZAhE7KXtWqho0eA==","signatures":[{"sig":"MEQCIDlHXgUUmNRLvrYzXh5APbz2/xJVBdg/BF60K1unKfQJAiBoUW0uwb0ntdjME+a1zzeo+/wLydrKBgRtnd8WFRmbaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14380},"main":"./dist/index.cjs","type":"module","_from":"file:borta-user-pictures-1.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"brunoborta","email":"khalisto@gmail.com"},"_resolved":"C:\\Users\\khali\\AppData\\Local\\Temp\\1e6440553fe572d8a6f6ead4b9205dab\\borta-user-pictures-1.1.0.tgz","_integrity":"sha512-1S7uKYAewfuocaWQcI3zIqilXXK7VJWooyhK/lcINdhNBrVqB77l4u3foHVmXHCxDKUAYnRZAhE7KXtWqho0eA==","repository":{"url":"git+https://github.com/borta/erasys-test.git","type":"git","directory":"packages/user-pictures"},"_npmVersion":"10.9.0","description":"Shared user pictures SDK for Erasys Test","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.0.18","typescript":"^5.9.3","@vitest/coverage-v8":"4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/user-pictures_1.1.0_1770513329960_0.5908763159536592","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@borta/user-pictures","version":"1.2.0","_id":"@borta/user-pictures@1.2.0","maintainers":[{"name":"brunoborta","email":"khalisto@gmail.com"}],"homepage":"https://github.com/borta/erasys-test#readme","bugs":{"url":"https://github.com/borta/erasys-test/issues"},"dist":{"shasum":"9ad6118b6772609a3b6157ca71ffe53bfb016a34","tarball":"https://registry.npmjs.org/@borta/user-pictures/-/user-pictures-1.2.0.tgz","fileCount":7,"integrity":"sha512-hs3Kva2PDBP6lzBv2Uywh5mDwv/8eooi3WElOhRfPtZZWIUiq3hHV+ewv8B3HuxjLtaT8ELzMS/Ejwi/XzPVzw==","signatures":[{"sig":"MEUCIQCY9qfDol+WXZhjkb2phlzwMQppi3KIOhIOqFVUVkHRIAIgB1bctbRbV/ZKQzl99BMi5Hf90cI1sqBJ/5+Ya/COIVM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20394},"main":"./dist/index.cjs","type":"module","_from":"file:borta-user-pictures-1.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"brunoborta","email":"khalisto@gmail.com"},"_resolved":"C:\\Users\\khali\\AppData\\Local\\Temp\\45876c8dcc588c67bb6b9b31f84ba3aa\\borta-user-pictures-1.2.0.tgz","_integrity":"sha512-hs3Kva2PDBP6lzBv2Uywh5mDwv/8eooi3WElOhRfPtZZWIUiq3hHV+ewv8B3HuxjLtaT8ELzMS/Ejwi/XzPVzw==","repository":{"url":"git+https://github.com/borta/erasys-test.git","type":"git","directory":"packages/user-pictures"},"_npmVersion":"10.9.0","description":"Shared user pictures SDK for Erasys Test","directories":{},"_nodeVersion":"22.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.0.18","typescript":"^5.9.3","@vitest/coverage-v8":"4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/user-pictures_1.2.0_1770599882105_0.3501359294810664","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@borta/user-pictures","version":"1.2.1","description":"Shared user pictures SDK for Erasys Test","license":"MIT","keywords":["erasys","user-pictures","sdk","brunoborta"],"engines":{"node":">=18"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/borta/erasys-test.git","directory":"packages/user-pictures"},"type":"module","types":"./dist/index.d.ts","main":"./dist/index.cjs","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"devDependencies":{"@vitest/coverage-v8":"4.0.18","tsup":"^8.5.1","typescript":"^5.9.3","vitest":"^4.0.18"},"scripts":{"build":"tsup","dev":"tsup --watch","lint":"eslint src test","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","type-check":"tsc --noEmit","clean":"rm -rf dist"},"_id":"@borta/user-pictures@1.2.1","bugs":{"url":"https://github.com/borta/erasys-test/issues"},"homepage":"https://github.com/borta/erasys-test#readme","_integrity":"sha512-q72/U814MFgfcbPPltIJj1r2KVpIGb5G9fJSjuan2O1eshHmOhgIhPWRVhSYlMCBN6USxSgfByRA8hkfCCpq9g==","_resolved":"C:\\Users\\khali\\AppData\\Local\\Temp\\3182be9698435da787d6ef08961bdee0\\borta-user-pictures-1.2.1.tgz","_from":"file:borta-user-pictures-1.2.1.tgz","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-q72/U814MFgfcbPPltIJj1r2KVpIGb5G9fJSjuan2O1eshHmOhgIhPWRVhSYlMCBN6USxSgfByRA8hkfCCpq9g==","shasum":"101186c023a5f9464e6c64d91006e885dad29e86","tarball":"https://registry.npmjs.org/@borta/user-pictures/-/user-pictures-1.2.1.tgz","fileCount":8,"unpackedSize":24576,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC6zNrNzsz3H3NFkb0/8d59i3fHwX1B3ZZFKd467+UqzQIhANZjwdrOZj7M3kQqj0aGIsoFKvcLkXpC7qFhBb+tx+0g"}]},"_npmUser":{"name":"brunoborta","email":"khalisto@gmail.com"},"directories":{},"maintainers":[{"name":"brunoborta","email":"khalisto@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/user-pictures_1.2.1_1770748761599_0.9802654458548894"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-07T15:19:03.345Z","modified":"2026-02-10T18:39:21.886Z","1.0.0":"2026-02-07T15:19:03.638Z","1.1.0":"2026-02-08T01:15:30.128Z","1.2.0":"2026-02-09T01:18:02.255Z","1.2.1":"2026-02-10T18:39:21.746Z"},"bugs":{"url":"https://github.com/borta/erasys-test/issues"},"homepage":"https://github.com/borta/erasys-test#readme","repository":{"type":"git","url":"git+https://github.com/borta/erasys-test.git","directory":"packages/user-pictures"},"description":"Shared user pictures SDK for Erasys Test","maintainers":[{"name":"brunoborta","email":"khalisto@gmail.com"}],"readme":"# @borta/user-pictures\n\nSDK for fetching and processing user profile data and pictures from the Hunqz API.\n\n## Installation\n\n```bash\npnpm add @borta/user-pictures\n```\n\n## Quick Start\n\n```ts\nimport { getProfile, getSafePictures, buildImageUrl } from \"@borta/user-pictures\";\n\nconst profile = await getProfile(\"msescortplus\");\nconst pictures = getSafePictures(profile);\n\npictures.forEach((pic) => {\n  console.log(buildImageUrl(pic.url_token));\n});\n```\n\n## API Reference\n\n### `getProfile(slug?, config?)`\n\nFetches a user profile from the API.\n\n```ts\nconst profile = await getProfile(); // uses default slug \"msescortplus\"\nconst profile = await getProfile(\"custom-slug\");\nconst profile = await getProfile(\"custom-slug\", {\n  baseUrl: \"https://custom-api.com/api/opengrid\",\n  timeout: 5000,\n});\n```\n\n- **slug** `string` — Profile slug (default: `\"msescortplus\"`)\n- **config** `ApiConfig` — Optional configuration (see [Configuration](#configuration))\n- **Returns** `Promise<Profile>`\n- **Throws** `ApiError` on HTTP errors, `Error` on timeout\n\n### `buildImageUrl(urlToken)`\n\nConstructs a full image URL from a token.\n\n```ts\nbuildImageUrl(\"abc123\");\n// → \"https://www.hunqz.com/img/usr/original/0x0/abc123.jpg\"\n```\n\n### `getPublicPictures(profile)`\n\nReturns all pictures where `is_public` is `true`.\n\n```ts\nconst publicPics = getPublicPictures(profile);\n```\n\n### `getSafePictures(profile)`\n\nReturns all pictures that are public **and** have a safe rating (`APP_SAFE` or `NEUTRAL`).\n\n```ts\nconst safePics = getSafePictures(profile);\n```\n\n### `getPreviewImageUrl(profile)`\n\nReturns the full URL of the profile's preview picture, or `null` if none exists.\n\n```ts\nconst previewUrl = getPreviewImageUrl(profile);\n// → \"https://www.hunqz.com/img/usr/original/0x0/token.jpg\" or null\n```\n\n### `getImageUrls(profile, options?)`\n\nFlexible image URL extraction with filtering options.\n\n```ts\n// All safe public images (default)\nconst urls = getImageUrls(profile);\n\n// All public images, including non-safe\nconst urls = getImageUrls(profile, { safeOnly: false });\n\n// First 5 safe public images\nconst urls = getImageUrls(profile, { limit: 5 });\n```\n\n| Option       | Type      | Default     | Description                    |\n| ------------ | --------- | ----------- | ------------------------------ |\n| `publicOnly` | `boolean` | `true`      | Filter to public pictures only |\n| `safeOnly`   | `boolean` | `true`      | Filter to safe ratings only    |\n| `limit`      | `number`  | `undefined` | Max number of URLs to return   |\n\n## Types\n\n### `Profile`\n\n```ts\ninterface Profile {\n  id: string;\n  name: string;\n  headline?: string;\n  preview_pic?: Picture;\n  pictures: Picture[];\n}\n```\n\n### `Picture`\n\n```ts\ninterface Picture {\n  id: string;\n  url_token: string;\n  width: number;\n  height: number;\n  rating: \"NEUTRAL\" | \"EROTIC\" | \"APP_SAFE\";\n  is_public: boolean;\n  comment?: string;\n}\n```\n\n### `ApiConfig`\n\n```ts\ntype ApiConfig = {\n  baseUrl?: string; // default: \"https://www.hunqz.com/api/opengrid\"\n  timeout?: number; // default: 10000 (ms)\n  fetchFn?: FetchFn; // custom fetch implementation (useful for SSR/testing)\n};\n```\n\n## Configuration\n\nYou can pass a custom `ApiConfig` to `getProfile()`:\n\n| Option    | Default                                | Description                                      |\n| --------- | -------------------------------------- | ------------------------------------------------ |\n| `baseUrl` | `\"https://www.hunqz.com/api/opengrid\"` | API base URL                                     |\n| `timeout` | `10000`                                | Request timeout in milliseconds                  |\n| `fetchFn` | `globalThis.fetch`                     | Custom fetch function (e.g., for SSR or testing) |\n\n## Error Handling\n\nThe package exports an `ApiError` class for HTTP errors:\n\n```ts\nimport { getProfile, ApiError } from \"@borta/user-pictures\";\n\ntry {\n  const profile = await getProfile(\"nonexistent\");\n} catch (err) {\n  if (err instanceof ApiError) {\n    console.log(err.status); // HTTP status code\n    console.log(err.url); // Request URL\n    console.log(err.message); // Error message\n  }\n}\n```\n","readmeFilename":"README.md","keywords":["erasys","user-pictures","sdk","brunoborta"],"license":"MIT"}