diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..a5f03cd Binary files /dev/null and b/.DS_Store differ diff --git a/cli.js b/cli.js index 2c79279..baba889 100644 --- a/cli.js +++ b/cli.js @@ -4,6 +4,7 @@ const commandLineArgs = require('command-line-args'); const fs = require('fs'); const path = require('path'); const extractMongoSchema = require('./extract-mongo-schema'); +const xlsx = require("xlsx"); const optionDefinitions = [ { name: 'database', alias: 'd', type: String }, @@ -37,7 +38,7 @@ const printUsage = function () { console.log('\textract-mongo-schema -d connection_string -o schema.json'); console.log('\t\t-d, --database string\tDatabase connection string. Example: "mongodb://localhost:3001/meteor".'); console.log('\t\t-o, --output string\tOutput file'); - console.log('\t\t-f, --format string\tOutput file format. Can be "json" or "html-diagram".'); + console.log('\t\t-f, --format string\tOutput file format. Can be "json", "html-diagram" or "xlsx".'); console.log('\t\t-i, --inputJson string\tInput JSON file, to be used instead of --database. NOTE: this will ignore the remainder of input params and use a previously generated JSON file to generate the diagram.'); console.log('\t\t-c, --collection\tComma separated list of collections to analyze. Example: "collection1,collection2".'); console.log('\t\t-a, --array\tComma separated list of types of arrays to analyze. Example: "Uint8Array,ArrayBuffer,Array".'); @@ -175,6 +176,47 @@ const opts = { process.exit(1); } } + if(outputFormat == "xlsx"){ + console.log(args.output); + if(!args.output.endsWith(".xlsx")){ + console.log("Wrong output format [xlsx]"); + process.exit(1); + } + //get all collections + var collections = Object.keys(schema); + var wb = xlsx.utils.book_new(); + //one worksheet per collection + collections.forEach(element => { + var wsName = element; + + // console.log(element); + var wsData = [["Collection", "primaryKey", "type", "structure", "require"]]; + var items = Object.keys(schema[element]);//items in collection + items.forEach( item => { + var props = Object.keys(schema[element][item]); + var itemProperties = { + primaryKey: schema[element][item]["primaryKey"] != "undefined" ? schema[element][item]["primaryKey"] == "undefined" : false, + type: schema[element][item]["type"] != "undefined" ? schema[element][item]["type"] : "undefined", + structure: schema[element][item]["structure"] != "undefined" ? schema[element][item]["structure"] : "undefined", + require: schema[element][item]["required"] != "undefined" ? schema[element][item]["required"] : "undefined" + }; + if(itemProperties.type != "undefined" && itemProperties.type == "Object"){ + itemProperties.structure = JSON.stringify(itemProperties.structure); + } + var data = []; + data.push(item); + data.push(itemProperties.primaryKey); + data.push(itemProperties.type); + data.push(itemProperties.structure); + data.push(itemProperties.require); + wsData.push(data); + }); + // console.log(wsData); + var ws = xlsx.utils.aoa_to_sheet(wsData); + xlsx.utils.book_append_sheet(wb, ws, wsName); + }); + xlsx.writeFile(wb, args.output); + } console.log('Success.'); console.log(''); diff --git a/package-lock.json b/package-lock.json index 94c56cb..1bbe5ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "extract-mongo-schema", - "version": "0.2.9", + "version": "0.2.10", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -48,6 +48,15 @@ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, + "adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", + "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -153,6 +162,16 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "cfb": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz", + "integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==", + "requires": { + "adler-32": "~1.2.0", + "crc-32": "~1.2.0", + "printj": "~1.1.2" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -185,6 +204,22 @@ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, + "codepage": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", + "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", + "requires": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + } + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -254,6 +289,11 @@ } } }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -277,6 +317,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -627,6 +676,11 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -656,6 +710,11 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fflate": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz", + "integrity": "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A==" + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -700,6 +759,11 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" + }, "fs": { "version": "0.0.1-security", "resolved": "http://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", @@ -1305,6 +1369,11 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1531,6 +1600,14 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "requires": { + "frac": "~1.1.2" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -1749,6 +1826,16 @@ "isexe": "^2.0.0" } }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==" + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -1769,6 +1856,23 @@ "requires": { "mkdirp": "^0.5.1" } + }, + "xlsx": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.9.tgz", + "integrity": "sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw==", + "requires": { + "adler-32": "~1.2.0", + "cfb": "^1.1.4", + "codepage": "~1.14.0", + "commander": "~2.17.1", + "crc-32": "~1.2.0", + "exit-on-epipe": "~1.0.1", + "fflate": "^0.3.8", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + } } } } diff --git a/package.json b/package.json index 2b8f8d8..138fa15 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "command-line-args": "^3.0.5", "fs": "0.0.1-security", "mongodb": "^3.5.8", - "path": "^0.12.7" + "path": "^0.12.7", + "xlsx": "^0.16.9" }, "devDependencies": { "eslint": "^5.14.0", diff --git a/tests/createXlsx.js b/tests/createXlsx.js new file mode 100644 index 0000000..504a3de --- /dev/null +++ b/tests/createXlsx.js @@ -0,0 +1,8 @@ +const xlsx = require("xlsx"); + +var wb = xlsx.utils.book_new(); +var wsName = "SheetJS"; +var wsData = [["a", "b", "c"], ["1", "2", "3"]]; +var ws = xlsx.utils.aoa_to_sheet(wsData); +xlsx.utils.book_append_sheet(wb, ws, wsName); +xlsx.writeFile(wb, "out.xlsx"); \ No newline at end of file diff --git a/~$text.xlsx b/~$text.xlsx new file mode 100644 index 0000000..5a93205 Binary files /dev/null and b/~$text.xlsx differ