{"_id":"@data7expressions/config-extends","name":"@data7expressions/config-extends","dist-tags":{"latest":"5.0.0"},"versions":{"5.0.0":{"name":"@data7expressions/config-extends","version":"5.0.0","description":"Allow to extend yaml or json files configuration","scripts":{"test":"npx jest --config jest-unit-config.json"},"repository":{"type":"git","url":"git+https://github.com/data7expressions/config-extends.git"},"keywords":["json","yaml","extend","extends","config","configuration","inheritance"],"author":{"name":"Flavio Lionel Rita","email":"flaviolrita@hotmail.com"},"license":"MIT","bugs":{"url":"https://github.com/data7expressions/config-extends/issues"},"homepage":"https://github.com/data7expressions/config-extends#readme","publishConfig":{"access":"public"},"main":"index.js","types":"index.d.ts","dependencies":{"@types/js-yaml":"^4.0.9","@data7expressions/h3lp":"^5.0.0","js-yaml":"^4.1.0","minimist":"^1.2.8"},"gitHead":"5bca5aebadf4145a5313a1ddb5427b4cde159c1c","_id":"@data7expressions/config-extends@5.0.0","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-c+uDA9+kB47oQUUTXpY6Iu0+NSa5wtTmmsTBO9+2dOGNdk0jhHgQnx8vA8P1F6mhvuySl/A5xlQHK4t4Uk9Luw==","shasum":"40d77e137165efc367b2758e8b46a475f2f1d7d5","tarball":"https://registry.npmjs.org/@data7expressions/config-extends/-/config-extends-5.0.0.tgz","fileCount":49,"unpackedSize":54486,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDIaddRPOMdDM8nfGR6tgNRvNh5BXq6sE/fd7RHV+gKNwIgPmUDsCWQc8Jm9ai+7rDY+SSsEq6n3Yxauo/SzZAGPdk="}]},"_npmUser":{"name":"flaviolrita","email":"flaviolrita@proton.me"},"directories":{},"maintainers":[{"name":"flaviolrita","email":"flaviolrita@proton.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/config-extends_5.0.0_1783073243994_0.10502956820784148"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-03T10:07:23.795Z","5.0.0":"2026-07-03T10:07:24.119Z","modified":"2026-07-03T10:07:24.347Z"},"maintainers":[{"name":"flaviolrita","email":"flaviolrita@proton.me"}],"description":"Allow to extend yaml or json files configuration","homepage":"https://github.com/data7expressions/config-extends#readme","keywords":["json","yaml","extend","extends","config","configuration","inheritance"],"repository":{"type":"git","url":"git+https://github.com/data7expressions/config-extends.git"},"author":{"name":"Flavio Lionel Rita","email":"flaviolrita@hotmail.com"},"bugs":{"url":"https://github.com/data7expressions/config-extends/issues"},"license":"MIT","readme":"# Config Extends\n\nAllow to extend json or yaml/json files configuration\n\n## Features\n\n- Multiple extension\n- Can be loaded from yaml or json files\n- Can load from a directory including all its files\n- Available from browser and node.js\n- CLI\n\n## Methods\n\n### .extends(source,...args) [synchronously]\n\nThis api allows to extend one or more json objects\n\n- Params:\n  - source : object with extensions defined\n  - args : others sources\n\n### .apply(source,target) [asynchronous]\n\nThis api allows to extend configuration from a file or several files from a path\n\n- Params:\n  - source : path of file or folder\n  - target : file result (optional)\n  \nNote: Only node.js\n\n## Installation\n\n### module for node.js\n\n```Shell\nnpm install @data7expressions/config-extends\n```\n\n### CLI executable\n\nIf you want to extends from CLI, install config-extends globally:\n\n```Shell\nnpm install -g @data7expressions/config-extends\n```\n\n## Usage\n\n### From library for node.js\n\n```javascript\nconst ConfigExtends = require(\"@data7expressions/config-extends\")\n\nlet source ={\n    data : {_extends:'base',d:3,e:4},\n    base: {a:1,b:2}\n};\nlet config = ConfigExtends.extends(source);\nconsole.log(JSON.stringify(config,null,2));\n```\n\n### From library for browsers\n\n```javascript\n<script src=\"config-extends.min.js\"></script>\n\nlet source ={\n    data : {_extends:'base',d:3,e:4},\n    base: {a:1,b:2}\n};\nlet config = ConfigExtends.extends(source);\nconsole.log(JSON.stringify(config,null,2));\n```\n\n### From CLI\n\nextends\n\n```shell\nusage: config-extends extends -s\n\narguments:\n  -s, --source   Input json (serialized).\n```\n\napply\n\n```shell\nusage: config-extends apply -s [-t]\n\narguments:\n  -s, --source   Input path of folder or file.\n  -t, --target   output file (optional).\n```\n\n## Examples\n\n### Simple extension\n\n```javascript\nlet source ={\n    data : {_extends:'base',d:3,e:4},\n    base: {a:1,b:2}\n};\nlet config = ConfigExtends.extends(source);\nconsole.log(JSON.stringify(config,null,2));\n```\n\nresult:\n\n```json\n{\n  \"data\": {\"d\": 3,\"e\": 4,\"a\": 1,\"b\": 2 },\n  \"base\": {\"a\": 1,\"b\": 2}\n}\n```\n\n### Chain extension\n\n```javascript\nlet source ={\n    data: { 1: {_extends:'base',d:3,e:4},\n           2: {_extends:'data.1', f:3,g:4},\n           },\n    base: {a:1,b:2}\n}\nlet config = ConfigExtends.extends(source);\nconsole.log(JSON.stringify(config,null,2));\n```\n\nresult:\n\n```json\n{\n  \"data\": { \n    \"1\":{\"d\": 3,\"e\": 4,\"a\": 1,\"b\": 2 },\n    \"2\":{\"f\": 3,\"g\": 4,\"d\": 3,\"e\": 4,\"a\": 1,\"b\": 2}\n  },\n  \"base\": {\"a\": 1,\"b\": 2}\n}\n```\n\n### Multiple extension\n\n```javascript\nlet source ={\n    data: { 1: {_extends:'base',d:3,e:4},\n            2: {_extends:['base','base2'], f:3,g:4},\n            },\n    base: {a:1,b:2},\n    base2: {h:'a',i:'b'}\n};\nlet config = ConfigExtends.extends(source);\nconsole.log(JSON.stringify(config,null,2));\n```\n\nresult:\n\n```json\n{\n  \"data\": {\n    \"1\": {\"d\": 3,\"e\": 4,\"a\": 1,\"b\": 2},\n    \"2\": {\"f\": 3,\"g\": 4,\"a\": 1,\"b\": 2,\"h\": \"a\",\"i\": \"b\"}\n  },\n  \"base\": {\"a\": 1,\"b\": 2 },\n  \"base2\": {\"h\": \"a\",\"i\": \"b\"}\n}\n```\n\n### apply from path\n\n```javascript\nlet config = await ConfigExtends.apply(path.join(__dirname,'test-1'));\nconsole.log(JSON.stringify(config,null,2));\n```\n\nstructure folder\n\n- test-1\n  - folder1\n    - file1.yaml  content => c: 3\n  - folder2\n    - file1.yaml  content => _extends: [file,folder1.file1]\n                             d: 1\n    - file2.yaml  content => _extends: folder2.file1\n                             e: 1\n  - file.yaml     content => a: 1\n                             b: \"b\"\n\nresult\n\n```json\n{\n  \"file\": { \"a\": 1, \"b\": \"b\" },\n  \"folder1\": { \"file1\": { \"c\": 3 } },\n  \"folder2\": {\n    \"file1\": { \"d\": 1, \"a\": 1, \"b\": \"b\", \"c\": 3 },\n    \"file2\": { \"e\": 1, \"d\": 1, \"a\": 1, \"b\": \"b\", \"c\": 3 }\n  }\n}\n```\n\n### apply from path CLI\n\n```shell\nconfig-extends apply -s ./test/test-1\n```\n\nresult:\n\n```json\n{\n  \"file\": { \"a\": 1, \"b\": \"b\" },\n  \"folder1\": { \"file1\": { \"c\": 3 } },\n  \"folder2\": {\n    \"file1\": { \"d\": 1, \"a\": 1, \"b\": \"b\", \"c\": 3 },\n    \"file2\": { \"e\": 1, \"d\": 1, \"a\": 1, \"b\": \"b\", \"c\": 3 }\n  }\n}\n```\n\n### apply from single file\n\n```javascript\nlet config = await configExtends.apply(path.join(__dirname,'raspberry.yaml'));\nconsole.log(JSON.stringify(config.version,null,2));\n```\n\nraspberry.yaml\n\n```yaml\nversion:\n  PiA:\n    _extends: [family.Pi, model.A]\n  PiB:\n    _extends: [family.Pi, model.B]\n  PiA+:\n    _extends: [family.Pi, model.A]\n    measure: \n      _extends: measure.compact\n  PiB+:\n    _extends: [family.Pi, model.B]\n  Pi2B:\n    measure: \n      _extends: measure.standard\n  Pi3A:\n    _extends: [family.Pi3, model.A]\n  Pi3A+:\n    _extends: [family.Pi3, model.A]\n  Pi3B+:\n    _extends: [family.Pi3, model.B]\n  Pi4B1G:\n    _extends: family.Pi4\n    memory: 1G\n  Pi4B2G:\n    _extends: family.Pi4\n    memory: 2G\n  Pi4B4G:\n    _extends: family.Pi4\n    memory: 4G\n  Pi4B8G:\n    _extends: family.Pi4\n    memory: 8G\nfamily:\n  Pi:\n    wireless: false\n    measure: \n      _extends: measure.standard\n  Pi3:\n    wireless: true\n    measure: \n      _extends: measure.standard    \n  Pi4:\n    _extends: [model.B]\n    wireless: true\n    measure: \n      _extends: measure.standard\nmodel:\n  A:\n    ethernet: false\n  B:\n    ethernet: true    \nmeasure:\n  standard:\n    high: 85.6\n    long: 56.5\n  compact:\n    high: 65\n    long: 56.5  \n```\n\nresult:\n\n```yaml\n{\n    \"PiA\":  {\"wireless\": false,\"measure\": {\"high\": 85.6,\"long\": 56.5 },\"ethernet\": false},\n    \"PiB\":  {\"wireless\": false,\"measure\": {\"high\": 85.6,\"long\": 56.5 },\"ethernet\": true },\n    \"PiA+\": {\"measure\": {\"high\": 85.6,\"long\": 56.5},\"wireless\": false,\"ethernet\": false },\n    \"PiB+\": {\"wireless\": false,\"measure\": {\"high\": 85.6,\"long\": 56.5},\"ethernet\": true },\n    \"Pi2B\": {\"measure\": {\"high\": 85.6,\"long\": 56.5}},\n    \"Pi3A\": {\"wireless\": true,\"measure\": {\"high\": 85.6,\"long\": 56.5},\"ethernet\": false },\n    \"Pi3A+\":{\"wireless\": true,\"measure\": {\"high\": 85.6,\"long\": 56.5},\"ethernet\": false },\n    \"Pi3B+\":{\"wireless\": true,\"measure\": {\"high\": 85.6,\"long\": 56.5},\"ethernet\": true },\n    \"Pi4B1G\":{\"memory\": \"1G\",\"wireless\": true,\"measure\": {\"high\": 85.6,\"long\": 56.5},\"ethernet\": true},\n    \"Pi4B2G\":{\"memory\": \"2G\",\"wireless\": true,\"measure\": {\"high\": 85.6,\"long\": 56.5},\"ethernet\": true},\n    \"Pi4B4G\":{\"memory\": \"4G\",\"wireless\": true,\"measure\": {\"high\": 85.6,\"long\": 56.5 },\"ethernet\": true},\n    \"Pi4B8G\": {\"memory\": \"8G\",\"wireless\": true,\"measure\": {\"high\": 85.6,\"long\": 56.5 },\"ethernet\": true}\n}\n```\n\n## Test\n\n```Shell\nnpm run test\n```\n","readmeFilename":"README.md","_rev":"1-fad77b090ca5bc9601347faac911db60"}