{"_id":"@clipboard-health/util-typescript","_rev":"11-a3563bd57ba618ebc4ce4a03205f7e6e","name":"@clipboard-health/util-typescript","dist-tags":{"latest":"0.5.2"},"versions":{"0.1.0":{"name":"@clipboard-health/util-typescript","version":"0.1.0","keywords":[],"license":"MIT","_id":"@clipboard-health/util-typescript@0.1.0","maintainers":[{"name":"user_engineer","email":"user_engineer@clipboardhealth.com"},{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},{"name":"mikecookcbh","email":"mike.cook@clipboardhealth.com"}],"dist":{"shasum":"1787bc294bfd0f1fb9005b0e965734fac53c2ce8","tarball":"https://registry.npmjs.org/@clipboard-health/util-typescript/-/util-typescript-0.1.0.tgz","fileCount":32,"integrity":"sha512-kB+PI5V24mLOIAhiCJE1yCE0EXY48o3Bg4CEiVX/lTLfY5Mf5EX9qP8G2+9A5gch1G77azKS5PNihcnXomO5nA==","signatures":[{"sig":"MEUCIBDIUpFzhAY1TbA6zSAGPFPKXDoRESoKbvuKG21Gkfz6AiEAkUdG1LzWKZh1ULk9/XtaOgwiDQanuAmCiJ5Ur+7TrC0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":15831},"main":"./src/index.js","type":"commonjs","types":"./src/index.d.ts","gitHead":"1a14fb3d75be423c126acd998d07f10c1b092f48","typings":"./src/index.d.ts","_npmUser":{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"10.9.0","description":"TODO","directories":{},"_nodeVersion":"22.10.0","dependencies":{"tslib":"2.8.0"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/util-typescript_0.1.0_1730224686602_0.8058710111106262","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"@clipboard-health/util-typescript","version":"0.1.1","keywords":[],"license":"MIT","_id":"@clipboard-health/util-typescript@0.1.1","maintainers":[{"name":"user_engineer","email":"user_engineer@clipboardhealth.com"},{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},{"name":"mikecookcbh","email":"mike.cook@clipboardhealth.com"}],"dist":{"shasum":"292a5a9ca9e58a94fd6ae67ac503d3d3569d9005","tarball":"https://registry.npmjs.org/@clipboard-health/util-typescript/-/util-typescript-0.1.1.tgz","fileCount":32,"integrity":"sha512-FSjAE5GdNzN6k6KW0Y4Yr2ipv45uTulQntVtoXW01MCQYOfcIoAhfOql5UJMWwSQ07uB3+UaRoDmofS/9tjRIA==","signatures":[{"sig":"MEQCIBO0kHGeSP01c7QOSNdqt2n9Jzi2EGP5/jAi2rQfn7VsAiBfBmVaANR6J34e53wUbH78DSeLXS0PqX5rqP5A/sh14g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":15865},"main":"./src/index.js","type":"commonjs","types":"./src/index.d.ts","gitHead":"f82bde54074f763e86f5436341f0a320a77bdc29","typings":"./src/index.d.ts","_npmUser":{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"10.9.0","description":"TypeScript utilities.","directories":{},"_nodeVersion":"22.10.0","dependencies":{"tslib":"2.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/util-typescript_0.1.1_1730236482160_0.24116937864351273","host":"s3://npm-registry-packages"}},"0.2.0":{"name":"@clipboard-health/util-typescript","version":"0.2.0","keywords":[],"license":"MIT","_id":"@clipboard-health/util-typescript@0.2.0","maintainers":[{"name":"user_engineer","email":"user_engineer@clipboardhealth.com"},{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},{"name":"mikecookcbh","email":"mike.cook@clipboardhealth.com"}],"dist":{"shasum":"28a274cbc11eb6293160dfec75021423d844b52b","tarball":"https://registry.npmjs.org/@clipboard-health/util-typescript/-/util-typescript-0.2.0.tgz","fileCount":35,"integrity":"sha512-QS+h1IzgLAWotmTwJARsyBKMmYeyoj2gEIKRPoG/C3HG/keN54ryMTFEZu+YrTepcAfSJY76IlIJW23WlkxFWw==","signatures":[{"sig":"MEUCIQDcaK4AgV70PAkSnR487gHbUZtMDJ6Do+D/Z3eJrcVGVwIgSQJzMOHJ88S1qt+1SQt7JngDjdNiz+EQbOKEWVWKDqA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":29601},"main":"./src/index.js","type":"commonjs","types":"./src/index.d.ts","gitHead":"b003c1f686b31086118992e551b2bb5f36addf4d","scripts":{"embed":"embedme README.md"},"typings":"./src/index.d.ts","_npmUser":{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"10.9.0","description":"TypeScript utilities.","directories":{},"_nodeVersion":"22.10.0","dependencies":{"tslib":"2.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/util-typescript_0.2.0_1730263354710_0.007188945558996629","host":"s3://npm-registry-packages"}},"0.3.0":{"name":"@clipboard-health/util-typescript","version":"0.3.0","keywords":[],"license":"MIT","_id":"@clipboard-health/util-typescript@0.3.0","maintainers":[{"name":"user_engineer","email":"user_engineer@clipboardhealth.com"},{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},{"name":"mikecookcbh","email":"mike.cook@clipboardhealth.com"}],"dist":{"shasum":"6912be381f133dfdd461de085a7aa24490a5a710","tarball":"https://registry.npmjs.org/@clipboard-health/util-typescript/-/util-typescript-0.3.0.tgz","fileCount":38,"integrity":"sha512-/CAo7ISMmd2P2+qb8R5b+k4WZK7OY6MY+/OvrGW354s97G1tV9WC0GFlxq1bYcCp+82jtJtWcDC4VGhopC7UEA==","signatures":[{"sig":"MEYCIQDzjrwwpoJccFeSkfVX7KWtOas1jL7F9/IpqBbQUrlbbgIhAPan8Zk3UX3pZZjZsc1Pw/2/3jBnN7auHtYiesram+wP","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31840},"main":"./src/index.js","type":"commonjs","types":"./src/index.d.ts","gitHead":"4952a926c575271d6feac82f7a944fb9ebb5c2d8","scripts":{"embed":"embedme README.md"},"typings":"./src/index.d.ts","_npmUser":{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"10.9.0","description":"TypeScript utilities.","directories":{},"_nodeVersion":"22.10.0","dependencies":{"tslib":"2.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/util-typescript_0.3.0_1730265778389_0.5500429789017696","host":"s3://npm-registry-packages"}},"0.4.0":{"name":"@clipboard-health/util-typescript","version":"0.4.0","keywords":[],"license":"MIT","_id":"@clipboard-health/util-typescript@0.4.0","maintainers":[{"name":"user_engineer","email":"user_engineer@clipboardhealth.com"},{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},{"name":"mikecookcbh","email":"mike.cook@clipboardhealth.com"}],"dist":{"shasum":"29a7e9c06ec30b287fc4f9cbf9fa17060e9aba98","tarball":"https://registry.npmjs.org/@clipboard-health/util-typescript/-/util-typescript-0.4.0.tgz","fileCount":38,"integrity":"sha512-KvkAtjkAGnqqtomvjcHMRfqxCOJtpaESy+7elbay8GeXr2dwqswzPk6fcEpm890jK1wBKWA4U8wC3J+pdGnjlQ==","signatures":[{"sig":"MEQCIEAg5h7i699uZtUpXwGiHZ6bc3qxjbfNMp+Ka/clWe+YAiBz8Zdlem5UP+Xu2iG7G07fmF97P+rUa5P5fxEIHcT4Vg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":31840},"main":"./src/index.js","type":"commonjs","types":"./src/index.d.ts","gitHead":"02e4d7fe51b62167c116dbf960249e7596df68ac","scripts":{"embed":"embedme README.md"},"typings":"./src/index.d.ts","_npmUser":{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"10.9.0","description":"TypeScript utilities.","directories":{},"_nodeVersion":"22.10.0","dependencies":{"tslib":"2.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/util-typescript_0.4.0_1730302525623_0.17352144765063926","host":"s3://npm-registry-packages"}},"0.5.0":{"name":"@clipboard-health/util-typescript","version":"0.5.0","keywords":[],"license":"MIT","_id":"@clipboard-health/util-typescript@0.5.0","maintainers":[{"name":"user_engineer","email":"user_engineer@clipboardhealth.com"},{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},{"name":"mikecookcbh","email":"mike.cook@clipboardhealth.com"}],"dist":{"shasum":"b347db96a2457c9447ed1a2429c7c5c11191fa00","tarball":"https://registry.npmjs.org/@clipboard-health/util-typescript/-/util-typescript-0.5.0.tgz","fileCount":44,"integrity":"sha512-M1i5woD2BiXwsBeTK4SwTLO6Rblt0Y09eRRlDK9vGZcEWoLYLmAxg446jgy3tHY8gd6oF3pJRAqda9VGAuGyxw==","signatures":[{"sig":"MEUCIAOts3SyZ2h1rJhpQoHKTCW1qJraBYyePOzFJIC+cPR0AiEAktrsS4aN7gyFnlyaghcdLFDKksCz7thrJ1WlxQCu9VE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45810},"main":"./src/index.js","type":"commonjs","types":"./src/index.d.ts","gitHead":"74d489ac0c2042691bc8719e73f1b8c54bbd1bd4","scripts":{"embed":"embedme README.md"},"typings":"./src/index.d.ts","_npmUser":{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"10.9.0","description":"TypeScript utilities.","directories":{},"_nodeVersion":"22.10.0","dependencies":{"tslib":"2.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/util-typescript_0.5.0_1730318109370_0.008928168166038697","host":"s3://npm-registry-packages"}},"0.5.1":{"name":"@clipboard-health/util-typescript","version":"0.5.1","keywords":[],"license":"MIT","_id":"@clipboard-health/util-typescript@0.5.1","maintainers":[{"name":"user_engineer","email":"user_engineer@clipboardhealth.com"},{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},{"name":"mikecookcbh","email":"mike.cook@clipboardhealth.com"}],"dist":{"shasum":"f2be3584984f2e171c713b645d82b9860095cc5f","tarball":"https://registry.npmjs.org/@clipboard-health/util-typescript/-/util-typescript-0.5.1.tgz","fileCount":44,"integrity":"sha512-z/bJHcOrdMvlqq8Jx+KRbBM9uBhd3CeiQd1/wXdJWj9dM7rZ95fldmTTCT5IZPW9HapUCzRUjyLtV7v4SOmyDA==","signatures":[{"sig":"MEUCIQChN76L0/kpLphCP39ppwKK2gmJ+48b3xgC0NpZrGJXHAIgS6RccCGWsTjhirLiZI5jRjXHKAgBh0xqLxlhlZ8+Yq8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46538},"main":"./src/index.js","type":"commonjs","types":"./src/index.d.ts","gitHead":"36e1d9f17c0f583f756e24a1d92bd2aa611d946e","scripts":{"embed":"embedme README.md"},"typings":"./src/index.d.ts","_npmUser":{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"10.9.0","description":"TypeScript utilities.","directories":{},"_nodeVersion":"22.11.0","dependencies":{"tslib":"2.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/util-typescript_0.5.1_1730325534830_0.562265299924888","host":"s3://npm-registry-packages"}},"0.5.2":{"name":"@clipboard-health/util-typescript","version":"0.5.2","keywords":[],"license":"MIT","_id":"@clipboard-health/util-typescript@0.5.2","maintainers":[{"name":"user_engineer","email":"user_engineer@clipboardhealth.com"},{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},{"name":"mikecookcbh","email":"mike.cook@clipboardhealth.com"}],"dist":{"shasum":"5ecc644f9716027f799208e100ba91fca01817f1","tarball":"https://registry.npmjs.org/@clipboard-health/util-typescript/-/util-typescript-0.5.2.tgz","fileCount":44,"integrity":"sha512-CJBFvA1S+P83Nf1W+qBj8CR2qnLJ2waj4/KqWEtHHThsRFD08pnqBjrFEHpg8KdTx20Wg+5Ay6pis1k29NiKCA==","signatures":[{"sig":"MEQCIGEzuV7Aejb8ochp9OJ5hl4zPeoHENO4zgeDhFhFpu4aAiBvB1T8ckZa4iG6dciGmDniDAX/0pR+1+nr8w9kOTDCQA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":50795},"main":"./src/index.js","type":"commonjs","types":"./src/index.d.ts","gitHead":"831ec64aedd99e2611e38a5850519f7bd1978e09","scripts":{"embed":"embedme README.md"},"typings":"./src/index.d.ts","_npmUser":{"name":"sharedenginner_cbh","email":"shared.engineer@clipboardhealth.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","_npmVersion":"10.9.0","description":"TypeScript utilities.","directories":{},"_nodeVersion":"22.11.0","dependencies":{"tslib":"2.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/util-typescript_0.5.2_1730329213927_0.7902483841329029","host":"s3://npm-registry-packages"}}},"time":{"created":"2024-10-29T17:58:06.059Z","modified":"2026-05-13T20:00:02.346Z","0.1.0":"2024-10-29T17:58:06.816Z","0.1.1":"2024-10-29T21:14:42.351Z","0.2.0":"2024-10-30T04:42:34.916Z","0.3.0":"2024-10-30T05:22:58.602Z","0.4.0":"2024-10-30T15:35:25.814Z","0.5.0":"2024-10-30T19:55:09.555Z","0.5.1":"2024-10-30T21:58:55.029Z","0.5.2":"2024-10-30T23:00:14.110Z"},"license":"MIT","keywords":[],"description":"TypeScript utilities.","maintainers":[{"email":"mike.cook@clipboardhealth.com","name":"mikecookcbh"},{"email":"shared.engineer@clipboardhealth.com","name":"sharedenginner_cbh"},{"email":"user_engineer@clipboardhealth.com","name":"user_engineer"},{"email":"heorhii.teriaiev@clipboardhealth.com","name":"clipboard_engineering"}],"readme":"# @clipboard-health/util-typescript <!-- omit from toc -->\n\nTypeScript utilities.\n\n## Table of contents <!-- omit from toc -->\n\n- [Install](#install)\n- [Usage](#usage)\n  - [ServiceError](#serviceerror)\n  - [ServiceResult](#serviceresult)\n  - [Functional](#functional)\n    - [`pipe`](#pipe)\n    - [`option`](#option)\n    - [`either`](#either)\n- [Local development commands](#local-development-commands)\n\n## Install\n\n```bash\nnpm install @clipboard-health/util-typescript\n```\n\n## Usage\n\nSee `./src/lib` for each utility.\n\n### ServiceError\n\n<!-- prettier-ignore -->\n```ts\n// ./examples/serviceError.ts\n\nimport { deepEqual, equal } from \"node:assert/strict\";\n\nimport { ERROR_CODES, ServiceError } from \"@clipboard-health/util-typescript\";\n\n{\n  const error = new ServiceError(\"boom\");\n  equal(error.toString(), `ServiceError[${error.id}]: [internal]: boom`);\n}\n\n{\n  const error = new Error(\"boom\");\n  const serviceError = ServiceError.fromError(error);\n  equal(\n    serviceError.toString(),\n    `ServiceError[${serviceError.id}]: [internal]: boom; [cause]: Error: boom`,\n  );\n}\n\n{\n  const errorWithCause = new ServiceError({\n    issues: [{ message: \"boom\" }],\n    cause: new Error(\"Original error\"),\n  });\n  equal(\n    errorWithCause.toString(),\n    `ServiceError[${errorWithCause.id}]: [internal]: boom; [cause]: Error: Original error`,\n  );\n}\n\n{\n  const multipleIssues = new ServiceError({\n    issues: [\n      {\n        code: ERROR_CODES.badRequest,\n        message: \"Invalid email format\",\n        path: [\"data\", \"attributes\", \"email\"],\n      },\n      {\n        code: ERROR_CODES.unprocessableEntity,\n        message: \"Phone number too short\",\n        path: [\"data\", \"attributes\", \"phoneNumber\"],\n      },\n    ],\n    cause: new Error(\"Original error\"),\n  });\n\n  equal(\n    multipleIssues.toString(),\n    `ServiceError[${multipleIssues.id}]: [badRequest]: Invalid email format; [unprocessableEntity]: Phone number too short; [cause]: Error: Original error`,\n  );\n\n  deepEqual(multipleIssues.toJsonApi(), {\n    errors: [\n      {\n        id: multipleIssues.id,\n        status: \"400\",\n        code: \"badRequest\",\n        title: \"Invalid or malformed request\",\n        detail: \"Invalid email format\",\n        source: {\n          pointer: \"/data/attributes/email\",\n        },\n      },\n      {\n        id: multipleIssues.id,\n        status: \"422\",\n        code: \"unprocessableEntity\",\n        title: \"Request failed validation\",\n        detail: \"Phone number too short\",\n        source: {\n          pointer: \"/data/attributes/phoneNumber\",\n        },\n      },\n    ],\n  });\n}\n\n```\n\n### ServiceResult\n\n<!-- prettier-ignore -->\n```ts\n// ./examples/serviceResult.ts\n\nimport { ok } from \"node:assert/strict\";\n\nimport {\n  either as E,\n  ERROR_CODES,\n  failure,\n  type ServiceResult,\n  success,\n} from \"@clipboard-health/util-typescript\";\n\nfunction validateUser(params: { email: string; phone: string }): ServiceResult<{ id: string }> {\n  const { email, phone } = params;\n  const code = ERROR_CODES.unprocessableEntity;\n\n  if (!email.includes(\"@\")) {\n    return failure({ issues: [{ code, message: \"Invalid email format\" }] });\n  }\n\n  if (phone.length !== 12) {\n    return failure({ issues: [{ code, message: \"Invalid phone number\" }] });\n  }\n\n  return success({ id: \"user-123\" });\n}\n\nok(E.isLeft(validateUser({ email: \"invalidEmail\", phone: \"invalidPhoneNumber\" })));\nok(E.isRight(validateUser({ email: \"user@example.com\", phone: \"555-555-5555\" })));\n\n```\n\n### Functional\n\n#### `pipe`\n\n<!-- prettier-ignore -->\n```ts\n// ./examples/pipe.ts\n\nimport { equal } from \"node:assert/strict\";\n\nimport { pipe } from \"@clipboard-health/util-typescript\";\n\nconst result = pipe(\n  \"  hello world  \",\n  (s) => s.trim(),\n  (s) => s.split(\" \"),\n  (array) => array.map((word) => word.charAt(0).toUpperCase() + word.slice(1)),\n  (array) => array.join(\" \"),\n);\n\nequal(result, \"Hello World\");\n\n```\n\n#### `option`\n\n<!-- prettier-ignore -->\n```ts\n// ./examples/option.ts\n\nimport { equal } from \"node:assert/strict\";\n\nimport { option as O, pipe } from \"@clipboard-health/util-typescript\";\n\nfunction double(n: number) {\n  return n * 2;\n}\n\nfunction inverse(n: number): O.Option<number> {\n  return n === 0 ? O.none : O.some(1 / n);\n}\n\nconst result = pipe(\n  O.some(5),\n  O.map(double),\n  O.flatMap(inverse),\n  O.match(\n    () => \"No result\",\n    (n) => `Result is ${n}`,\n  ),\n);\n\nequal(result, \"Result is 0.1\");\n\n```\n\n#### `either`\n\n<!-- prettier-ignore -->\n```ts\n// ./examples/either.ts\n\nimport { equal } from \"node:assert/strict\";\n\nimport { either as E, pipe } from \"@clipboard-health/util-typescript\";\n\nfunction double(n: number): number {\n  return n * 2;\n}\n\nfunction inverse(n: number): E.Either<string, number> {\n  return n === 0 ? E.left(\"Division by zero\") : E.right(1 / n);\n}\n\nconst result = pipe(\n  E.right(5),\n  E.map(double),\n  E.flatMap(inverse),\n  E.match(\n    (error) => `Error: ${error}`,\n    (result) => `Result is ${result}`,\n  ),\n);\n\nequal(result, \"Result is 0.1\");\n\n```\n\n## Local development commands\n\nSee [`package.json`](./package.json) `scripts` for a list of commands.\n","readmeFilename":"README.md"}