json-combiner
json-combiner is a tool that ingests a folder of source files to produce a single JSON file with the same structure as the source folder. json-combiner will take the following types of files:
- .json - Standard JS comments are stripped out of these files
- .json5 - https://json5.org/
- .js - Uses Node's
require()
to load the file. See below. - .ts - Uses ts-node and Node's
require()
to load the file. See below.
Installation
npm install json-combiner
Usage:
-s, --src Source to folder of files to combine
-o, --out Output JSON path (single file)
-m, --minify If the output file should be minified. Default is false.
json-combiner -s ./configSrc/ -o ./lib/config.json
Examples
Assuming we have the following source JSON files:
src/foo.json
:
src/bar.json
:
Will generate the following JSON file as output:
Merging of Files and Folders
If a .json file and a folder share the same name, they will be merged into one object when the JSON is concatenated. Assuming we have the following source JSON files:
src/foo.json
:
src/foo/bar.json
:
Will generate the following JSON file as output:
Folder-as-Array Example
The contents of a folder can be grouped together as an array. The folder name must end in '[]'. For the files
src/foo[]/foo1.json
:src/foo[]/foo2.json
:src/foo[]/foo3.json
:
"foo": //contents of foo1.json... //contents of foo2.json... //contents of foo3.json...
Note, that the .json files in an array folder do not retain their file names as keys, since they are now array index items.
Handling JavaScript files
A JavaScript file will be required (require()
), and the module export (module.exports = ...
)
will be used as the object to be stringified. If the module export is a function, then that
function will be called to obtain the result - if you need to do async stuff then return a promise
from your function.
moduleexports = TWO_PI: MathPI * 2 foo: "bar";
module { return { let rtn = ; forlet i = 100; i > 50; --i rtn; //The return value here is the final result, which saves us from having to make our array //of integer values from 100 to 51 by hand. ; };};
Handling TypeScript files
A TypeScript file will be required (require()
) using ts-node
, and the module export (export = ...
)
will be used as the object to be stringified. If the module export is a function, then that
function will be called to obtain the result - if you need to do async stuff then return a promise
from your function.
NOTE: ts-node
is a peer dependency, you must provide the version you wish to use.
;
Code as Text
If for some reason you want to have JavaScript code inserted into your JSON as a string, use a file
with a .text.js
or .text.ts
(must provide your version of TypeScript) extension. The JavaScript
code will be added to the output as a string instead of running the code for a result.
Credits
This was originally implemented in https://github.com/SpringRoll/grunt-concat-json