{"_id":"@appboypov/turbo-response","_rev":"2-6c60f16f76be61ab8ed533d790cdcfbb","name":"@appboypov/turbo-response","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.2":{"name":"@appboypov/turbo-response","version":"0.1.2","keywords":["result","response","success","fail","typescript","react"],"license":"MIT","_id":"@appboypov/turbo-response@0.1.2","maintainers":[{"name":"appboypov","email":"info@codaveto.com"}],"dist":{"shasum":"739d72935092c95820e519eac274aae13f4412d9","tarball":"https://registry.npmjs.org/@appboypov/turbo-response/-/turbo-response-0.1.2.tgz","fileCount":6,"integrity":"sha512-dCjhLHG+cR8PWhFwtrvQnf2++Un+tNzoGWcR+gk+TvBjdO4LGdCVBgZOd1h9msxKepOzh25kEGU7BKmgZFoIRw==","signatures":[{"sig":"MEUCIQCT5sBBUYgPJpPX+/xjV/jvCkd+1aGic1AdjrpyZ2fKAAIgUYU21HDqvbuNtQ8ijbzmNopxkMss1ilYOShWYRB4+AY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42231},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"036a07c3c3b33b7d75bfa64394c1e89f4421732c","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","test":"vitest run","build":"tsup src/index.ts --format cjs,esm --dts","typecheck":"tsc --noEmit"},"_npmUser":{"name":"appboypov","email":"info@codaveto.com"},"_npmVersion":"11.3.0","description":"Result type (Success/Fail) for operation outcomes in TypeScript/React","directories":{},"_nodeVersion":"24.1.0","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.3.0"},"_npmOperationalInternal":{"tmp":"tmp/turbo-response_0.1.2_1764042739063_0.09470769052955919","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@appboypov/turbo-response","version":"0.1.5","description":"Result type (Success/Fail) for operation outcomes in TypeScript/React","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts","dev":"tsup src/index.ts --format cjs,esm --dts --watch","test":"vitest run","typecheck":"tsc --noEmit"},"keywords":["result","response","success","fail","typescript","react"],"license":"MIT","devDependencies":{"tsup":"^8.0.0","typescript":"^5.3.0","vitest":"^1.0.0"},"_id":"@appboypov/turbo-response@0.1.5","gitHead":"23bfed4a1a4ffb008a2aee5065377271d1ce623d","_nodeVersion":"24.1.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-6kwtaX2SgC3Nq6TcPFVx0AMbwrf+o/LAlPYE/HrgHHlj4jPk1Drq3pBSMDojYQdF0D4vP2/Ft6AKtmmp3pNY+g==","shasum":"a2d61a376fa74123c64b7c50bc735c6ef646cb8e","tarball":"https://registry.npmjs.org/@appboypov/turbo-response/-/turbo-response-0.1.5.tgz","fileCount":6,"unpackedSize":42253,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDcIbPoAAug7znibhnJ3geDy92HCwlCA3+MN//Tm3sRVgIhAI9k0dL10/9tg2qPjZIoix40vBZaeSEcIgeMvfzIBkiM"}]},"_npmUser":{"name":"appboypov","email":"info@codaveto.com"},"directories":{},"maintainers":[{"name":"appboypov","email":"info@codaveto.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/turbo-response_0.1.5_1764043041257_0.054051958505253905"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-25T03:52:18.988Z","modified":"2025-11-25T03:57:21.659Z","0.1.2":"2025-11-25T03:52:19.336Z","0.1.5":"2025-11-25T03:57:21.455Z"},"license":"MIT","keywords":["result","response","success","fail","typescript","react"],"description":"Result type (Success/Fail) for operation outcomes in TypeScript/React","maintainers":[{"name":"appboypov","email":"info@codaveto.com"}],"readme":"# turbo-response\n\nA TypeScript library providing a type-safe Result type (Success/Fail) for handling operation outcomes without exceptions.\n\n## Installation\n\n```bash\nnpm install @appboypov/turbo-response\n```\n\n## Features\n\n- **Type-safe result handling** with discriminated unions\n- **Zero dependencies**\n- **Full TypeScript support** with complete type inference\n- **Functional programming utilities** for chaining and transforming results\n- **Async support** with `andThenAsync`, `recoverAsync`, and `traverse`\n- **Batch operations** with `sequence` for combining multiple results\n\n## Quick Start\n\n```typescript\nimport { success, fail, fold, isSuccess, TurboResponse } from '@appboypov/turbo-response';\n\n// Creating responses\nconst successResult = success({ id: '123', name: 'John' });\nconst failResult = fail(new Error('Not found'));\n\n// Type guards\nif (isSuccess(response)) {\n  console.log(response.result);\n}\n\n// Pattern matching with fold\nconst message = fold(\n  response,\n  (data) => `Found user: ${data.name}`,\n  (error) => `Error: ${error}`\n);\n```\n\n## API\n\n### Creating Responses\n\n#### `success<T>(result: T, title?: string, message?: string): Success<T>`\n\nCreates a successful response.\n\n```typescript\nconst user = success({ id: '1', name: 'John' });\nconst withMeta = success(data, 'Created', 'User created successfully');\n```\n\n#### `fail<T>(error: unknown, title?: string, message?: string, stackTrace?: string): Fail<T>`\n\nCreates a failed response.\n\n```typescript\nconst error = fail(new Error('Not found'));\nconst withMeta = fail(err, 'Not Found', 'User does not exist');\n```\n\n### Type Guards\n\n#### `isSuccess<T>(r: TurboResponse<T>): r is Success<T>`\n\n```typescript\nif (isSuccess(response)) {\n  console.log(response.result); // TypeScript knows this is Success<T>\n}\n```\n\n#### `isFail<T>(r: TurboResponse<T>): r is Fail<T>`\n\n```typescript\nif (isFail(response)) {\n  console.log(response.error); // TypeScript knows this is Fail<T>\n}\n```\n\n### Pattern Matching\n\n#### `fold<T, R>(response, onSuccess, onFail): R`\n\nTransform a response into a single value.\n\n```typescript\nconst message = fold(\n  response,\n  (user) => `Hello, ${user.name}`,\n  (error) => `Error: ${error}`\n);\n```\n\n#### `when<T, R>(response, handlers): R`\n\nPattern match with full response access.\n\n```typescript\nconst result = when(response, {\n  success: (s) => `Got ${s.result.name} - ${s.message}`,\n  fail: (f) => `Failed: ${f.title}`,\n});\n```\n\n#### `maybeWhen<T, R>(response, handlers): R`\n\nPattern match with optional handlers and fallback.\n\n```typescript\nconst result = maybeWhen(response, {\n  success: (s) => s.result.name,\n  orElse: () => 'Unknown',\n});\n```\n\n### Transformations\n\n#### `mapSuccess<T, R>(r, fn): TurboResponse<R>`\n\nTransform the success value.\n\n```typescript\nconst nameResponse = mapSuccess(userResponse, (user) => user.name);\n```\n\n#### `mapFail<T>(r, fn): TurboResponse<T>`\n\nTransform the error value.\n\n```typescript\nconst mapped = mapFail(response, (err) => new CustomError(err));\n```\n\n### Chaining\n\n#### `andThen<T, R>(r, fn): TurboResponse<R>`\n\nChain operations that return TurboResponse (flatMap/bind).\n\n```typescript\nconst result = andThen(\n  getUserById('123'),\n  (user) => getOrdersByUser(user.id)\n);\n```\n\n#### `andThenAsync<T, R>(r, fn): Promise<TurboResponse<R>>`\n\nAsync version of andThen for chaining async operations.\n\n```typescript\nconst result = await andThenAsync(\n  fetchUser('123'),\n  async (user) => fetchOrders(user.id)\n);\n\n// Chain multiple async operations\nlet result = await fetchUser('123');\nresult = await andThenAsync(result, async (user) => fetchProfile(user.id));\nresult = await andThenAsync(result, async (profile) => fetchSettings(profile.id));\n```\n\n### Error Recovery\n\n#### `recover<T>(r, fn): TurboResponse<T>`\n\nAttempt to recover from a failure.\n\n```typescript\nconst result = recover(\n  failedResponse,\n  (error) => success(defaultValue)\n);\n```\n\n#### `recoverAsync<T>(r, fn): Promise<TurboResponse<T>>`\n\nAsync version of recover.\n\n```typescript\nconst result = await recoverAsync(\n  failedResponse,\n  async (error) => {\n    const fallback = await fetchFallbackData();\n    return success(fallback);\n  }\n);\n```\n\n### Unwrapping\n\n#### `unwrap<T>(r): T`\n\nGet the success value or throw the error.\n\n```typescript\ntry {\n  const value = unwrap(response);\n} catch (error) {\n  // Handle error\n}\n```\n\n#### `unwrapOr<T>(r, defaultValue): T`\n\nGet the success value or return a default.\n\n```typescript\nconst value = unwrapOr(response, defaultUser);\n```\n\n#### `unwrapOrCompute<T>(r, compute): T`\n\nGet the success value or compute a default lazily.\n\n```typescript\nconst value = unwrapOrCompute(response, () => createDefaultUser());\n```\n\n### Batch Operations\n\n#### `traverse<T, R>(items, fn): Promise<TurboResponse<R[]>>`\n\nApply an async operation to each item, collecting results. Fails fast on first error.\n\n```typescript\nconst userIds = ['1', '2', '3'];\n\nconst result = await traverse(userIds, async (id) => {\n  const user = await fetchUser(id);\n  return user ? success(user) : fail(new Error(`User ${id} not found`));\n});\n\nif (isSuccess(result)) {\n  console.log('All users:', result.result); // User[]\n}\n```\n\n#### `sequence<T>(responses): TurboResponse<T[]>`\n\nCombine an array of responses into a single response. Fails fast on first error.\n\n```typescript\nconst responses = [\n  success(1),\n  success(2),\n  success(3),\n];\n\nconst combined = sequence(responses);\n// Success<number[]> with [1, 2, 3]\n\nconst withFailure = sequence([\n  success(1),\n  fail(new Error('oops')),\n  success(3),\n]);\n// Fail - returns the first failure\n```\n\n### Validation\n\n#### `ensure<T>(r, predicate, error): TurboResponse<T>`\n\nValidate the success value against a predicate.\n\n```typescript\nconst validated = ensure(\n  userResponse,\n  (user) => user.age >= 18,\n  new Error('Must be 18 or older')\n);\n```\n\n### Utilities\n\n#### `swap<T>(r): TurboResponse<T>`\n\nSwap success and fail states.\n\n#### `getResult<T>(r): T | undefined`\n\nSafely get the result value.\n\n#### `getError<T>(r): unknown | undefined`\n\nSafely get the error value.\n\n#### `getTitle<T>(r): string | undefined`\n\nGet the title metadata.\n\n#### `getMessage<T>(r): string | undefined`\n\nGet the message metadata.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}