From 7d42ed12b14e37fb4df20c12201b003465f3224b Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Mon, 14 Jan 2019 16:48:01 +0100 Subject: [PATCH] Add readme template --- Readme.tpl.md | 24 +++++++++++++++++ package-lock.json | 68 ++++++++++++++++++++++++++++++++++++++++++----- package.json | 25 +++++++++-------- updateReadme.ts | 64 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 163 insertions(+), 18 deletions(-) create mode 100644 Readme.tpl.md create mode 100644 updateReadme.ts diff --git a/Readme.tpl.md b/Readme.tpl.md new file mode 100644 index 0000000..7293444 --- /dev/null +++ b/Readme.tpl.md @@ -0,0 +1,24 @@ +# MQTT-Explorer +### Version {{ version }} +See the whole picture of your message queue. +The perfect tool to integrate new services, IoT devices in your network. +This application subscribes to all topics on your MQTT-Server and displays your message queue hierarchy, allowing you to drill-down to the topics that are of interest. + +## Download +The app is prebuilt for Windows ({{windowsTargets}}), Linux ({{linuxTargets}}) and Mac ({{macTargets}}). + +More architectures and package types: [Downloads](https://github.com/thomasnordquist/MQTT-Explorer/releases) + +![screen2](https://user-images.githubusercontent.com/7721625/51109225-dbe22200-17f4-11e9-8f6b-c6a27c07c90e.png) + +## Develop +PRs and issues are welcome + +Install with `npm run install`, build with `npm run build` + +Start with `npm run start` + +The `app` directory contains all the rendering logic, the `backend` directory currently contains the models, tests, connection management. + +## License +Not yet decided which licens exactly, but the basic idea is: "You may do whatever you want with this tool, except sell it." diff --git a/package-lock.json b/package-lock.json index 398323b..49ee9f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -196,6 +196,12 @@ "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", "dev": true }, + "@types/mustache": { + "version": "0.8.32", + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-0.8.32.tgz", + "integrity": "sha512-RTVWV485OOf4+nO2+feurk0chzHkSjkjALiejpHltyuMf/13fGymbbNNFrSKdSSUg1TIwzszXdWsVirxgqYiFA==", + "dev": true + }, "@types/node": { "version": "10.12.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", @@ -414,6 +420,16 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "dev": true, + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -1467,6 +1483,32 @@ } } }, + "follow-redirects": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", + "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -1541,7 +1583,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, @@ -1639,7 +1681,7 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -1852,6 +1894,12 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "is-builtin-module": { "version": "1.0.0", "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", @@ -1924,7 +1972,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -2462,6 +2510,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, + "mustache": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.1.tgz", + "integrity": "sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA==", + "dev": true + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", @@ -3798,7 +3852,7 @@ }, "p-is-promise": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", "dev": true }, @@ -4469,7 +4523,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -5085,7 +5139,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -5117,7 +5171,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, diff --git a/package.json b/package.json index 981504e..19aac1c 100644 --- a/package.json +++ b/package.json @@ -41,23 +41,26 @@ "homepage": "https://github.com", "license": "ISC", "devDependencies": { + "@types/chai": "^4.1.7", + "@types/mocha": "^5.2.5", + "@types/mustache": "^0.8.32", + "@types/node": "^10.12.18", + "@types/sha1": "^1.1.1", + "@types/socket.io": "^2.1.2", + "axios": "^0.18.0", + "chai": "^4.2.0", "electron": "^4.0.0", "electron-builder": "^20.38.4", + "mocha": "^5.2.0", + "mustache": "^3.0.1", + "nyc": "^13.1.0", + "source-map-support": "^0.5.9", "ts-node": "^7.0.1", "tslint": "^5.12.0", "tslint-config-airbnb": "^5.11.1", "tslint-react": "^3.6.0", - "typescript": "^3.2.2", - "@types/chai": "^4.1.7", - "@types/mocha": "^5.2.5", - "@types/node": "^10.12.18", - "@types/sha1": "^1.1.1", - "@types/socket.io": "^2.1.2", - "chai": "^4.2.0", - "mocha": "^5.2.0", - "nyc": "^13.1.0", - "source-map-support": "^0.5.9", - "tslint-strict-null-checks": "^1.0.1" + "tslint-strict-null-checks": "^1.0.1", + "typescript": "^3.2.2" }, "dependencies": { "electron-log": "^2.2.17", diff --git a/updateReadme.ts b/updateReadme.ts new file mode 100644 index 0000000..04e6de1 --- /dev/null +++ b/updateReadme.ts @@ -0,0 +1,64 @@ +import * as mustache from 'mustache' + +import { readFileSync, writeFileSync } from 'fs' + +import axios from 'axios' + +interface Release { + name: string + assets: Asset[] +} + +interface Asset { + name: string + browser_download_url: string +} + +function createUrl(title: string, path: string) { + return `[${title}](${path})` +} + +function fileExtension(file: string): string { + const match = file.match(/\.([a-zA-Z]+)$/) + + return (match && match[1]) || '' +} + +async function createReadme(): Promise { + const release: Release = (await axios.get('https://api.github.com/repos/thomasnordquist/mqtt-explorer/releases/latest')).data + + const linux64 = release.assets.filter(asset => /(x86_64|amd64)\.(AppImage|deb|rpm)$/.test(asset.name)) + const windowsInstaller = release.assets.find(asset => /Setup-.+\.exe$/.test(asset.name)) + const windowsPortable = release.assets.find(asset => /-(?!Setup).+\.exe$/.test(asset.name)) + const macDmg = release.assets.find(asset => /\.dmg$/.test(asset.name)) + + if (linux64.length === 0 || !windowsInstaller || !windowsPortable || !macDmg) { + console.error('failed retrieving') + process.exit(1) + return + } + + const linuxTargets = linux64 + .map(item => createUrl(fileExtension(item.browser_download_url), item.browser_download_url)) + .join(', ') + + const windowsTargets = [ + createUrl('portable', windowsPortable.browser_download_url), + createUrl('installer', windowsInstaller.browser_download_url), + ].join(', ') + + const macTargets = [ + createUrl('dmg', macDmg.browser_download_url), + ].join(', ') + + const template = readFileSync('./Readme.tpl.md').toString() + const rendered = mustache.render(template, { + linuxTargets, + windowsTargets, + macTargets, + version: release.name, + }) + writeFileSync('./Readme.md', rendered) +} + +createReadme()