{"_id":"@alfred/merge-configs","_rev":"2-2a534a6f8102ffab0dfb407750b13834","name":"@alfred/merge-configs","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.2":{"name":"@alfred/merge-configs","version":"0.0.2","license":"MIT","main":"lib/index.js","scripts":{"build":"cross-env NODE_ENV=production babel src --out-dir lib --source-maps inline","test":"jest"},"types":"index.d.ts","dependencies":{"lodash":"^4.17.11"},"devDependencies":{"copy-webpack-plugin":"^6.0.2","mocha":"^8.0.1","terser-webpack-plugin":"^3.0.6","webpack":"^4.41.5"},"gitHead":"72d96a0fdb73099642ca8a7ee73071c659107ad0","eslintConfig":{"rules":{"jest/no-export":"off"}},"description":"[![build status](https://secure.travis-ci.org/survivejs/webpack-merge.svg)](http://travis-ci.org/survivejs/webpack-merge) [![codecov](https://codecov.io/gh/survivejs/webpack-merge/branch/master/graph/badge.svg)](https://codecov.io/gh/survivejs/webpack-mer","_id":"@alfred/merge-configs@0.0.2","_nodeVersion":"13.7.0","_npmVersion":"lerna/3.22.1/node@v13.7.0+x64 (darwin)","_npmUser":{"name":"amilajack","email":"amilajack@gmail.com"},"dist":{"integrity":"sha512-CVxjvu98QCyjIOY0Tw5uUq9L8B01rG3UtjBKCNckYKfeiDpT5yRrlP2D96ggs6xBQ3uUGql2KGbvWsOivagd/w==","shasum":"2e2c2ad6064ac52a97c201627354865aa277bf69","tarball":"https://registry.npmjs.org/@alfred/merge-configs/-/merge-configs-0.0.2.tgz","fileCount":8,"unpackedSize":56372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe7q9jCRA9TVsSAnZWagAA8KsP/jS5SwQc0usfixMRhFKX\nJHJz1zerF/FaXFVwgV6LtGZsdLTXdkdCDtQNq71T3Wayl5VPSeOuMmP1WmNV\nyGf0HMc1mz9OS4Nbx/JtIxnrvW/Rae5qzmuyHkfePpIFTMkQrh//+D0FWYAB\nUhEYXupTrdXM/FD6L7VIMC2mQIT1/HZ2Ia9UjUBU251PsQ6FLIoqNqLSUnEA\nvXT0wJzKj+jswaTHi9Y7lPDNjyXPPeFtQjdQX/l8O4KDhtSiMdaE0EcWnowl\n0SF47AeINJjZv3eU67PWnfANqcZz734Hai5kcYiezJSuvqMVtJwSVS5EwERL\ns1NEDL8Q9FGvNth3PiCUnRcyZypFL/aPi/FJvCoEiwHBhJizGGqCSMnktX0P\nA0g5lbz6UIzpcFWaWiJM5BkEwDJsr4Dphplt8vgLDo31fT9PFDv5hjgZseu1\nvfGO6IFyHuztG58B+BiQm9xVY2fTJQWNe4gUozCu3XXm4MEQYFSX4dHyVATB\ne4kn2OSIrc2nM+g5dAmBCql4WHvZ/joh92N0G+/qTndSud7d9eRr3dKZ2ELJ\nuqEBb+VZmL9Xb70BLdqtdD4qp3PNTv+Zp+WE2pGjlWW8ymqqLqzBD2HajKv5\nyqgAfq2TgcMdhV+cw+/O+8/jr4/TipNzCthCqogOnLWmNogxQ6VkI6eejBQw\nwrIz\r\n=80Z/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCN8GBoahRFWqBB3IjNONpZSjNC52GM45Sf+r0L/RSDgAIgIh3F/dy7GOHDWFYKPQzogL2FimJuqnIRPW3M3w62aB8="}]},"maintainers":[{"name":"amilajack","email":"amilajack@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/merge-configs_0.0.2_1592700771154_0.014673698647409195"},"_hasShrinkwrap":false},"0.0.3":{"name":"@alfred/merge-configs","version":"0.0.3","license":"MIT","main":"lib/index.js","scripts":{"build":"cross-env NODE_ENV=production babel src --out-dir lib --source-maps inline","test":"jest"},"types":"index.d.ts","dependencies":{"lodash":"^4.17.11"},"devDependencies":{"copy-webpack-plugin":"^6.0.2","mocha":"^8.0.1","terser-webpack-plugin":"^3.0.6","webpack":"^4.41.5"},"gitHead":"26c3478fe4fbe4c4093406e3a1593f145ac2cfda","eslintConfig":{"rules":{"jest/no-export":"off"}},"description":"[![build status](https://secure.travis-ci.org/survivejs/webpack-merge.svg)](http://travis-ci.org/survivejs/webpack-merge) [![codecov](https://codecov.io/gh/survivejs/webpack-merge/branch/master/graph/badge.svg)](https://codecov.io/gh/survivejs/webpack-mer","_id":"@alfred/merge-configs@0.0.3","_nodeVersion":"13.7.0","_npmVersion":"lerna/3.22.1/node@v13.7.0+x64 (darwin)","_npmUser":{"name":"amilajack","email":"amilajack@gmail.com"},"dist":{"integrity":"sha512-auV72+DmQ41+lOdcNEp6Pq/p0oZLXqiEuvFQXTXMKneoVb0hXxNeIDE4RCeF971XqacG12y7Bth7MHBQ7yysFA==","shasum":"97744acfc6da98f7abad08e1538b45c7f1c4509e","tarball":"https://registry.npmjs.org/@alfred/merge-configs/-/merge-configs-0.0.3.tgz","fileCount":8,"unpackedSize":56372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe7rQ+CRA9TVsSAnZWagAAjswP/3GGSgOTLnG+A7XTJFgm\ncH6bVCkpIcrd7CJONLtaq0Xsm9SQEySv0lUcPsF/is4jtpd7mA/LIJSYtIUx\ns7gydW3trxDFmJn/3x8VTAAFC8gW+iGmlQYebbywJ+dul12HLMYz3BlxPRIX\nQrrCPsSEDRB1CWyFQI2WCiq4M01Q74+849ew1ImGrp5QPPxmXSoH3e/QqMEp\n/hbUv2/1rIk6Pqys6NC22obrOFS9ordhhdAHvK4WFX2vH0A4na4xiRaNImDP\nOlJa1DQOFh4APy8S+ZqNKFaKPiuVWQVJuoyS51XDmhDdD5BxVH3sjZf62ZJt\nX2xumGQreqDOOOcfAppQaIXA8/8A/sa1Gh967t8My6eC/0w7gWKCRaFhvdNq\nx5rD4sUz8cUPe1YiKc6w7EvPJBcKfJA2PLYPcycQ4YqyjiIlXtsFNLHupdei\n/OMoifG1BHV5P7UEkv0pGlSxLCIrZh7TJBmHEJCTCpzNNptBZ+Q04vchz81z\nydreeqa6K21IpTCR/OWZeW860G/HFIvnMSGguzE8l2m/8icG11xKCB5Vk6fq\nB1IepDGEgcKsjCw7khQrSZHzSoonjwawhgonslxWQVJBRDMYt2cmew/0WY3O\nfA3Vw/Q1rozGaUQjNhzytF5HR7ULs4U7j5tDO1Vl1AW8Ahk6AHixJySWp3lZ\n/rz/\r\n=Juzl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDiihbxd7XHd6RjJolJ+1csd1g/Bsy/C+7llerur5rFuAiBQEig7dsiKdYezVnK8Alktq+Zu1eIdsSr6b402GsJmtA=="}]},"maintainers":[{"name":"amilajack","email":"amilajack@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/merge-configs_0.0.3_1592702013638_0.9213954019894965"},"_hasShrinkwrap":false}},"time":{"created":"2020-06-21T00:52:50.182Z","0.0.2":"2020-06-21T00:52:51.414Z","modified":"2022-04-04T12:49:13.322Z","0.0.3":"2020-06-21T01:13:33.744Z"},"maintainers":[{"name":"amilajack","email":"amilajack@gmail.com"}],"description":"[![build status](https://secure.travis-ci.org/survivejs/webpack-merge.svg)](http://travis-ci.org/survivejs/webpack-merge) [![codecov](https://codecov.io/gh/survivejs/webpack-merge/branch/master/graph/badge.svg)](https://codecov.io/gh/survivejs/webpack-mer","license":"MIT","readme":"[![build status](https://secure.travis-ci.org/survivejs/webpack-merge.svg)](http://travis-ci.org/survivejs/webpack-merge) [![codecov](https://codecov.io/gh/survivejs/webpack-merge/branch/master/graph/badge.svg)](https://codecov.io/gh/survivejs/webpack-merge)\n\n# webpack-merge - Merge designed for Webpack\n\n**webpack-merge** provides a `merge` function that concatenates arrays and merges objects creating a new object. If functions are encountered, it will execute them, run the results through the algorithm, and then wrap the returned values within a function again.\n\nThis behavior is particularly useful in configuring webpack although it has uses beyond it. Whenever you need to merge configuration objects, **webpack-merge** can come in handy.\n\nThere's also a webpack specific merge variant known as `merge.smart` that's able to take webpack specifics into account (i.e., it can flatten loader definitions).\n\n## Standard Merging\n\n### **`merge(...configuration | [...configuration])`**\n\n`merge` is the core, and the most important idea, of the API. Often this is all you need unless you want further customization.\n\n```js\n// Default API\nconst output = merge(object1, object2, object3, ...objs);\n\n// You can pass an array of objects directly.\n// This works with all available functions.\nconst output = merge([object1, object2, object3]);\n```\n\n### **`merge({ customizeArray, customizeObject })(...configuration | [...configuration])`**\n\n`merge` behavior can be customized per field through a curried customization API.\n\n```js\n// Customizing array/object behavior\nconst output = merge({\n  customizeArray(a, b, key) {\n    if (key === \"extensions\") {\n      return _.uniq([...a, ...b]);\n    }\n\n    // Fall back to default merging\n    return undefined;\n  },\n  customizeObject(a, b, key) {\n    if (key === \"module\") {\n      // Custom merging\n      return _.merge({}, a, b);\n    }\n\n    // Fall back to default merging\n    return undefined;\n  }\n})(object1, object2, object3, ...objs);\n```\n\nFor example, if the previous code was invoked with only `object1` and `object2`\nwith `object1` as:\n\n```\n{\n    foo1: ['object1'],\n    foo2: ['object1'],\n    bar1: { 'object1': {} },\n    bar2: { 'object1': {} },\n}\n```\n\nand `object2` as:\n\n```\n{\n    foo1: ['object2'],\n    foo2: ['object2'],\n    bar1: { 'object2': {} },\n    bar2: { 'object2': {} },\n}\n```\n\nthen `customizeArray` will be invoked for each property of `Array` type, i.e:\n\n```js\ncustomizeArray([\"object1\"], [\"object2\"], \"foo1\");\ncustomizeArray([\"object1\"], [\"object2\"], \"foo2\");\n```\n\nand `customizeObject` will be invoked for each property of `Object` type, i.e:\n\n```js\ncustomizeObject({ object1: {} }, { object2: {} }, bar1);\ncustomizeObject({ object1: {} }, { object2: {} }, bar2);\n```\n\n### **`merge.unique(<field>, <fields>, field => field)`**\n\n```js\nconst output = merge({\n  customizeArray: merge.unique(\n    \"plugins\",\n    [\"HotModuleReplacementPlugin\"],\n    plugin => plugin.constructor && plugin.constructor.name\n  )\n})(\n  {\n    plugins: [new webpack.HotModuleReplacementPlugin()]\n  },\n  {\n    plugins: [new webpack.HotModuleReplacementPlugin()]\n  }\n);\n\n// Output contains only single HotModuleReplacementPlugin now.\n```\n\n## Merging with Strategies\n\n### **`merge.strategy({ <field>: '<prepend|append|replace>''})(...configuration | [...configuration])`**\n\nGiven you may want to configure merging behavior per field, there's a strategy variant:\n\n```js\n// Merging with a specific merge strategy\nconst output = merge.strategy({\n  entry: \"prepend\", // or 'replace', defaults to 'append'\n  \"module.rules\": \"prepend\"\n})(object1, object2, object3, ...objs);\n```\n\n### **`merge.smartStrategy({ <key>: '<prepend|append|replace>''})(...configuration | [...configuration])`**\n\nThe same idea works with smart merging too (described below in greater detail).\n\n```js\nconst output = merge.smartStrategy({\n  entry: \"prepend\", // or 'replace'\n  \"module.rules\": \"prepend\"\n})(object1, object2, object3, ...objs);\n```\n\n## Smart Merging\n\n### **`merge.smart(...configuration | [...configuration])`**\n\n_webpack-merge_ tries to be smart about merging loaders when `merge.smart` is used. Loaders with matching tests will be merged into a single loader value.\n\nNote that the logic picks up webpack 2 `rules` kind of syntax as well. The examples below have been written in webpack 1 syntax.\n\n**package.json**\n\n```json5\n{\n  scripts: {\n    start: \"webpack-dev-server\",\n    build: \"webpack\"\n  }\n  // ...\n}\n```\n\n**webpack.config.js**\n\n```js\nconst path = require(\"path\");\nconst merge = require(\"webpack-merge\");\n\nconst TARGET = process.env.npm_lifecycle_event;\n\nconst common = {\n  entry: path.join(__dirname, \"app\"),\n  module: {\n    loaders: [\n      {\n        test: /\\.css$/,\n        loaders: [\"style\", \"css\"]\n      }\n    ]\n  }\n};\n\nif (TARGET === \"start\") {\n  module.exports = merge(common, {\n    module: {\n      // loaders will get concatenated!\n      loaders: [\n        {\n          test: /\\.jsx?$/,\n          loader: \"babel?stage=1\",\n          include: path.join(ROOT_PATH, \"app\")\n        }\n      ]\n    },\n    ...opts\n  });\n}\n\nif (TARGET === \"build\") {\n  module.exports = merge(common, {\n    ...opts\n  });\n}\n\n// ...\n```\n\n**Loader string values `loader: 'babel'` override each other.**\n\n```js\nmerge.smart(\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loader: \"babel\"\n      }\n    ]\n  },\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loader: \"coffee\"\n      }\n    ]\n  }\n);\n// will become\n{\n  loaders: [\n    {\n      test: /\\.js$/,\n      loader: \"coffee\"\n    }\n  ];\n}\n```\n\n**Loader array values `loaders: ['babel']` will be merged, without duplication.**\n\n```js\nmerge.smart(\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loaders: [\"babel\"]\n      }\n    ]\n  },\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loaders: [\"coffee\"]\n      }\n    ]\n  }\n);\n// will become\n{\n  loaders: [\n    {\n      test: /\\.js$/,\n      // appended because Webpack evaluated these from right to left\n      // this way you can specialize behavior and build the loader chain\n      loaders: [\"babel\", \"coffee\"]\n    }\n  ];\n}\n```\n\n**Loader array values `loaders: ['babel']` can be reordered by including\noriginal loaders.**\n\n```js\nmerge.smart(\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loaders: [\"babel\"]\n      }\n    ]\n  },\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loaders: [\"react-hot\", \"babel\"]\n      }\n    ]\n  }\n);\n// will become\n{\n  loaders: [\n    {\n      test: /\\.js$/,\n      // order of second argument is respected\n      loaders: [\"react-hot\", \"babel\"]\n    }\n  ];\n}\n```\n\nThis also works in reverse - the existing order will be maintained if possible:\n\n```js\nmerge.smart(\n  {\n    loaders: [\n      {\n        test: /\\.css$/,\n        use: [\n          { loader: \"css-loader\", options: { myOptions: true } },\n          { loader: \"style-loader\" }\n        ]\n      }\n    ]\n  },\n  {\n    loaders: [\n      {\n        test: /\\.css$/,\n        use: [{ loader: \"style-loader\", options: { someSetting: true } }]\n      }\n    ]\n  }\n);\n// will become\n{\n  loaders: [\n    {\n      test: /\\.css$/,\n      use: [\n        { loader: \"css-loader\", options: { myOptions: true } },\n        { loader: \"style-loader\", options: { someSetting: true } }\n      ]\n    }\n  ];\n}\n```\n\nIn the case of an order conflict, the second order wins:\n\n```js\nmerge.smart(\n  {\n    loaders: [\n      {\n        test: /\\.css$/,\n        use: [{ loader: \"css-loader\" }, { loader: \"style-loader\" }]\n      }\n    ]\n  },\n  {\n    loaders: [\n      {\n        test: /\\.css$/,\n        use: [{ loader: \"style-loader\" }, { loader: \"css-loader\" }]\n      }\n    ]\n  }\n);\n// will become\n{\n  loaders: [\n    {\n      test: /\\.css$/,\n      use: [{ loader: \"style-loader\" }, { loader: \"css-loader\" }]\n    }\n  ];\n}\n```\n\n**Loader query strings `loaders: ['babel?plugins[]=object-assign']` will be overridden.**\n\n```js\nmerge.smart(\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loaders: [\"babel?plugins[]=object-assign\"]\n      }\n    ]\n  },\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loaders: [\"babel\", \"coffee\"]\n      }\n    ]\n  }\n);\n// will become\n{\n  loaders: [\n    {\n      test: /\\.js$/,\n      loaders: [\"babel\", \"coffee\"]\n    }\n  ];\n}\n```\n\n**Loader arrays in source values will have loader strings merged into them.**\n\n```js\nmerge.smart(\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loader: \"babel\"\n      }\n    ]\n  },\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loaders: [\"coffee\"]\n      }\n    ]\n  }\n);\n// will become\n{\n  loaders: [\n    {\n      test: /\\.js$/,\n      // appended because Webpack evaluated these from right to left!\n      loaders: [\"babel\", \"coffee\"]\n    }\n  ];\n}\n```\n\n**Loader strings in source values will always override.**\n\n```js\nmerge.smart(\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loaders: [\"babel\"]\n      }\n    ]\n  },\n  {\n    loaders: [\n      {\n        test: /\\.js$/,\n        loader: \"coffee\"\n      }\n    ]\n  }\n);\n// will become\n{\n  loaders: [\n    {\n      test: /\\.js$/,\n      loader: \"coffee\"\n    }\n  ];\n}\n```\n\n## Multiple Merging\n\n### **`merge.multiple(...configuration | [...configuration])`**\n\nSometimes you may need to support multiple targets, _webpack-merge_ will accept an object where each key represents the target configuration. The output becomes an _array_ of configurations where matching keys are merged and non-matching keys are added.\n\n```js\nconst path = require(\"path\");\nconst baseConfig = {\n  server: {\n    target: \"node\",\n    output: {\n      path: path.resolve(__dirname, \"dist\"),\n      filename: \"lib.node.js\"\n    }\n  },\n  client: {\n    output: {\n      path: path.resolve(__dirname, \"dist\"),\n      filename: \"lib.js\"\n    }\n  }\n};\n\n// specialized configuration\nconst production = {\n  client: {\n    output: {\n      path: path.resolve(__dirname, \"dist\"),\n      filename: \"[name].[hash].js\"\n    }\n  }\n};\n\nmodule.exports = merge.multiple(baseConfig, production);\n```\n\n> Check out [SurviveJS - Webpack and React](http://survivejs.com/) to dig deeper into the topic.\n\n## Development\n\n1. `npm i`\n1. `npm run build`\n1. `npm run watch`\n\nBefore contributing, please open an issue where to discuss.\n\n## License\n\n_webpack-merge_ is available under MIT. See LICENSE for more details.\n","readmeFilename":"README.md"}