{"_id":"@alpaca-travel/object-assign-reducer","_rev":"4-d6fe3524ed57d693f9f761abb465a198","name":"@alpaca-travel/object-assign-reducer","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.1":{"name":"@alpaca-travel/object-assign-reducer","version":"1.0.1","main":"src/index.js","license":"MIT","scripts":{"test":"jest","test:coverage":"jest --coverage"},"env":{"jest":true},"devDependencies":{"jest":"^26.0.1"},"dependencies":{"@alpaca-travel/fexp-js-lang":"^1.0.0-alpha.0","@alpaca-travel/fexp-js":"^1.0.0-alpha.0","assert":"^2.0.0","lodash.clone":"^4.5.0","lodash.isequal":"^4.5.0"},"gitHead":"2f3aaf03dbc36e1a8cacb624016badbc4dfcc6b7","description":"A utility to reduce an object assignment of properties into a new state.","_id":"@alpaca-travel/object-assign-reducer@1.0.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-4xqhR3GLmumURzp9QXLQ+5pI1jDumGtxpZW4fiLMpglUFBHZRpRje5fsZDnYoCwAYyqarnCnK4UoUgtlzPcidA==","shasum":"020f1d5f01c0b30fc1c3f9e978e149da9772b322","tarball":"https://registry.npmjs.org/@alpaca-travel/object-assign-reducer/-/object-assign-reducer-1.0.1.tgz","fileCount":4,"unpackedSize":9566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4yBvCRA9TVsSAnZWagAARWoP/1c3wwtvQM/ws58WPHbR\nV1xP3JZUNX0WKyFZMuijb0+6PqJ1nDIwhA+jDHmFjs+gsAQG7i04DIinKEgQ\np+7yY4HcXjpkG12LeX5PPHLbprDR4gzQ06BchEMTqNtmA/DN4cCI2cm2mC+f\nuNyXvx2bvjEx5/98ijIjMVasET973eDTxTUqv31GR1sgdrfN5yMqg/+TZveK\njO93F3xWZzahq8zjebihXQrbBcjltbCF4NAPZxHlYt9jZJxN+FknxK2LzC4+\nT29+Fw19lDQ5OzLHFqSHmRxEYASfSp2z4FCukHOrbm7LHKKsAZStHvm1Zbm+\nJ2KbL4bpC70NjV6d6IllfGaCpN97oeUA3ZdpGwomnjatrv6/rkhVMlm19uaO\nhVEyOwds02PW7F/2/71MKgFC3cEhdAp16AqUcucllq4GSelu7u4CV74pFpyh\n8/d5782SlL2rh8QqLLV1YKpIhgUIATj7TjkCjrewA21BLwEhoJV6T4ylTEf2\nkcI1mQeXblDZkZuH7rKJupaAcH+2f3gKSkp5P6YV25pvBiugfLLcyTLGV71i\nqvMppr6y3Uo4K9S4OI1ClMLahTjz7Cc6VQc6dfFsjQmKnLTbeeGcvig/0gCP\n+k1RG0j9Vp+ojlg3v3gxMM/b1tqovMT6hIrRVqOSZtCbrNUih9g9AUOck69z\nLd5k\r\n=0xQb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCT59BMLu8IqNsIMruMkeRIr1ZMRL1n/ik65GeGe6AqdgIhAJuTq2TKEBhYN+ttXtWL2zPorFl6AxcA2JKuuumSYKJT"}]},"maintainers":[{"name":"cammanderson","email":"cameronmanderson@gmail.com"}],"_npmUser":{"name":"cammanderson","email":"cameronmanderson@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/object-assign-reducer_1.0.1_1591943279027_0.7463550357648463"},"_hasShrinkwrap":false},"1.0.2":{"name":"@alpaca-travel/object-assign-reducer","version":"1.0.2","main":"src/index.js","license":"MIT","scripts":{"test":"jest","test:coverage":"jest --coverage"},"env":{"jest":true},"devDependencies":{"jest":"^26.0.1"},"dependencies":{"@alpaca-travel/fexp-js-lang":"^1.0.0-alpha.0","@alpaca-travel/fexp-js":"^1.0.0-alpha.0","assert":"^2.0.0","lodash.clone":"^4.5.0","lodash.isequal":"^4.5.0"},"gitHead":"93e451bef0283b3032020a7fcac088112b39dd08","description":"[![Build Status](https://travis-ci.com/AlpacaTravel/object-assign-reducer.svg?branch=master)](https://travis-ci.com/AlpacaTravel/object-assign-reducer)[![Coverage Status](https://coveralls.io/repos/github/AlpacaTravel/object-assign-reducer/badge.svg?branc","_id":"@alpaca-travel/object-assign-reducer@1.0.2","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-95mDx+k6XJKl/RE/ukUK2RV/8B6MbvqNbZGfntV5/khPWy71sfSFWqcEQU3IHE/ONkpfxAE1L7MlaRibqW5Ngg==","shasum":"a9a465db750e488a91b42b727727cad0c283748f","tarball":"https://registry.npmjs.org/@alpaca-travel/object-assign-reducer/-/object-assign-reducer-1.0.2.tgz","fileCount":4,"unpackedSize":10059,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6FC/CRA9TVsSAnZWagAAJToP/0tc9Ei85QexWX/tHrOo\nJR+CXrvyZ6f3hJxguybkKkqBalzwdeHaTa8iTbzxqbhxR1ryegK/L+ZoYJ/T\nCAY2babHI660HmZ4Yj8TXR3gVbXBkSEvY5Ylf93d9IdYBbZBfI8f92bzMZLI\n7susfrKHXrIwGZoTZNpzscswlTIuhPff0mHaokLpJA1kmBFrUBw4YOuoFkfD\nv0YvxpWcXRod1wmH1IEUajCMC274OFHY86RK/t5FqgV1g4PkKEMUVzYfdITa\n+pkDHgt7/BOTw4Sg0VSJogxMx4tCHjSrOBMfH/aaCWqO0rgdA93miS/mQFBJ\neyTpP7QSZnsCh9ID3BSLmdes5EiyAkCdJ5qrStEiS3oldvVTVXg93VnVzRC9\nzPkyipKQw+avRCXXPsi5+U9ecSjFGxk0d2yGstR1sRBhJEVIZJJkUu3o1wYG\nAmYSQpEltObdTGTG8b4eA4izakS+U/Ll6cvcyX9l11p0Pq/LdiOhPDxYfPfV\nQiFV44JtHwXyyR3rLfYEMH9ODkeLX91dbc08U1nE2sdShBSQdQoRWpw3Bo95\n1ax9FmYC9PdyOyTnNIdrkOHp4Y68AVAY+hpGUBBmg/vp92/gOTxxEWL79vRP\n/htqhB4x8igVqK1YbmkC/m82L3Vj8QrvebFtqsBLx2ZGwFbr84vvccRjtPE3\nO5Zb\r\n=Eyb8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG3EXTOB9Ja/yi5o0DKVhPIEczW82B4FyiHumHYqLYeaAiBOjKBaF0JC+MBVGKXlf3Bh3xbBKc8gDcTpd6xG1mfMpg=="}]},"maintainers":[{"name":"cammanderson","email":"cameronmanderson@gmail.com"}],"_npmUser":{"name":"cammanderson","email":"cameronmanderson@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/object-assign-reducer_1.0.2_1592283326385_0.44886479400969304"},"_hasShrinkwrap":false},"1.0.3":{"name":"@alpaca-travel/object-assign-reducer","version":"1.0.3","main":"src/index.js","license":"MIT","scripts":{"test":"jest","test:coverage":"jest --coverage"},"env":{"jest":true},"devDependencies":{"@alpaca-travel/fexp-js-lang":"^1.0.0-alpha.0","@alpaca-travel/fexp-js":"^1.0.0-alpha.0","jest":"^26.0.1"},"dependencies":{"assert":"^2.0.0","lodash.clone":"^4.5.0","lodash.isequal":"^4.5.0"},"gitHead":"a9a0c730e59f420d56bfcc423b49d9d9131cfa4e","description":"[![Build Status](https://travis-ci.com/AlpacaTravel/object-assign-reducer.svg?branch=master)](https://travis-ci.com/AlpacaTravel/object-assign-reducer)[![Coverage Status](https://coveralls.io/repos/github/AlpacaTravel/object-assign-reducer/badge.svg?branc","_id":"@alpaca-travel/object-assign-reducer@1.0.3","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-mbLCBiyR/LrucpH5ex9HamvgjJGNhpiY7EOBGZxikSCEYDTnkUTSwYOg+ZAMHPIm2vEyH0P/d3YVS7k2usR+Jg==","shasum":"1785f206d91c9253ed79b64528d2a88d481f32e1","tarball":"https://registry.npmjs.org/@alpaca-travel/object-assign-reducer/-/object-assign-reducer-1.0.3.tgz","fileCount":4,"unpackedSize":10059,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6GKoCRA9TVsSAnZWagAAZLMP/0pQvbzm2r0CU43qVva7\n4FF3CDTlhY7N8sixwVpsHCcEqqJHmZQ4+5WimhR8I3L5ceXPC63YMycd3Tyn\nClvIjxFlIM7Nf8fpDs1F5n2e87HQuIJMptDYr++XDB/46pWbPhe/1OzAYuXN\nKdWS009Rk6Ikm6Jds+3qVlbUQ9lyfRQ9hMKoiwi6vZSj+LcihZ5fhlq9dp4J\nNiUwsxGQL2KMTowuaH6XYbweR2/cPhUDPS3OJFGXEXEeC8J36zE7ZtxqE6vn\nVAjsSsa6akZQmWkCVO02P67FkuVqTU78B0IuozsoLOGuGtRdi2GdzqixAXOo\nDAv631kXWFip4uENhDq0iTMirlIVU22JsOa1Rxt4DceN+GUcrTvx4GVaiuHE\nBKupj/LZPCxpmmWRUHe4jVnNSNGUueYhXv2N9GBuNPo84c00jAfhJjPwmnyS\nFlo64rgXrFhHV+Ec+HKtylWO0GHNsi6QiZy0gtYqetSEykmmw37Ld4ZKfALC\nyeGVe3sOZp1nswTWdRm44emqQR+jetNu/k0U/VmYsmIj5b5sDn93CwqvsJwS\nrFSwXl5fZuPJM++cvkiZS7jAESZysE1hMWkpw4CidH40HyMkRaaDqo8EDJMU\n4mb1jBI8UsM8tQSnD2MAY/uA3bRubksluBLGDGxbQIYjr+yzegWsx3fdNyl+\nvAte\r\n=RSjd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEjuQ4+SKjxMNt24Wfed+J33gLtbvS4vf4g9VBSuo17zAiEAvRNVCxsfySIMAX7Ax9h9UaYgpItKqsG6Li4LM/OCHAQ="}]},"maintainers":[{"name":"cammanderson","email":"cameronmanderson@gmail.com"}],"_npmUser":{"name":"cammanderson","email":"cameronmanderson@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/object-assign-reducer_1.0.3_1592287912451_0.44585201588093937"},"_hasShrinkwrap":false},"1.0.4":{"name":"@alpaca-travel/object-assign-reducer","version":"1.0.4","main":"src/index.js","license":"MIT","scripts":{"test":"jest","test:coverage":"jest --coverage"},"env":{"jest":true},"devDependencies":{"@alpaca-travel/fexp-js-lang":"^1.0.0-alpha.0","@alpaca-travel/fexp-js":"^1.0.0-alpha.0","jest":"^26.0.1"},"dependencies":{"lodash.clone":"^4.5.0","lodash.isequal":"^4.5.0"},"gitHead":"5612994cefd1456c3a0e96043cd36f0ff43d5095","description":"[![Build Status](https://travis-ci.com/AlpacaTravel/object-assign-reducer.svg?branch=master)](https://travis-ci.com/AlpacaTravel/object-assign-reducer)[![Coverage Status](https://coveralls.io/repos/github/AlpacaTravel/object-assign-reducer/badge.svg?branc","_id":"@alpaca-travel/object-assign-reducer@1.0.4","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-2jajjSpK3lIkngkWiC4JseVQo/qt+dMXFvzhJ5pcCDBvmNZh8H0aJBs8Of+SIOT9DMXRmezBMUjEtFcwgaAS2Q==","shasum":"01eac42f7398387cfd9f6daa991b3cece746df8e","tarball":"https://registry.npmjs.org/@alpaca-travel/object-assign-reducer/-/object-assign-reducer-1.0.4.tgz","fileCount":4,"unpackedSize":10094,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6S/aCRA9TVsSAnZWagAAqBoP/0jL8Mp6DAbNL7Soi/gg\nUqbFW1KtUyMEYpt13ureAmKomZLbkRSKOMMTi9dfH71Zdp4SiQ9szZrfc2k+\nsuIim1Idx+prhzMrCWR1JhaFko3aLH8jIua5xOFp4XjWOXo4LEU/9nGxVdu1\nDOm+Z5CECYRPsVqQmYirJPyYsYoZyltM7jDyThG9oET5sWtffcqEKqW1q0V2\nzmL8HFmDo1U+12NoLftxNrkViLZdo3Vt29jMOdPAVhKrWfgrjdVJqjHFF9F8\ni0ihA1nG3nkVqVqc1vRnCFLdqWj4V6yZmelT3aHAcaVi0k+I9hjHgD4f4Ir4\nL+eCvfd75kBdH+x1pWLvNr+YfWYy9Sx51jdUSw1G0FLuoOO+SKiGUy5C6qeC\nxf8HwZhPHO///ioPmGLokAk4Nebu9y/EOBtsW9cZRtiACJaaJSsIWq4LKpRY\nSPIfOHe6rYnl9xz2IaxWehyXYZIf3oeSi8ELpBNTW75qRTZx/CQmPgN89hP6\nom+dLqIdMtkoSMXE/Qcbgdzjv6QeJyZIHUk5TNmcy7f9YaRqWgANbnE1bpwM\n1r58KVTf0WiEm0O7b6PcRGAt1hCo+NzXulEK07Jcn7aw8R4KSwACFofRYYyn\nHolRciXA13c0q94gEEd6sEXDnyFJXnz64n0tLCiriz6grZ+NHgJigarH31c+\nuoMw\r\n=YUzM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC7mnLFmrliQaby6lgYkIkjdNoW89q55IOSiSNPtPxvCgIhAJlcSFpqeeGsxCpuN+blZArAYYfx3t8G5PydkZDsyYRk"}]},"maintainers":[{"name":"cammanderson","email":"cameronmanderson@gmail.com"}],"_npmUser":{"name":"cammanderson","email":"cameronmanderson@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/object-assign-reducer_1.0.4_1592340442198_0.6946770260308679"},"_hasShrinkwrap":false}},"time":{"created":"2020-06-12T06:27:59.027Z","1.0.1":"2020-06-12T06:27:59.165Z","modified":"2022-04-04T13:37:46.945Z","1.0.2":"2020-06-16T04:55:26.597Z","1.0.3":"2020-06-16T06:11:52.579Z","1.0.4":"2020-06-16T20:47:22.349Z"},"maintainers":[{"name":"cammanderson","email":"cameronmanderson@gmail.com"}],"description":"[![Build Status](https://travis-ci.com/AlpacaTravel/object-assign-reducer.svg?branch=master)](https://travis-ci.com/AlpacaTravel/object-assign-reducer)[![Coverage Status](https://coveralls.io/repos/github/AlpacaTravel/object-assign-reducer/badge.svg?branc","license":"MIT","readme":"# Object Assign Reducer\n\n[![Build Status](https://travis-ci.com/AlpacaTravel/object-assign-reducer.svg?branch=master)](https://travis-ci.com/AlpacaTravel/object-assign-reducer)[![Coverage Status](https://coveralls.io/repos/github/AlpacaTravel/object-assign-reducer/badge.svg?branch=master)](https://coveralls.io/github/AlpacaTravel/object-assign-reducer?branch=master)![MIT](https://img.shields.io/npm/l/@alpaca-travel/object-assign-reducer)\n\nA \"hideous\" utility to reduce an object assignment of properties into a new state.\n\nThis exists for a use case where you wish to apply an object property and automatically remove or update other properties based on a set of rules. In this case, we need to be able to target a number of conditions, such as describing edge-cases and compatible states to apply a criteria based on the resulting object.\n\nA couple of special things:\n\n- If the supplied rule matches, but then does not transition the object away from a match, it will throw an error\n- Rules are applied continually until there is no further state transitions\n\n```javascript\nconst { assign } = require(\"@alpaca-travel/object-assign-reducer\");\n\n// State before\nconst state = {\n  category: \"eat\",\n  subCategory: \"restaurant\",\n  tags: [\"tag1\"],\n};\n// Changing state\nconst changeState = { category: \"stay\" };\n\n// We want to eliminate the subcategory on change\n\n// Traditional assign has not subtle rules\n// Object.assign({}, state, apply);\n// { category: stay, subCategory: restaurant }\n\n// Describing rules as collections of match/perform\nconst rules = [\n  {\n    // Setup a matching rules to take the before value, and the after value\n    // Return true when we want to match against this rule\n    match: (before, after) =>\n      // Category does has changed\n      before.category !== after.category &&\n      // Has a subcategory\n      before.subCategory &&\n      after.subCategory,\n\n    // Perform a modification to the object\n    perform: (obj) => {\n      // Poor mans clone\n      const val = JSON.parse(JSON.stringify(obj));\n      delete val.subCategory;\n      return val;\n    },\n  },\n\n  // ... More rules added here\n];\n\nconst value = assign({ rules })(state, changeState);\n// { category: 'stay' }\n```\n\n## Fexp-js Lang Feature\n\nThis is as a complete language enhancement for fexp-js scripting\n\n```javascript\nconst { parse, langs } = require(\"@alpaca-travel/fexp-js\");\nconst stdLang = require(\"@alpaca-travel/fexp-js-lang\");\nconst {\n  lang: newLangFeatures,\n} = require(\"@alpaca-travel/object-assign-reducer\");\n\n// Define this in YAML/JSON, and can be external to your application code\nconst expr = [\n  \"reducer-assign\",\n  // Matcher function\n  [\n    \"fn\",\n    [\n      // All conditions are true in order to perform this action\n      \"all\",\n      // Categories don't match\n      // fn-arg 0 = before\n      // fn-arg 1 = after\n      [\n        \"!=\",\n        [\"get\", \"category\", [\"fn-arg\", 0]],\n        [\"get\", \"category\", [\"fn-arg\", 1]],\n      ],\n      // They have sub-categories\n      [\"exists\", [\"get\", \"subCategory\", [\"fn-arg\", 0]]],\n      [\"exists\", [\"get\", \"subCategory\", [\"fn-arg\", 1]]],\n    ],\n  ],\n  // Action to remove the sub category\n  [\"fn\", [\"remove\", \"subCategory\"]],\n\n  // ... more can go here\n\n  // The context of the second argument\n  [\"fn-arg\", 1],\n];\n\n// Fn now contains all the rules\nconst fn = parse(expr, langs(stdLang, newLangFeatures));\n\n// State before\nconst state = {\n  category: \"eat\",\n  subCategory: \"restaurant\",\n  tags: [\"tag1\"],\n};\n// Changing state\nconst changeState = { category: \"stay\" };\n\nconst result = fn(state, changeState);\n\n// { category: 'eat', tags: ['tag1'] }\n```\n","readmeFilename":"README.md"}