{"id":17767323,"url":"https://github.com/jamiebuilds/sarcastic","last_synced_at":"2025-03-15T13:31:16.754Z","repository":{"id":65412189,"uuid":"136841017","full_name":"jamiebuilds/sarcastic","owner":"jamiebuilds","description":"Cast unknown values to typed values","archived":false,"fork":false,"pushed_at":"2018-09-29T09:00:42.000Z","size":41,"stargazers_count":99,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-12T21:02:51.960Z","etag":null,"topics":["assertions","flowtype","normalize"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jamiebuilds.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-06-10T20:05:23.000Z","updated_at":"2024-11-14T09:34:13.000Z","dependencies_parsed_at":"2023-01-22T07:35:14.264Z","dependency_job_id":null,"html_url":"https://github.com/jamiebuilds/sarcastic","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiebuilds%2Fsarcastic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiebuilds%2Fsarcastic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiebuilds%2Fsarcastic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamiebuilds%2Fsarcastic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jamiebuilds","download_url":"https://codeload.github.com/jamiebuilds/sarcastic/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243293794,"owners_count":20268142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assertions","flowtype","normalize"],"created_at":"2024-10-26T20:46:11.372Z","updated_at":"2025-03-15T13:31:16.342Z","avatar_url":"https://github.com/jamiebuilds.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sarcastic\n\n\u003e Cast unknown values to typed values\n\n- Asserts that a value matches the defined type\n- Returns a typed value\n- Copies the value for type safety\n\n## Install\n\n```sh\nyarn add sarcastic\n```\n\n## Usage\n\n```js\nconst is = require('sarcastic');\n\nconst PKG_SHAPE = is.shape({\n  name: is.string,\n  version: is.string,\n  private: is.default(is.boolean, false),\n  scripts: is.maybe(is.objectOf(is.string)),\n  bin: is.maybe(is.either(is.string, is.arrayOf(is.string))),\n});\n\nlet pkg = is(require('./package.json'), PKG_SHAPE);\n// {\n//   name: \"sarcastic\",\n//   version: \"1.0.0\",\n//   private: false,\n//   scripts: { \"test\": \"ava\" },\n//   bin: null\n// }\n```\n\n**With strict typing:**\n\n```js\nimport is, { type AssertionType } from 'sarcastic';\n\nconst PKG_SHAPE = is.shape({\n  name: is.string,\n  version: is.string,\n  private: is.maybe(is.boolean),\n  scripts: is.maybe(is.objectOf(is.string)),\n  bin: is.maybe(is.either(is.string, is.arrayOf(is.string))),\n});\n\ntype PkgShape = AssertionType\u003ctypeof PKG_SHAPE\u003e;\n\nfunction assertPkg(pkg: mixed): PkgShape {\n  return is(pkg, PKG_SHAPE, 'pkg');\n}\n\nlet pkg = assertPkg(require('./package.json'));\n```\n\n## API\n\n### `is(val, assertion, name?)`\n\n```js\nis(true, is.boolean);\n```\n\nYou can optionally pass a name for the value so that errors are more\ndescriptive:\n\n```js\nis(deepObj, deepShape, 'example');\n// example.pathTo.nestedKeys.withIndexesLike[14]\n```\n\nAlternatively you can pass a formatter as the name which will receive the path\nto the error as strings for keys and numbers for indexes:\n\n```js\nis(deepObj, deepShape, (...keyPath) =\u003e ['example', ...keyPath].join(' \u003e '));\n// example \u003e pathTo \u003e nestedKeys \u003e withIndexesLike \u003e 14\n```\n\n### `is.boolean`\n\n```js\nis(true, is.boolean); // returns true\nis(false, is.boolean); // returns false\nis(42, is.boolean); // throws instanceof is.AssertionError\n```\n\n### `is.number`\n\n```js\nis(42, is.number); // returns 42\nis(NaN, is.number); // returns NaN\nis(true, is.number); // throws instanceof is.AssertionError\n```\n\n### `is.string`\n\n```js\nis(\"\", is.string); // returns \"\"\nis(\"hi\", is.string); // returns \"hi\"\nis(true, is.string); // throws instanceof is.AssertionError\n```\n\n### `is.array`\n\n```js\nis([], is.array); // returns []\nis([1, 2, 3], is.array); // returns [1, 2, 3]\nis({}, is.array); // throws instanceof is.AssertionError\n```\n\n### `is.func`\n\n```js\nis(() =\u003e {}, is.func); // returns () =\u003e {}\nis({}, is.func); // throws instanceof is.AssertionError\nis(/regex/, is.func); // throws instanceof is.AssertionError\n```\n\n### `is.object`\n\n```js\nis({}, is.object); // returns {}\nis({ foo: true }, is.object); // returns { foo: true }\nis([], is.object); // throws instanceof is.AssertionError\nis(null, is.object); // throws instanceof is.AssertionError\n```\n\n### `is.arrayOf(assertion)`\n\n```js\nis([], is.arrayOf(is.number)); // returns []\nis([1, 2, 3], is.arrayOf(is.number)); // returns [1, 2, 3]\nis({}, is.arrayOf(is.number)); // throws instanceof is.AssertionError\nis([\"hi\"], is.arrayOf(is.number)); // throws instanceof is.AssertionError\n```\n\n### `is.arrayish(assertion)`\n\n```js\nis(1, is.arrayish(is.number)); // returns [1]\nis([], is.arrayish(is.number)); // returns []\nis([1, 2, 3], is.arrayish(is.number)); // returns [1, 2, 3]\nis(\"hi\", is.arrayish(is.number)); // throws instanceof is.AssertionError\nis({}, is.arrayish(is.number)); // throws instanceof is.AssertionError\nis([\"hi\"], is.arrayish(is.number)); // throws instanceof is.AssertionError\n```\n\n### `is.objectOf(assertion)`\n\n```js\nis({}, is.objectOf(is.boolean)); // returns {}\nis({ foo: true }, is.objectOf(is.boolean)); // returns { foo: true }\nis([], is.objectOf(is.boolean)); // throws instanceof is.AssertionError\nis(null, is.objectOf(is.boolean)); // throws instanceof is.AssertionError\nis({ foo: 42 }, is.objectOf(is.boolean)); // throws instanceof is.AssertionError\n```\n\n### `is.shape({ [key: string]: assertion })`\n\n```js\nlet myShape = is.shape({ foo: is.boolean });\n\nis({ foo: true }, myShape); // returns { foo: true\nis({ foo: true, bar: false }, myShape); // returns { foo: true }\nis([], myShape); // throws instanceof is.AssertionError\nis(null, myShape); // throws instanceof is.AssertionError\nis({ foo: 42 }, myShape); // throws instanceof is.AssertionError\n```\n\n### `is.maybe(assertion)`\n\n```js\nis(undefined, is.maybe(is.boolean)); // returns null\nis(null, is.maybe(is.boolean)); // returns null\nis(true, is.maybe(is.boolean)); // returns true\nis(42, is.maybe(is.boolean)); // throws instanceof is.AssertionError\n```\n\n### `is.default(assertion, defaultValue)`\n\n```js\nis(undefined, is.default(is.number, 42)); // returns 42\nis(null, is.default(is.number, 42)); // returns 42\nis(3.14, is.default(is.number, 42)); // returns 3.14\nis(\"hi\", is.default(is.number, 42)); // throws instanceof is.AssertionError\n```\n\n### `is.either(assertionA, assertionB)`\n\n```js\nis(true, is.either(is.boolean, is.string)); // returns true\nis(\"hi\", is.either(is.boolean, is.string)); // returns \"hi\"\nis(42, is.either(is.boolean, is.string)); // throws instanceof is.AssertionError\n```\n\n### `is.AssertionError`\n\n```js\ntry {\n  is(true, is.number);\n} catch (err) {\n  if (err instanceof is.AssertionError) {\n    // an assertion error\n  } else {\n    // some other unexpected error\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamiebuilds%2Fsarcastic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjamiebuilds%2Fsarcastic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamiebuilds%2Fsarcastic/lists"}