diff --git a/.eslintrc.js b/.eslintrc.js index 0fde5664c792ded72691588d364f9b5d785bc402..c115fa7958874a63bed8477b9cf85344c13d7829 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -22,6 +22,7 @@ module.exports = { 'no-restricted-syntax': 0, 'no-underscore-dangle': 0, 'no-nested-ternary': 0, + 'import/newline-after-import': 0, }, globals: { process: true, diff --git a/index.js b/index.js index 4affb442f913fb0d6ea50df0b06c43ad7a431ca7..2492b0365e272a4ea211b557208e8bed9f35a129 100755 --- a/index.js +++ b/index.js @@ -1,176 +1,16 @@ #!/usr/bin/env node -const moment = require('moment') -const cli = require('cli') -const path = require('path') +const { spawnSync } = require('child_process') const config = require('./sitegin/config') -cli.main(function(args, options) { - console.log(options) - config() - .then(function(obj) { - sitegin(obj.config) - }) - .catch(function(e) { - console.log(e.stack) - process.exit() - }) -}) - -function sitegin(config) { - const options = config.options - require('./sitegin/sitegin')({ - watch: !options.noserver && !options.nowatch, - }) - .then(function onLoad(jobs) { - const sass = require('node-sass') - const fs = require('fs') - - // Main builder function - // If builder is not running - run it - // If it is running - schedule rerun after it finishes - let isRunning = false - let runAgain = false - let first = false - let doSync = function() {} - function run() { - const startTime = moment() - runAgain = false - if (isRunning) { - console.log( - 'Generator is still running. Queing another run after it finishes.', - ) - runAgain = true - return - } - console.log( - '================================================================================', - ) - console.log('Running generator') - isRunning = true - jobs - .run('pipeline', jobs) - .then(function() { - isRunning = false - console.log( - 'Generator finished in', - moment().diff(startTime, 'seconds'), - 'seconds', - ) - doSync() - if (!first) { - first = true - copyStaticFiles( - config.builddir, - config.staticDir, - config.themeDir, - ) - } - if (runAgain) run() - }) - .catch(function(e) { - isRunning = false - console.log( - 'Generator crashed in', - moment().diff(startTime, 'seconds'), - 'seconds', - ) - if (runAgain) run() - if (e.stack) console.log(e.stack) - else console.log(e) - if (config.options.noserver) process.exit(13) - }) - } - - console.log('Sitegin successfully loaded') - run() - - rendersass(config.builddir, config.themeDir) - - if (!options.noserver) { - const sync = require('browser-sync').create() - doSync = function() { - sync.reload('*') - } - sync.init({ - server: { - baseDir: config.builddir, - }, - ui: { - port: options.port + 1, - }, - port: options.port, - }) - - const chokidar = require('chokidar') - // article or theme reload - if (!options.nowatch) { - const watches = [ - path.join(config.sourceDir, 'articles'), - config.themeDir, - ] - console.log('Watching', watches, 'for changes') - chokidar - .watch(watches, { ignoreInitial: true }) - .on('all', function(event, path) { - console.log('Content or theme changed. Rebuilding...') - console.log('Change event:', event, 'on path:', path) - run() - }) - } - - // sitegin reload - jobs.onReload(function() { - console.log('Sitegin reloaded') - run() - }) - } - }) - .catch(function(e) { - console.log(e.stack) - process.exit() - }) -} - -function copyStaticFiles(builddir, staticdir, themedir) { - // STATIC FILES - const fsextra = require('node-fs-extra') - fsextra.copy( - staticdir, - builddir, - function(file) { - return !(file.match('\\.git') || file.match('static/articles')) - }, - function() { - console.log('copy static done') - }, - ) - fsextra.copy(`${staticdir}/articles`, `${builddir}/clanek`, function() { - console.log('copy static/articles done') - }) - fsextra.copy( - `${themedir}/static`, - builddir, - function(file) { - return !file.match('\\.git') - }, - function() { - console.log(`copy ${themedir}/static done`) - }, - ) -} - -function rendersass(builddir, themedir) { - // SASS - const sass = require('node-sass') - const fs = require('fs') - const mkdirp = require('mkdirp') - - sass.render({ file: `${themedir}/sass/style.scss` }, function(err, result) { - if (err === null) { - console.log('compiled sass') - mkdirp(`${builddir}/theme`, () => { - fs.writeFile(`${builddir}/theme/style.css`, result.css, () => {}) - }) - } else console.log('error ', err) - }) -} +;(async () => { + const opts = await config() + if (opts.noserver) { + require('sitegin/index.js') + } else { + opts.spawnSync( + process.argv[0], + ['./node_modules/.bin/nodemon', 'sitegin/index.js'], + { stdio: ['inherit', 'inherit', 'inherit'] }, + ) + } +})() diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000000000000000000000000000000000000..70753939f37cbe78be8ddcdc4c5dea4580f892c2 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,4 @@ +{ + "verbose": true, + "ignore": ["build-debug"] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f011cc194876ba6d6c9e687c232238f4ad0294ca..323f2f347ea947ce1388cb906b960159c6f09206 100644 --- a/package-lock.json +++ b/package-lock.json @@ -243,6 +243,43 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -584,6 +621,80 @@ "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", "dev": true }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -790,6 +901,11 @@ } } }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -908,6 +1024,11 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -938,6 +1059,11 @@ "glob": "^7.1.1" } }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -981,7 +1107,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -989,8 +1114,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "combined-stream": { "version": "1.0.8", @@ -1025,6 +1149,19 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, "confusing-browser-globals": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", @@ -1094,6 +1231,14 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "cross-spawn": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", @@ -1103,6 +1248,11 @@ "which": "^1.2.9" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -1239,6 +1389,19 @@ "esutils": "^2.0.2" } }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, "easy-extender": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", @@ -1876,6 +2039,32 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -2801,6 +2990,11 @@ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -2846,6 +3040,14 @@ } } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "^1.3.4" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2862,6 +3064,24 @@ "minimatch": "~3.0.2" } }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -2940,8 +3160,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.0", @@ -3051,6 +3270,11 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, "ignore-walk": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", @@ -3074,11 +3298,15 @@ "resolve-from": "^4.0.0" } }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { "version": "2.0.0", @@ -3257,6 +3485,14 @@ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "requires": { + "ci-info": "^1.5.0" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -3332,6 +3568,20 @@ "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -3358,6 +3608,19 @@ "lodash.isfinite": "^3.3.2" } }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3372,6 +3635,11 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -3381,6 +3649,16 @@ "has": "^1.0.1" } }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -3603,6 +3881,14 @@ "integrity": "sha1-wzW69gOnfMN/i0Brc7ZGP9vfGr4=", "dev": true }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "^4.0.0" + } + }, "latinize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/latinize/-/latinize-0.4.0.tgz", @@ -3783,6 +4069,11 @@ "signal-exit": "^3.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -3792,6 +4083,21 @@ "yallist": "^2.1.2" } }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -4543,6 +4849,60 @@ "asap": "~2.0.3" } }, + "nodemon": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", + "requires": { + "chokidar": "^2.1.8", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "noder.io": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/noder.io/-/noder.io-1.2.0.tgz", @@ -4587,6 +4947,14 @@ "npm-bundled": "^1.0.1" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -4893,6 +5261,11 @@ "os-tmpdir": "^1.0.0" } }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -4917,6 +5290,17 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4978,11 +5362,15 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", @@ -5084,6 +5472,11 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, "prettier": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", @@ -5128,6 +5521,11 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==" + }, "pump": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", @@ -5260,6 +5658,23 @@ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "^1.0.1" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -5523,6 +5938,14 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "^5.0.3" + } + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -5690,7 +6113,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -5698,8 +6120,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "should": { "version": "13.2.3", @@ -6260,6 +6681,11 @@ "is-utf8": "^0.2.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -6423,6 +6849,14 @@ "xtend": "^4.0.0" } }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.0" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6444,6 +6878,11 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -6522,6 +6961,24 @@ "resolved": "https://registry.npmjs.org/toml-js/-/toml-js-0.0.8.tgz", "integrity": "sha1-ZI6m8aTWOxnAuzC47QPkDQlHOwo=" }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + } + } + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -6621,6 +7078,29 @@ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, + "undefsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", + "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -6632,6 +7112,14 @@ "set-value": "^2.0.1" } }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "unit.js": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/unit.js/-/unit.js-2.1.1.tgz", @@ -6699,11 +7187,61 @@ } } }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -6717,6 +7255,14 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -6791,6 +7337,43 @@ "string-width": "^1.0.2 || 2" } }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -6825,6 +7408,16 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "ws": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", @@ -6833,6 +7426,11 @@ "async-limiter": "~1.0.0" } }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", diff --git a/package.json b/package.json index 25a85a08e6b3a43353de21f17157bb71420e579b..538f9b455b8c0ab0c5daa08979e1fb50f340239b 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "node-fs-extra": "^0.8.2", "node-sass": "^4.13.0", "nodegit": ">=0.26.2", + "nodemon": "^1.19.4", "nunjucks": "^3.2.0", "nunjucks-date-filter": "^0.1.1", "syntax-error": "^1.4.0", diff --git a/sitegin/image.js b/sitegin/image.js index 25b9ac3ca201cae6cc562d0eeacf3db647caac6d..c8e4827d01dce4cd2ddf12c27880453bf8207e4e 100644 --- a/sitegin/image.js +++ b/sitegin/image.js @@ -1,14 +1,14 @@ const path = require('path') const url = require('url') const youtube = require('./utils/youtube.js') -const jobs = require('./jobs') const { rewriteURL } = require('./urls') +const imageResizer = require('./imageResizer') const generateImage = (file, targetDir, width, height) => - jobs.run('imageResizer', file, targetDir, width, height) + imageResizer(file, targetDir, width, height) function fromEntries(entries) { - return [...entries].reduce((o, [k,v]) => { + return [...entries].reduce((o, [k, v]) => { o[k] = v return o }, {}) diff --git a/sitegin/index.js b/sitegin/index.js new file mode 100755 index 0000000000000000000000000000000000000000..2923490f0e788af199997841af1858f03f5b8fe8 --- /dev/null +++ b/sitegin/index.js @@ -0,0 +1,156 @@ +const moment = require('moment') +const cli = require('cli') +const path = require('path') +const config = require('./config') + +cli.main(function(args, options) { + console.log(options) + config() + .then(function(obj) { + sitegin(obj.config) + }) + .catch(function(e) { + console.log(e.stack) + process.exit() + }) +}) + +function sitegin(config) { + const options = config.options + const pipeline = require('./sitegin')({ + watch: !options.noserver && !options.nowatch, + }) + + const sass = require('node-sass') + const fs = require('fs') + + // Main builder function + // If builder is not running - run it + // If it is running - schedule rerun after it finishes + let isRunning = false + let runAgain = false + let first = false + let doSync = function() {} + function run() { + const startTime = moment() + runAgain = false + if (isRunning) { + console.log( + 'Generator is still running. Queing another run after it finishes.', + ) + runAgain = true + return + } + console.log( + '================================================================================', + ) + console.log('Running generator') + isRunning = true + pipeline() + .then(function() { + isRunning = false + console.log( + 'Generator finished in', + moment().diff(startTime, 'seconds'), + 'seconds', + ) + doSync() + if (!first) { + first = true + copyStaticFiles(config.builddir, config.staticDir, config.themeDir) + } + if (runAgain) run() + }) + .catch(function(e) { + isRunning = false + console.log( + 'Generator crashed in', + moment().diff(startTime, 'seconds'), + 'seconds', + ) + if (runAgain) run() + if (e.stack) console.log(e.stack) + else console.log(e) + if (config.options.noserver) process.exit(13) + }) + } + + console.log('Sitegin successfully loaded') + run() + + rendersass(config.builddir, config.themeDir) + + if (!options.noserver) { + const sync = require('browser-sync').create() + doSync = function() { + sync.reload('*') + } + sync.init({ + server: { + baseDir: config.builddir, + }, + ui: { + port: options.port + 1, + }, + port: options.port, + }) + + const chokidar = require('chokidar') + // article or theme reload + if (!options.nowatch) { + const watches = [path.join(config.sourceDir, 'articles'), config.themeDir] + console.log('Watching', watches, 'for changes') + chokidar + .watch(watches, { ignoreInitial: true }) + .on('all', function(event, path) { + console.log('Content or theme changed. Rebuilding...') + console.log('Change event:', event, 'on path:', path) + run() + }) + } + } +} + +function copyStaticFiles(builddir, staticdir, themedir) { + // STATIC FILES + const fsextra = require('node-fs-extra') + fsextra.copy( + staticdir, + builddir, + function(file) { + return !(file.match('\\.git') || file.match('static/articles')) + }, + function() { + console.log('copy static done') + }, + ) + fsextra.copy(`${staticdir}/articles`, `${builddir}/clanek`, function() { + console.log('copy static/articles done') + }) + fsextra.copy( + `${themedir}/static`, + builddir, + function(file) { + return !file.match('\\.git') + }, + function() { + console.log(`copy ${themedir}/static done`) + }, + ) +} + +function rendersass(builddir, themedir) { + // SASS + const sass = require('node-sass') + const fs = require('fs') + const mkdirp = require('mkdirp') + + sass.render({ file: `${themedir}/sass/style.scss` }, function(err, result) { + if (err === null) { + console.log('compiled sass') + mkdirp(`${builddir}/theme`, () => { + fs.writeFile(`${builddir}/theme/style.css`, result.css, () => {}) + }) + } else console.log('error ', err) + }) +} diff --git a/sitegin/jobs.js b/sitegin/jobs.js deleted file mode 100644 index 469aabac425fe0da5ebdc925dd648480fde100b2..0000000000000000000000000000000000000000 --- a/sitegin/jobs.js +++ /dev/null @@ -1,158 +0,0 @@ -const syntaxError = require('syntax-error') -const fs = require('fs') -const chokidar = require('chokidar') - -const jobList = {} -let watchers = [] - -function JobError(message, name) { - Error.captureStackTrace(this, JobError) - this.name = `${name}Error` - this.message = message - return this -} - -let onReload = () => {} -const requireError = (e, jobName, module, reject) => { - if (e instanceof SyntaxError) { - console.log(`${module}: ${e}`) - const resolved = require.resolve(module) - fs.readFile(resolved, 'utf8', (err, content) => { - console.log(syntaxError(content, resolved)) - reject( - new JobError( - `Failed to register job ${jobName} (SyntaxError)`, - 'Require', - ), - ) - }) - } else { - if (e.code === 'MODULE_NOT_FOUND') console.log(e.toString()) - reject(new JobError(`Failed to register job ${jobName} (${e})`, 'Require')) - } -} - -const jobs = { - register(jobName, module, watch = true) { - return new Promise((resolve, reject) => { - if (jobList[jobName] !== undefined) { - Promise.reject( - new JobError( - `Job ${jobName} is already registered`, - 'JobAlreadyRegistered', - ), - ) - return - } - - let f - try { - // eslint-disable-next-line global-require, import/no-dynamic-require - f = require(module) - } catch (e) { - requireError(e, jobName, module, reject) - return - } - - if (typeof f !== 'function') - throw new JobError( - `Module "${module}" for job "${jobName}" does not export function`, - ) - jobList[jobName] = { - f, - module, - } - if (watch) jobs.watch(jobName) - resolve() - }) - }, - reload(jobName) { - const { module } = jobList[jobName] - delete require.cache[require.resolve(module)] - - return new Promise((resolve, reject) => { - try { - // eslint-disable-next-line global-require, import/no-dynamic-require - const f = require(module) - if (typeof f === 'function') { - const job = { - f, - module, - } - delete jobList[jobName] - jobList[jobName] = job - resolve() - } else { - console.log(`Error reloading job ${jobName} retry in 500ms`) - setTimeout(() => { - resolve(jobs.reload(jobName)) - }, 500) - } - } catch (e) { - console.log(e) - requireError(e, jobName, module, reject) - } - }) - }, - // registerMultiple( - // {watch: true}, - // ['jobName','./module'],['jobName2','./module2'] - // ) - registerMultiple({ watch = true }, ...args) { - const regs = [] - for (const job of args) { - regs.push(jobs.register(job[0], job[1], watch)) - } - return Promise.all(regs) - }, - run(jobName, ...args) { - if (jobList[jobName] === undefined) { - throw new JobError(`Job ${jobName} is not registered`, 'JobNotRegistered') - } - try { - return jobList[jobName].f(...args) - } catch (e) { - console.log('Error running job', jobName) - console.log(jobList[jobName]) - throw e - } - }, - runSequence(...args) { - let prom - console.log('Running', args) - const jobSequence = args - jobSequence.forEach(job => { - if (prom === undefined) { - prom = jobs.run(job) - } else { - prom = prom.then((...a) => { - a.splice(0, 0, job) - return jobs.run(...a) - }) - } - }) - return prom - }, - watch(jobName) { - const { module } = jobList[jobName] - const file = require.resolve(module) - const w = chokidar.watch(file) - w.on('change', () => { - jobs.reload(jobName).then(onReload) - }) - watchers.push(w) - }, - onReload(f) { - onReload = f - }, - close() { - watchers.forEach(w => { - w.close() - console.log(w.getWatched()) - }) - watchers = [] - }, -} - -module.exports = jobs -module.exports.jobList = jobList diff --git a/sitegin/markdown.js b/sitegin/markdown.js index c36e26f741d09b79332d0fc0653d398bf21725a6..a15bc8b199d6a7200d3b3919468fcd2a0344340c 100644 --- a/sitegin/markdown.js +++ b/sitegin/markdown.js @@ -6,7 +6,8 @@ const marked = require('marked') const renderer = new marked.Renderer() const highlightjs = require('highlight.js') -const jobs = require('./jobs') +const image = require('./image') +const toURL = require('./toURL') let lang @@ -35,10 +36,8 @@ const opts = { const parser = new marked.Parser(opts) const lexer = new marked.Lexer(opts) -const toURL = url => jobs.run('toURL', url) - const renderImage = (href, title, text, curFilename, cfg) => - jobs.run('image', href, title, text, curFilename, cfg) + image(href, title, text, curFilename, cfg) renderer.heading = (text, level, raw) => `<h${level + 2} id="${toURL(raw)}">${text}</h${level + 2}>\n` diff --git a/sitegin/pipeline.js b/sitegin/pipeline.js deleted file mode 100644 index c2aee3528f1fa19c81a67df74cbeb02200126dbc..0000000000000000000000000000000000000000 --- a/sitegin/pipeline.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This jobs just runs all job in the right order - */ - -module.exports = jobs => - jobs.runSequence( - 'resetJobs', - 'config', - 'readFiles', - 'parseHugo', - 'parseRedirects', - 'markdown', - 'urls', - 'sitemap', - 'tags', - 'theme', - 'writeFiles', - 'print', - ) diff --git a/sitegin/resetJobs.js b/sitegin/resetJobs.js deleted file mode 100644 index c4709a6c3cd58e50b1c3d0bc3d778388f54189d4..0000000000000000000000000000000000000000 --- a/sitegin/resetJobs.js +++ /dev/null @@ -1,10 +0,0 @@ -const jobs = require('./jobs') - -module.exports = function resetJobs() { - for (const job of Object.values(jobs.jobList)) { - if (job.f.reset) { - job.f.reset() - } - } - return Promise.resolve() -} diff --git a/sitegin/sitegin.js b/sitegin/sitegin.js index 9da4666c961510a55629634d6689d3ee9687d062..667176c11889fe1c78f98af62c0a1b6beacf9f32 100644 --- a/sitegin/sitegin.js +++ b/sitegin/sitegin.js @@ -1,26 +1,27 @@ -const jobs = require('./jobs') +const markdown = require('./markdown') +const parseHugo = require('./parseHugo') +const print = require('./print') +const readFiles = require('./readFiles') +const tags = require('./tags') +const theme = require('./theme') +const urls = require('./urls') +const writeFiles = require('./writeFiles') +const sitemap = require('./sitemap') +const parseRedirects = require('./parseRedirects') +const configI = require('./config') -module.exports = config => - jobs - .registerMultiple( - config, - ['config', './config'], - ['markdown', './markdown'], - ['parseHugo', './parseHugo'], - ['print', './print'], - ['readFiles', './readFiles'], - ['toURL', './toURL'], - ['tags', './tags'], - ['nunjucks', './nunjucks'], - ['theme', './theme'], - ['urls', './urls'], - ['writeFiles', './writeFiles'], - ['resetJobs', './resetJobs'], - ['sitemap', './sitemap'], - ['parseRedirects', './parseRedirects'], - ['image', './image'], - ['imageResizer', './imageResizer'], - - ['pipeline', './pipeline'], - ) - .then(() => jobs) +module.exports = config => { + return () => + Promise.resolve(config) + .then(configI) + .then(readFiles) + .then(parseHugo) + .then(parseRedirects) + .then(markdown) + .then(urls) + .then(sitemap) + .then(tags) + .then(theme) + .then(writeFiles) + .then(print) +} diff --git a/sitegin/tags.js b/sitegin/tags.js index d8bcc089820b4c2e82888f54d556e3680d27a874..3b9abc309409d2eaf8016f512ff6cd87d8c44b35 100644 --- a/sitegin/tags.js +++ b/sitegin/tags.js @@ -1,6 +1,4 @@ -const jobs = require('./jobs') - -const toURL = url => jobs.run('toURL', url) +const toURL = require('./toURL') module.exports = function tagsJob(obj) { console.log('Build step: Tags') diff --git a/sitegin/theme.js b/sitegin/theme.js index 3aed36d34d6402e0aa124010ca13dc04f703fe0f..2bdbb1557e61122644fae1ca9b0804bc503362a5 100644 --- a/sitegin/theme.js +++ b/sitegin/theme.js @@ -1,4 +1,4 @@ -const jobs = require('./jobs') +const nunjucks = require('./nunjucks') module.exports = function theme(_obj) { console.log('Build step: Theme') @@ -11,8 +11,7 @@ module.exports = function theme(_obj) { const runJob = (obj, type) => { todo += 1 - jobs - .run('nunjucks', obj, type, _obj.config) + nunjucks(obj, type, _obj.config) .then(data => { // eslint-disable-next-line no-param-reassign if (!obj.rendered) obj.rendered = []