{"id":22356334,"url":"https://github.com/do-/node-subclassable-object-merger","last_synced_at":"2026-01-23T16:03:57.162Z","repository":{"id":250718520,"uuid":"835235433","full_name":"do-/node-subclassable-object-merger","owner":"do-","description":"An Object.assign() generalization with overridable rules","archived":false,"fork":false,"pushed_at":"2024-08-11T07:50:43.000Z","size":43,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-07T07:06:35.783Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/do-.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-29T12:34:50.000Z","updated_at":"2024-11-05T15:35:22.000Z","dependencies_parsed_at":"2024-07-29T17:55:19.742Z","dependency_job_id":null,"html_url":"https://github.com/do-/node-subclassable-object-merger","commit_stats":null,"previous_names":["do-/node-subclassable-object-merger"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-%2Fnode-subclassable-object-merger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-%2Fnode-subclassable-object-merger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-%2Fnode-subclassable-object-merger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-%2Fnode-subclassable-object-merger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/do-","download_url":"https://codeload.github.com/do-/node-subclassable-object-merger/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247737769,"owners_count":20987718,"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":[],"created_at":"2024-12-04T14:09:55.828Z","updated_at":"2026-01-23T16:03:57.088Z","avatar_url":"https://github.com/do-.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![workflow](https://github.com/do-/node-subclassable-object-merger/actions/workflows/main.yml/badge.svg)\n![Jest coverage](./badges/coverage-jest%20coverage.svg)\n\n# Rationale\n\nThe public npm [registry](https://www.npmjs.com/) contains a plethora of modules implementing _deep_ (recursive) alternatives to the standard [Object.assign()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign).\n\nSome of them are basically single functions with fixed logic hardly suitable for any extending, for instance:\n* [deep-object-merger](https://github.com/DavideCometa/Deep-Object-Merger) (just a recursive `Object.assign()`)\n* [multi-merge](https://github.com/eballci/multi-merge) (+something special about Boolean values)\n* [object-merger](https://github.com/jarradseers/object-merger) (never mind Booleans, concatenate arrays)\n\nOthers offer to set up sophisticated custom rules using some languages other than plain ECMAScript:\n* [decorated-merger](https://github.com/neckaros/decorated-merger) (TypeScript Decorations)\n* [json-object-merge](https://github.com/sodaru/json-object-merge) (JSONPath)\n\nThe author of this module needed something very close to the basic naive implementation, but easily customizable by the means of standard ES. This is why `subclassable-object-merger` was created.\n\n# Installation\n```sh\nnpm install subclassable-object-merger\n```\n\n# Usage\n```js\nconst {ObjectMerger} = require ('subclassable-object-merger')\nconst om = new ObjectMerger (\n//{override: [\n//  'scalar',\n//  'array',\n//  'object',\n//]}\n)\n\nconst t1 = {\n\tname: 'users',\n\tlabel: 'System users',\n\tcolumns: {\n\t\tid: {TYPE: 'int'},\n\t},\n\tdata: [\n\t\t{id: 1, label: 'admin'}\n\t],\n\ttriggers: null,\n}\n\nconst t2 = {\n\tname: 'users',\n\tlabel: undefined,\n\tcolumns: {\n\t\tid: {AUTO_INCREMENT: true},\n\t\tlabel: {TYPE: 'text'},\n\t},\n\tpk: 'id',\n\tdata: [\n\t\t{id: 2, label: 'employee'}\n\t],\n\ttriggers: {before_insert: 'RETURN;'},\n}\n\nom.merge (t1, t2) /* result:\n{\n\tname: 'users',\n\tlabel: 'System users',\n\tpk: 'id',\n\tcolumns: {\n\t\tid:    {TYPE: 'int', AUTO_INCREMENT: true},\n\t\tlabel: {TYPE: 'text'},\n\t},\n\tdata: [\n\t\t{id: 1, label: 'admin'},\n\t\t{id: 2, label: 'employee'}\n\t],\n\ttriggers: {before_insert: 'RETURN;'},\n})\n*/\n```\n## Constructor\nMay be invoked without parameters or with a single `{override}` object. \n\n### The `override` option\nWhen set, `override` must be an array of type names (see `getType ()` below) to be forcibly overridden in case of conflict.\n\nIn particular, setting `{override: ['scalar']}` will lead to `merge ({name: 'specific'}, {name: 'default'})` into `{name: 'specific'}` instead of throwing an error.\n\n# Internals\n## Instance properties\nThe only property is `sum`: the object mapping type names to corresponding type specific adding functions. Simply put:\n```js\nthis.sum = {\n  array: (a, b) =\u003e a.concat (b),\n  object: (a, b) =\u003e this.merge (a, b),\t\t\t\n  scalar: (a, b) =\u003e a === b ? a : throw Error ()\n}\n```\nWith the `override` option, `a =\u003e a` is set for types listed therein.\n\n## Methods\n### getType (a)\nFor a given non-null `a`, returns:\n* `'array'` if `Array.isArray (a)`\n* `'object'` if `typeof a === 'object'` (no advanced checker like [`is-plain-obj`](https://github.com/sindresorhus/is-plain-obj#is-plain-obj) nor [`is-plain-object`](https://github.com/jonschlinkert/is-plain-object) is in use here)\n* `'scalar'` otherwise (e. g. for function valued `a`)\n\n### add (a, b, k)\nDoes the main job here: calls `getType` for `a` and `b` and if the results are the same, merges `b` into `a`; otherwise, throws an error.\n\nWhen `a` or `b` is `null` or `undefined`, returns the other argument (which may be `null` or `undefined` too).\n\nThe `k` parameter is a name of the outer objects properties whose values are `a` and `b`. It doesn't affect the result, but may appear in error messages. Descendant classes may use this argument for some special needs.\n\n### merge (a, b)\nThis top level method copies `b`'s content into `a` by calling `add` for each of `b`'s keys. Both `a` and `b` must be plain Objects.\n\n## Events\nObjectMerger inherits from [EventEmitter](https://nodejs.org/api/events.html#class-eventemitter). Though never using this feature on its own, it may be used as a message box by containing processes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdo-%2Fnode-subclassable-object-merger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdo-%2Fnode-subclassable-object-merger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdo-%2Fnode-subclassable-object-merger/lists"}