{"_id":"@amilajack/merge-configs","_rev":"1-29b0b0c7ec558ae2fbe44bb9cd05d7c4","name":"@amilajack/merge-configs","dist-tags":{"latest":"0.0.1-alpha.0"},"versions":{"0.0.1-alpha.0":{"name":"@amilajack/merge-configs","version":"0.0.1-alpha.0","main":"lib/index.js","scripts":{"build":"cross-env NODE_ENV=production babel src --out-dir lib --source-maps inline","test":"mocha tests/test-*","watch":"npm-watch"},"dependencies":{"lodash":"^4.17.11"},"devDependencies":{"copy-webpack-plugin":"^4.6.0","mocha":"^5.2.0","webpack":"^1.15.0"},"gitHead":"e5a305fa25b145958302af191c4c7ec7e0551368","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":"@amilajack/merge-configs@0.0.1-alpha.0","_nodeVersion":"11.13.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-HPgXmbu60o3gQmu2PecS60WQoqqscsYAZsLmXzEMvFvow4I6VWhVCzYuooICEN6Pw8PiOvZ4NWvkhIbVMRa0gA==","shasum":"16d6cff873b623d00e6d60a28ed5e547c0b976ec","tarball":"https://registry.npmjs.org/@amilajack/merge-configs/-/merge-configs-0.0.1-alpha.0.tgz","fileCount":6,"unpackedSize":54627,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcsjvBCRA9TVsSAnZWagAABrcP/i2Z0ufn+23UELJtNTcC\nDw9i5pgsgXQBc5pLhR8/WpAon5z7X/BEVBN2a8WY23LzbpHqZ2z72IW5hBwH\ntYoRXFVypFuJ26n+U8da5lmMXUltenyx9td4X8sWlQcsZWzEyI/6CCrS4Spr\nJNKjiuUzincDxYwB7APLNmxqtYv4vu1nNp05L4ETx+M6y+H3luiQJ7gjLw8+\nutPRKncFV1o+9/IUTK9MAyY8AF7wuueCiIV0e+3gVPHJurbTtaAq49cDYPg0\nYuX46cx/5KDaoIoU6lmm8KtBYrb/L6q4MlFyI/3jg3niIeBEICkqiXX74U8V\nuyTTwrvQvBTpJc4ZA6Az43p5mpMDkmQG2TzQFC7MmvpRb1+4ZbyV7dov9O/U\nX+xOkKGl8veagtEiNcFq3o3z5ABnfvbmIpZO0tn+b0qK4M6g03tSaE6hAfbR\nbmxSafBc1w7E8qxhJnndRxcMFHlLwUotNCSAHlKKmwNYT1CnFnwSmPXFT50A\nZd7AkrPE8NFWPJwVLTqb2gt3tGNvCeb/Byvzs1W4w3GIzDW3VPM0B6ZK14H/\nBb4ZJEJlV7lsBCS0lo1sh0CuPybTKEDnsjPRp5o1GiC+VVxpwrRuR+O2l4WL\neoz7UOBxmj/CmCM8NP/EQmi6xJsvy6h1dRwwAxvJ4YqeHDCzuKlxT1qT8sFk\n+ies\r\n=So2/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjK3VuCP1oowrl6QGZANf68gzJDJKwc6qwrUHAAyNCnAIgNC2u5Zo7NvXNVgStkpXlW5fXwtUMQ5EGWdKRq94yHDk="}]},"maintainers":[{"name":"amilajack","email":"amilajack@gmail.com"}],"_npmUser":{"name":"amilajack","email":"amilajack@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/merge-configs_0.0.1-alpha.0_1555184576384_0.21031453429721525"},"_hasShrinkwrap":false}},"time":{"created":"2019-04-13T19:42:56.159Z","0.0.1-alpha.0":"2019-04-13T19:42:56.526Z","modified":"2022-04-04T13:48:45.670Z"},"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","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```javascript\n// Default API\nvar output = merge(object1, object2, object3, ...);\n\n// You can pass an array of objects directly.\n// This works with all available functions.\nvar 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```javascript\n// Customizing array/object behavior\nvar output = merge(\n  {\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  }\n)(object1, object2, object3, ...);\n```\nFor example, if the previous code was invoked with only `object1` and `object2`\nwith `object1` as:\n```\n{\n    foo1: ['object1'],\n    foo2: ['object1'],\n    bar1: { object1: {} },\n    bar2: { object1: {} },\n}\n```\nand `object2` as:\n```\n{\n    foo1: ['object2'],\n    foo2: ['object2'],\n    bar1: { object2: {} },\n    bar2: { object2: {} },\n}\n```\nthen `customizeArray` will be invoked for each property of `Array` type, i.e:\n```\ncustomizeArray(['object1'], ['object2'], 'foo1');\ncustomizeArray(['object1'], ['object2'], 'foo2');\n```\nand `customizeObject` will be invoked for each property of `Object` type, i.e:\n```\ncustomizeObject({ object1: {} }, { object2: {} }, bar1);\ncustomizeObject({ object1: {} }, { object2: {} }, bar2);\n```\n\n### **`merge.unique(<field>, <fields>, field => field)`**\n\n```javascript\nconst output = merge({\n  customizeArray: merge.unique(\n    'plugins',\n    ['HotModuleReplacementPlugin'],\n    plugin => plugin.constructor && plugin.constructor.name\n  )\n})({\n  plugins: [\n    new webpack.HotModuleReplacementPlugin()\n  ]\n}, {\n  plugins: [\n    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```javascript\n// Merging with a specific merge strategy\nvar output = merge.strategy(\n  {\n    entry: 'prepend', // or 'replace', defaults to 'append'\n    'module.rules': 'prepend'\n  }\n)(object1, object2, object3, ...);\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```javascript\nvar output = merge.smartStrategy(\n  {\n    entry: 'prepend', // or 'replace'\n    'module.rules': 'prepend'\n  }\n)(object1, object2, object3, ...);\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```javascript\nvar path = require('path');\nvar merge = require('webpack-merge');\n\nvar TARGET = process.env.npm_lifecycle_event;\n\nvar common = {\n  entry: path.join(__dirname, 'app'),\n  ...\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    ...\n  });\n}\n\nif(TARGET === 'build') {\n  module.exports = merge(common, {\n    ...\n  });\n}\n\n...\n```\n\n**Loader string values `loader: 'babel'` override each other.**\n\n```javascript\nmerge.smart({\n  loaders: [{\n    test: /\\.js$/,\n    loader: 'babel'\n  }]\n}, {\n  loaders: [{\n    test: /\\.js$/,\n    loader: 'coffee'\n  }]\n});\n// will become\n{\n  loaders: [{\n    test: /\\.js$/,\n    loader: 'coffee'\n  }]\n}\n```\n\n**Loader array values `loaders: ['babel']` will be merged, without duplication.**\n\n```javascript\nmerge.smart({\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['babel']\n  }]\n}, {\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['coffee']\n  }]\n});\n// will become\n{\n  loaders: [{\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**Loader array values `loaders: ['babel']` can be reordered by including\noriginal loaders.**\n\n```javascript\nmerge.smart({\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['babel']\n  }]\n}, {\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['react-hot', 'babel']\n  }]\n});\n// will become\n{\n  loaders: [{\n    test: /\\.js$/,\n    // order of second argument is respected\n    loaders: ['react-hot', 'babel']\n  }]\n}\n```\n\nThis also works in reverse - the existing order will be maintained if possible:\n\n```javascript\nmerge.smart({\n  loaders: [{\n    test: /\\.css$/,\n    use: [\n      { loader: 'css-loader', options: { myOptions: true } },\n      { loader: 'style-loader' }\n    ]\n  }]\n}, {\n  loaders: [{\n    test: /\\.css$/,\n    use: [\n      { loader: 'style-loader', options: { someSetting: true } }\n    ]\n  }]\n});\n// will become\n{\n  loaders: [{\n    test: /\\.css$/,\n    use: [\n      { loader: 'css-loader', options: { myOptions: true } },\n      { loader: 'style-loader', options: { someSetting: true } }\n    ]\n  }]\n}\n```\n\nIn the case of an order conflict, the second order wins:\n```javascript\nmerge.smart({\n  loaders: [{\n    test: /\\.css$/,\n    use: [\n      { loader: 'css-loader' },\n      { loader: 'style-loader' }\n    ]\n  }]\n}, {\n  loaders: [{\n    test: /\\.css$/,\n    use: [\n      { loader: 'style-loader' },\n      { loader: 'css-loader' }\n    ]\n  }]\n});\n// will become\n{\n  loaders: [{\n    test: /\\.css$/,\n    use: [\n      { loader: 'style-loader' }\n      { loader: 'css-loader' },\n    ]\n  }]\n}\n```\n\n\n**Loader query strings `loaders: ['babel?plugins[]=object-assign']` will be overridden.**\n\n```javascript\nmerge.smart({\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['babel?plugins[]=object-assign']\n  }]\n}, {\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['babel', 'coffee']\n  }]\n});\n// will become\n{\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['babel', 'coffee']\n  }]\n}\n```\n\n**Loader arrays in source values will have loader strings merged into them.**\n\n```javascript\nmerge.smart({\n  loaders: [{\n    test: /\\.js$/,\n    loader: 'babel'\n  }]\n}, {\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['coffee']\n  }]\n});\n// will become\n{\n  loaders: [{\n    test: /\\.js$/,\n    // appended because Webpack evaluated these from right to left!\n    loaders: ['babel', 'coffee']\n  }]\n}\n```\n\n**Loader strings in source values will always override.**\n\n```javascript\nmerge.smart({\n  loaders: [{\n    test: /\\.js$/,\n    loaders: ['babel']\n  }]\n}, {\n  loaders: [{\n    test: /\\.js$/,\n    loader: 'coffee'\n  }]\n});\n// will become\n{\n  loaders: [{\n    test: /\\.js$/,\n    loader: 'coffee'\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```javascript\nvar path = require('path');\nvar 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\nvar 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"}