{"id":22650667,"url":"https://github.com/data7expressions/config-extends","last_synced_at":"2025-04-12T03:13:35.044Z","repository":{"id":40565840,"uuid":"319524615","full_name":"data7expressions/config-extends","owner":"data7expressions","description":"Allow to extend json or yaml/json files configuration","archived":false,"fork":false,"pushed_at":"2024-09-02T07:18:53.000Z","size":821,"stargazers_count":2,"open_issues_count":5,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-12T03:13:30.320Z","etag":null,"topics":["config","configuration","extend","json","json-files","yaml","yaml-configuration"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/data7expressions.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2020-12-08T04:22:24.000Z","updated_at":"2024-06-07T23:15:03.000Z","dependencies_parsed_at":"2024-04-29T09:26:56.580Z","dependency_job_id":"b38dd4db-aa71-4258-8a66-ea9533a93af3","html_url":"https://github.com/data7expressions/config-extends","commit_stats":{"total_commits":80,"total_committers":5,"mean_commits":16.0,"dds":0.5125,"last_synced_commit":"fe2e8fb9515cb16e1427d646c220d720b2eb663f"},"previous_names":["expr-solver/config-extends","data7expressions/config-extends"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/data7expressions%2Fconfig-extends","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/data7expressions%2Fconfig-extends/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/data7expressions%2Fconfig-extends/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/data7expressions%2Fconfig-extends/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/data7expressions","download_url":"https://codeload.github.com/data7expressions/config-extends/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248510003,"owners_count":21116130,"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":["config","configuration","extend","json","json-files","yaml","yaml-configuration"],"created_at":"2024-12-09T08:36:34.951Z","updated_at":"2025-04-12T03:13:35.019Z","avatar_url":"https://github.com/data7expressions.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"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 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 config-extends\n```\n\n## Usage\n\n### From library for node.js\n\n```javascript\nconst ConfigExtends = require(\"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\u003cscript src=\"config-extends.min.js\"\u003e\u003c/script\u003e\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 =\u003e c: 3\n  - folder2\n    - file1.yaml  content =\u003e _extends: [file,folder1.file1]\n                             d: 1\n    - file2.yaml  content =\u003e _extends: folder2.file1\n                             e: 1\n  - file.yaml     content =\u003e 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","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdata7expressions%2Fconfig-extends","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdata7expressions%2Fconfig-extends","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdata7expressions%2Fconfig-extends/lists"}