{"id":13847408,"url":"https://github.com/nobrainr/morphism","last_synced_at":"2026-04-02T02:17:39.120Z","repository":{"id":11356732,"uuid":"69411407","full_name":"nobrainr/morphism","owner":"nobrainr","description":"⚡ Type-safe data transformer for JavaScript, TypeScript \u0026 Node.js. ","archived":false,"fork":false,"pushed_at":"2024-01-29T10:41:44.000Z","size":6570,"stargazers_count":492,"open_issues_count":35,"forks_count":23,"subscribers_count":10,"default_branch":"next","last_synced_at":"2025-04-01T20:14:10.942Z","etag":null,"topics":["array","automapper","data","flow","fp","functional","functors","javascript","js","mapper","morphism","morphisms","object","parser","typescript"],"latest_commit_sha":null,"homepage":"https://morphism-playground.now.sh/","language":"TypeScript","has_issues":true,"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/nobrainr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2016-09-28T00:56:56.000Z","updated_at":"2025-03-14T18:57:04.000Z","dependencies_parsed_at":"2024-03-17T02:04:44.977Z","dependency_job_id":"38064fab-6b91-4a82-a3ff-f12d797b96b6","html_url":"https://github.com/nobrainr/morphism","commit_stats":{"total_commits":601,"total_committers":9,"mean_commits":66.77777777777777,"dds":0.3643926788685524,"last_synced_commit":"981c30c8f88d377d1c6c36e1440bee9437cc606e"},"previous_names":["emyann/morphism"],"tags_count":58,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobrainr%2Fmorphism","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobrainr%2Fmorphism/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobrainr%2Fmorphism/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nobrainr%2Fmorphism/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nobrainr","download_url":"https://codeload.github.com/nobrainr/morphism/tar.gz/refs/heads/next","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247485852,"owners_count":20946479,"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":["array","automapper","data","flow","fp","functional","functors","javascript","js","mapper","morphism","morphisms","object","parser","typescript"],"created_at":"2024-08-04T18:01:19.275Z","updated_at":"2025-12-12T05:01:57.365Z","avatar_url":"https://github.com/nobrainr.png","language":"TypeScript","readme":"# Morphism\n\n\u003c!-- \u003cdiv style=\"text-align:center\"\u003e\n\u003cimg src=\"https://i.imgur.com/4muW6u2.jpg\" width=\"800px\"\u003e\n\u003c/div\u003e --\u003e\n\n[![Financial Contributors on Open Collective](https://opencollective.com/morphism/all/badge.svg?label=financial+contributors)](https://opencollective.com/morphism) [![npm](https://img.shields.io/npm/v/morphism.svg?style=for-the-badge)][npm-url]\n[![npm bundle size (minified)](https://img.shields.io/bundlephobia/min/morphism.svg?style=for-the-badge)](https://github.com/nobrainr/morphism)\n[![npm](https://img.shields.io/npm/dy/morphism.svg?style=for-the-badge)][trends-url]\n[![CircleCI (all branches)](https://img.shields.io/circleci/project/github/nobrainr/morphism/master.svg?style=for-the-badge)][circleci-url]\n[![Deps](https://img.shields.io/david/nobrainr/morphism.svg?style=for-the-badge)][deps-url]\n\n\u003e In many fields of mathematics, morphism refers to a structure-preserving map from one mathematical structure to another. A morphism **f** with source **X** and target **Y** is written **f : X → Y**. Thus a morphism is represented by an arrow from its **source** to its **target**.\n\n_https://en.wikipedia.org/wiki/Morphism_\n\n- ⚛️ Write your schema once, Transform your data everywhere\n- 0️⃣ Zero dependencies\n- 💪🏽 Typescript Support\n\n---\n\n- [Morphism](#Morphism)\n  - [Getting started](#Getting-started)\n    - [Installation](#Installation)\n    - [Usage](#Usage)\n    - [Example (TypeScript)](#Example-TypeScript)\n  - [Motivation](#Motivation)\n  - [TypeScript integration](#TypeScript-integration)\n  - [Docs](#Docs)\n    - [1. The Schema](#1-The-Schema)\n      - [Schema actions](#Schema-actions)\n      - [Schema Example](#Schema-Example)\n      - [1.1 Using a strict Schema](#11-Using-a-strict-Schema)\n    - [2. Morphism as Currying Function](#2-Morphism-as-Currying-Function)\n      - [API](#API)\n      - [Currying Function Example](#Currying-Function-Example)\n    - [3. Morphism Function as Decorators](#3-Morphism-Function-as-Decorators)\n      - [`toJsObject` Decorator](#toJsObject-Decorator)\n      - [`toClassObject` Decorator](#toClassObject-Decorator)\n      - [`morph` Decorator](#morph-Decorator)\n    - [4. Default export: Morphism object](#4-Default-export-Morphism-object)\n  - [More Schema examples](#More-Schema-examples)\n    - [Flattening or Projection](#Flattening-or-Projection)\n    - [Function over a source property's value](#Function-over-a-source-propertys-value)\n    - [Function over a source property](#Function-over-a-source-property)\n    - [Properties Aggregation](#Properties-Aggregation)\n  - [Registry API](#Registry-API)\n    - [Register](#Register)\n    - [Map](#Map)\n    - [Get or Set an existing mapper configuration](#Get-or-Set-an-existing-mapper-configuration)\n    - [Delete a registered mapper](#Delete-a-registered-mapper)\n    - [List registered mappers](#List-registered-mappers)\n  - [Contribution](#Contribution)\n  - [Similar Projects](#Similar-Projects)\n  - [License](#License)\n\n## Getting started\n\n### Installation\n\n```sh\nnpm install --save morphism\n```\n\nor in the browser\n\n```html\n\u003cscript src=\"https://unpkg.com/morphism/dist/morphism.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  const { morphism, createSchema } = Morphism\n\u003c/script\u003e\n```\n\n### Usage\n\nThe entry point of a **morphism** is the **schema**. The `keys` represent the shape of your **target** object, and the `values` represents one of the several ways to access the properties of the incoming source.\n\n```typescript\nconst schema = {\n  targetProperty: 'sourceProperty'\n};\n```\n\nThen use the `morphism` function along with the **schema** to transform any **source** to your desired **target**\n\n```typescript\nimport { morphism } from 'morphism';\n\nconst source = {\n  _firstName: 'Mirza'\n};\n\nconst schema = {\n  name: '_firstName'\n};\n\nmorphism(schema, source);\n➡\n{\n  \"name\": \"Mirza\"\n}\n```\n\nYou may specify properties deep within the source object to be copied to your desired target by using dot notation in the mapping `value`.\nThis is [one of the actions available](#schema-actions) to transform the source data\n\n```typescript\nconst schema = {\n  foo: 'deep.foo',\n  bar: {\n    baz: 'deep.foo'\n  }\n};\n\nconst source = {\n  deep: {\n    foo: 'value'\n  }\n};\n\nmorphism(schema, source);\n➡\n{\n  \"foo\": \"value\",\n  \"bar\": {\n    \"baz\": \"value\"\n  }\n}\n```\n\nOne important rule of `Morphism` is that **it will always return a result respecting the dimension of the source data.** If the source data is an `array`, morphism will outputs an `array`, if the source data is an `object` you'll have an `object`\n\n```typescript\nconst schema = {\n  foo: 'bar'\n};\n\n// The source is a single object\nconst object = {\n  bar: 'value'\n};\n\nmorphism(schema, object);\n➡\n{\n  \"foo\": \"value\"\n}\n\n// The source is a collection of objects\nconst multipleObjects = [{\n  bar: 'value'\n}];\n\nmorphism(schema, multipleObjects);\n➡\n[{\n  \"foo\": \"value\"\n}]\n```\n\n### Example (TypeScript)\n\n```typescript\nimport { morphism, StrictSchema } from 'morphism';\n\n// What we have\ninterface Source {\n  ugly_field: string;\n}\n\n// What we want\ninterface Destination {\n  field: string;\n}\n\nconst source: Source = {\n  ugly_field: 'field value'\n};\n\n// Destination and Source types are optional\nmorphism\u003cStrictSchema\u003cDestination, Source\u003e\u003e({ field: 'ugly_field' }, source);\n// =\u003e {field: \"field value\"}\n\n// Or\nconst sources = [source];\nconst schema: StrictSchema\u003cDestination, Source\u003e = { field: 'ugly_field' };\nmorphism(schema, sources);\n// =\u003e [{field: \"field value\"}]\n```\n\n▶️ [Test with Repl.it](https://repl.it/@yrnd1/Morphism-Full-Example)\n\n## Motivation\n\nWe live in a era where we deal with mutiple data contracts coming from several sources (Rest API, Services, Raw JSON...). When it comes to transform multiple data contracts to match with your domain objects, it's common to create your objects with `Object.assign`, `new Object(sourceProperty1, sourceProperty2)` or by simply assigning each source properties to your destination. This can result in your business logic being spread all over the place.\n\n`Morphism` allows you to keep this business logic centralized and brings you a top-down view of your data transformation. When a contract change occurs, it helps to track the bug since you just need to refer to your `schema`\n\n## TypeScript integration\n\nWhen you type your schema, this library will require you to specify each transformation for your required fields.\n\n![schema](https://raw.githubusercontent.com/nobrainr/morphism/master/images/schema.png)\n\n![schema-required-fields](https://raw.githubusercontent.com/nobrainr/morphism/master/images/schema-required-fields.png)\n\nThis library uses TypeScript extensively. The target type will be inferred from the defined schema.\n\n![inferred field type](https://raw.githubusercontent.com/nobrainr/morphism/master/images/inferred-field-type.png)\n\nWhen using an [`ActionFunction`](https://morphism.now.sh/modules/morphism#actionfunction) the input type is also inferred to enforce your transformations\n\n![typed action function](https://raw.githubusercontent.com/nobrainr/morphism/master/images/ts-action-function.png)\n\nSee below the different options you have for the schema.\n\n## Docs\n\n📚 **[API documentation](https://morphism.now.sh)**\n\n**`Morphism` comes with 3 artifacts to achieve your transformations:**\n\n### 1. The Schema\n\nA schema is an object-preserving map from one data structure to another.\n\nThe keys of the schema match the desired destination structure. Each value corresponds to an Action applied by Morphism when iterating over the input data.\n\n#### Schema actions\n\nYou can use **4 kind of values** for the keys of your schema:\n\n- [`ActionString`](https://morphism.now.sh/modules/_types_#actionstring): A string that allows to perform a projection from a property\n- [`ActionSelector`](https://morphism.now.sh/interfaces/_types_.actionselector): An Object that allows to perform a function over a source property's value\n- [`ActionFunction`](https://morphism.now.sh/interfaces/_types_.actionfunction): A Function that allows to perform a function over source property\n- [`ActionAggregator`](https://morphism.now.sh/modules/_types_#actionaggregator): An Array of Strings that allows to perform a function over source property\n\n#### Schema Example\n\n```ts\nimport { morphism } from 'morphism';\n\nconst input = {\n  foo: {\n    baz: 'value1'\n  }\n};\n\nconst schema = {\n  bar: 'foo', // ActionString: Allows to perform a projection from a property\n  qux: ['foo', 'foo.baz'], // ActionAggregator: Allows to aggregate multiple properties\n  quux: (iteratee, source, destination) =\u003e {\n    // ActionFunction: Allows to perform a function over source property\n    return iteratee.foo;\n  },\n  corge: {\n    // ActionSelector: Allows to perform a function over a source property's value\n    path: 'foo.baz',\n    fn: (propertyValue, source) =\u003e {\n      return propertyValue;\n    }\n  }\n};\n\nmorphism(schema, input);\n// {\n//   \"bar\": {\n//     \"baz\": \"value1\"\n//   },\n//   \"qux\": {\n//     \"foo\": {\n//       \"baz\": \"value1\"\n//     }\n//   },\n//   \"quux\": {\n//     \"baz\": \"value1\"\n//   },\n//   \"corge\": \"value1\"\n// }\n```\n\n▶️ [Test with Repl.it](https://repl.it/@yrnd1/Morphism-Schema-Options)\n\n⏩ [More Schema examples](#more-schema-examples)\n\n📚 [Schema Docs](https://morphism.now.sh/classes/_morphismtree_.morphismschematree)\n\n#### 1.1 Using a strict Schema\n\nYou might want to enforce the keys provided in your schema using `Typescript`. This is possible using a `StrictSchema`. Doing so will require to map every field of the `Target` type provided.\n\n```ts\ninterface IFoo {\n  foo: string;\n  bar: number;\n}\nconst schema: StrictSchema\u003cIFoo\u003e = { foo: 'qux', bar: () =\u003e 'test' };\nconst source = { qux: 'foo' };\nconst target = morphism(schema, source);\n// {\n//   \"foo\": \"qux\",\n//   \"bar\": \"test\"\n// }\n```\n\n### 2. Morphism as Currying Function\n\nThe simplest way to use morphism is to import the currying function:\n\n```ts\nimport { morphism } from 'morphism';\n```\n\n`morphism` either outputs a mapping function or the transformed data depending on the usage:\n\n#### API\n\n```ts\nmorphism(schema: Schema, items?: any, type?: any): any\n```\n\n\u003c!-- ! Broken link --\u003e\n📚 [Currying Function Docs](https://morphism.now.sh/modules/morphism#morphism-1)\n\n#### Currying Function Example\n\n```ts\n// Outputs a function when only a schema is provided\nconst fn = morphism(schema);\nconst result = fn(data);\n\n// Outputs the transformed data when a schema and the source data are provided\nconst result = morphism(schema, data);\n\n// Outputs the transformed data as an ES6 Class Object when a schema, the source data and an ES6 Class are provided\nconst result = morphism(schema, data, Foo);\n// =\u003e Items in result are instance of Foo\n```\n\n### 3. Morphism Function as Decorators\n\nYou can also use Function Decorators on your method or functions to transform the return value using `Morphism`:\n\n#### `toJsObject` Decorator\n\n```ts\nimport { toJSObject } from 'morphism';\n\nclass Service {\n  @toJSObject({\n    foo: currentItem =\u003e currentItem.foo,\n    baz: 'bar.baz'\n  })\n  async fetch() {\n    const response = await fetch('https://api.com');\n    return response.json();\n    // =\u003e\n    // {\n    //   foo: 'fooValue'\n    //   bar: {\n    //     baz: 'bazValue'\n    //   }\n    // };\n  }\n}\n\n// await service.fetch() will return\n// =\u003e\n// {\n//   foo: 'fooValue',\n//   baz: 'bazValue'\n// }\n\n--------------------------------\n\n// Using Typescript will enforce the key from the target to be required\nclass Target {\n  a: string = null;\n  b: string = null;\n}\nclass Service {\n  // By Using \u003cTarget\u003e, Mapping for Properties `a` and `b` will be required\n  @toJSObject\u003cTarget\u003e({\n    a: currentItem =\u003e currentItem.foo,\n    b: 'bar.baz'\n  })\n  fetch();\n}\n```\n\n#### `toClassObject` Decorator\n\n```ts\nimport { toClassObject } from 'morphism';\n\nclass Target {\n  foo = null;\n  bar = null;\n}\nconst schema = {\n  foo: currentItem =\u003e currentItem.foo,\n  baz: 'bar.baz'\n};\nclass Service {\n  @toClassObject(schema, Target)\n  async fetch() {\n    const response = await fetch('https://api.com');\n    return response.json();\n    // =\u003e\n    // {\n    //   foo: 'fooValue'\n    //   bar: {\n    //     baz: 'bazValue'\n    //   }\n    // };\n  }\n}\n\n// await service.fetch() will be instanceof Target\n// =\u003e\n// Target {\n//   foo: 'fooValue',\n//   baz: 'bazValue'\n// }\n```\n\n#### `morph` Decorator\n\nUtility decorator wrapping `toClassObject` and `toJSObject` decorators\n\n```ts\nimport { toClassObject } from 'morphism';\n\nclass Target {\n  foo = null;\n  bar = null;\n}\nconst schema = {\n  foo: currentItem =\u003e currentItem.foo,\n  baz: 'bar.baz'\n};\nclass Service {\n  @morph(schema)\n  async fetch() {\n    const response = await fetch('https://api.com');\n    return response.json();\n    // =\u003e\n    // {\n    //   foo: 'fooValue'\n    //   bar: {\n    //     baz: 'bazValue'\n    //   }\n    // };\n  }\n  @morph(schema, Target)\n  async fetch2() {\n    const response = await fetch('https://api.com');\n    return response.json();\n  }\n}\n// await service.fetch() will be\n// =\u003e\n// {\n//   foo: 'fooValue',\n//   baz: 'bazValue'\n// }\n\n// await service.fetch() will be instanceof Target\n// =\u003e\n// Target {\n//   foo: 'fooValue',\n//   baz: 'bazValue'\n// }\n```\n\n📚 [Morphism Function as Decorators Docs](https://morphism.now.sh/modules/_morphism_)\n\n### 4. Default export: Morphism object\n\nMorphism comes along with an internal registry you can use to save your schema attached to a specific **ES6 Class**.\n\nIn order to use the registry, you might want to use the default export:\n\n```ts\nimport Morphism from 'morphism';\n```\n\nAll features available with the currying function are also available when using the plain object plus the internal registry:\n\n```typescript\n// Currying Function\nMorphism(schema: Schema, items?: any, type?: any): any\n\n// Registry API\nMorphism.register(type: any, schema?: Schema);\nMorphism.map(type: any, data?: any);\nMorphism.setMapper(type: any, schema: Schema);\nMorphism.getMapper(type);\nMorphism.deleteMapper(type);\nMorphism.mappers\n```\n\n🔗 [Registry API Documentation](#registry-api)\n\n## More Schema examples\n\n### Flattening or Projection\n\n```ts\nimport { morphism } from 'morphism';\n// Source data coming from an API.\nconst source = {\n  foo: 'baz',\n  bar: ['bar', 'foo'],\n  baz: {\n    qux: 'bazqux'\n  }\n};\nconst schema = {\n  foo: 'foo', // Simple Projection\n  bazqux: 'baz.qux' // Grab a value from a deep path\n};\n\nmorphism(schema, source);\n//=\u003e { foo: 'baz', bazqux: 'bazqux' }\n```\n\n▶️ [Test with Repl.it](https://repl.it/@yrnd1/Morphism-Flattening-Projection)\n\n### Function over a source property's value\n\n```ts\nimport { morphism } from 'morphism';\n// Source data coming from an API.\nconst source = {\n  foo: {\n    bar: 'bar'\n  }\n};\nlet schema = {\n  barqux: {\n    path: 'foo.bar',\n    fn: value =\u003e `${value}qux` // Apply a function over the source property's value\n  }\n};\n\nmorphism(schema, source);\n//=\u003e { barqux: 'barqux' }\n```\n\n▶️ [Test with Repl.it](https://repl.it/@yrnd1/Morphism-Function-over-a-source-propertys-value)\n\n### Function over a source property\n\n```ts\nimport { morphism } from 'morphism';\n// Source data coming from an API.\nconst source = {\n  foo: {\n    bar: 'bar'\n  }\n};\nlet schema = {\n  bar: iteratee =\u003e {\n    // Apply a function over the source propery\n    return iteratee.foo.bar;\n  }\n};\n\nmorphism(schema, source);\n//=\u003e { bar: 'bar' }\n```\n\n▶️ [Test with Repl.it](https://repl.it/@yrnd1/Function-over-a-source-property)\n\n### Properties Aggregation\n\n```ts\nimport { morphism } from 'morphism';\n// Source data coming from an API.\nconst source = {\n  foo: 'foo',\n  bar: 'bar'\n};\nlet schema = {\n  fooAndBar: ['foo', 'bar'] // Grab these properties into fooAndBar\n};\n\nmorphism(schema, source);\n//=\u003e { fooAndBar: { foo: 'foo', bar: 'bar' } }\n```\n\n▶️ [Test with Repl.it](https://repl.it/@yrnd1/Morphism-Properties-Aggregation)\n\n## Registry API\n\n📚 [Registry API Documentation](https://morphism.now.sh/classes/_morphismregistry_.morphismregistry)\n\n#### Register\n\nRegister a mapper for a specific type. The schema is optional.\n\n```js\nMorphism.register(type: any, schema?: Schema);\n```\n\n#### Map\n\nMap a collection of objects to the specified type\n\n```ts\nMorphism.map(type: any, data?: any);\n```\n\n#### Get or Set an existing mapper configuration\n\n```ts\nMorphism.setMapper(type: any, schema: Schema);\nMorphism.getMapper(type);\n```\n\n#### Delete a registered mapper\n\n```js\nMorphism.deleteMapper(type);\n```\n\n#### List registered mappers\n\n```js\nMorphism.mappers;\n```\n\n## Contribution\n\n- Twitter: [@renaudin_yann][twitter-account]\n- Pull requests and stars are always welcome 🙏🏽 For bugs and feature requests, [please create an issue](https://github.com/emyann/morphism/issues)\n\n## Similar Projects\n\n- [`io-ts`](https://github.com/gcanti/io-ts)\n- [`joi`](https://github.com/hapijs/joi/)\n- [`object-mapper`](https://www.npmjs.com/package/object-mapper)\n- [`autoMapper-ts`](https://www.npmjs.com/package/automapper-ts)\n- [`C# AutoMapper`](https://github.com/AutoMapper/AutoMapper)\n- [`node-data-transform`](https://github.com/bozzltron/node-json-transform)\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n\u003ca href=\"https://github.com/nobrainr/morphism/graphs/contributors\"\u003e\u003cimg src=\"https://opencollective.com/morphism/contributors.svg?width=890\u0026button=false\" /\u003e\u003c/a\u003e\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/morphism/contribute)]\n\n#### Individuals\n\n\u003ca href=\"https://opencollective.com/morphism\"\u003e\u003cimg src=\"https://opencollective.com/morphism/individuals.svg?width=890\"\u003e\u003c/a\u003e\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/morphism/contribute)]\n\n\u003ca href=\"https://opencollective.com/morphism/organization/0/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/1/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/2/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/3/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/4/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/5/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/6/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/7/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/8/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/morphism/organization/9/website\"\u003e\u003cimg src=\"https://opencollective.com/morphism/organization/9/avatar.svg\"\u003e\u003c/a\u003e\n\n## License\n\nMIT © [Yann Renaudin][twitter-account]\n\n[twitter-account]: https://twitter.com/YannRenaudin\n[npm-image]: https://badge.fury.io/js/morphism.svg?style=flat-square\n[npm-url]: https://npmjs.org/package/morphism\n[deps-url]: https://www.npmjs.com/package/morphism?activeTab=dependencies\n[circleci-url]: https://circleci.com/gh/nobrainr/morphism\n[trends-url]: https://www.npmtrends.com/morphism\n","funding_links":["https://opencollective.com/morphism","https://opencollective.com/morphism/contribute","https://opencollective.com/morphism/organization/0/website","https://opencollective.com/morphism/organization/1/website","https://opencollective.com/morphism/organization/2/website","https://opencollective.com/morphism/organization/3/website","https://opencollective.com/morphism/organization/4/website","https://opencollective.com/morphism/organization/5/website","https://opencollective.com/morphism/organization/6/website","https://opencollective.com/morphism/organization/7/website","https://opencollective.com/morphism/organization/8/website","https://opencollective.com/morphism/organization/9/website"],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnobrainr%2Fmorphism","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnobrainr%2Fmorphism","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnobrainr%2Fmorphism/lists"}