From 4a601214caa986921bc63157c71f33e7206eb495 Mon Sep 17 00:00:00 2001 From: "Xunnamius (Romulus)" Date: Sun, 31 May 2020 15:15:44 -0500 Subject: [PATCH] added dev db hydration feature --- config/gulpfile.ts | 4 +- dist.env | 6 ++ gulpfile.js | 2 +- package-lock.json | 225 +++++++++++++++++++++++++++++++++++++++++--- package.json | 3 +- src/backend/env.ts | 5 +- src/pages/index.tsx | 46 ++++++++- 7 files changed, 271 insertions(+), 20 deletions(-) diff --git a/config/gulpfile.ts b/config/gulpfile.ts index fd3d2c5..91e07dc 100644 --- a/config/gulpfile.ts +++ b/config/gulpfile.ts @@ -22,7 +22,7 @@ const regenTargets = [ // * CHECKENV -export const checkEnv = async (): Promise => populateEnv(); +export const checkEnv = async () => populateEnv(); checkEnv.description = `Throws an error if any expected environment variables are not properly set ` + `(see expectedEnvVariables key in package.json)`; @@ -33,7 +33,7 @@ checkEnv.description = `Throws an error if any expected environment variables ar // ? compile this new function and once again to compile itself with the newly // ? compiled logic. If there is an error that prevents regeneration, you can // ? run `npm run generate` then `npm run regenerate` instead. -export const regenerate = (): NodeJS.ReadWriteStream => { +export const regenerate = () => { populateEnv(); log(`Regenerating targets: "${regenTargets.join('" "')}"`); diff --git a/dist.env b/dist.env index d5dbcc0..90ebd3d 100644 --- a/dist.env +++ b/dist.env @@ -47,3 +47,9 @@ MAX_RANKINGS_PER_ELECTION=1000 # Maximum allowed size of a request body and Content-Length header in bytes. # Should be a string like 1kb, 1mb, 500b MAX_CONTENT_LENGTH_BYTES=100kb + +# Optional environment variable that, if !false, instructs the app to DESTROY +# the contents of the current database and replace it with dummy data when a +# client visits the index page. This will only work when NODE_ENV=development to +# protect against accidental use. +HYDRATE_DB_ON_STARTUP=false diff --git a/gulpfile.js b/gulpfile.js index f94995e..d517026 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -46,4 +46,4 @@ const regenerate = () => { exports.regenerate = regenerate; regenerate.description = 'Invokes babel on the files in config, transpiling them into their project root versions'; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbmZpZy9ndWxwZmlsZS50cyJdLCJuYW1lcyI6WyJwb3B1bGF0ZUVudiIsInJlcXVpcmUiLCJyZWdlblRhcmdldHMiLCJjaGVja0VudiIsImRlc2NyaXB0aW9uIiwicmVnZW5lcmF0ZSIsImpvaW4iLCJwcm9jZXNzIiwiZW52IiwiQkFCRUxfRU5WIiwiZ3VscCIsInNyYyIsInBpcGUiLCJmaWxlIiwiY29udGVudHMiLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJmaWxlbmFtZSIsInBhdGgiLCJzb3VyY2VGaWxlTmFtZSIsIl9fZGlybmFtZSIsImNvZGUiLCJuYW1lIiwiYmFzZW5hbWUiLCJkZXN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFLQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBa0JDLE9BQU8sQ0FBQyxpQkFBRCxDQUEvQjs7QUFFQSxNQUFNQyxZQUFZLEdBQUcsQ0FDaEIsZ0JBRGdCLENBQXJCOztBQU1PLE1BQU1DLFFBQVEsR0FBRyxZQUEyQkgsV0FBVyxFQUF2RDs7O0FBRVBHLFFBQVEsQ0FBQ0MsV0FBVCxHQUF3Qiw2RUFBRCxHQUNoQixnREFEUDs7QUFTTyxNQUFNQyxVQUFVLEdBQUcsTUFBOEI7QUFDcERMLEVBQUFBLFdBQVc7QUFFWCx5QkFBSywwQkFBeUJFLFlBQVksQ0FBQ0ksSUFBYixDQUFrQixLQUFsQixDQUF5QixHQUF2RDtBQUVBQyxFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsU0FBWixHQUF3QixXQUF4QjtBQUVBLFNBQU9DLGNBQUtDLEdBQUwsQ0FBU1QsWUFBVCxFQUNGVSxJQURFLENBQ0csc0JBQUlDLElBQUksSUFBSTtBQUFBOztBQUNkQSxJQUFBQSxJQUFJLENBQUNDLFFBQUwsR0FBZ0JELElBQUksQ0FBQ0MsUUFBTCxJQUFpQkMsTUFBTSxDQUFDQyxJQUFQLENBQVksb0NBQU1ILElBQUksQ0FBQ0MsUUFBTCxDQUFjRyxRQUFkLENBQXVCLE1BQXZCLENBQU4sRUFBc0M7QUFDL0VDLE1BQUFBLFFBQVEsRUFBRUwsSUFBSSxDQUFDTSxJQURnRTtBQUUvRUMsTUFBQUEsY0FBYyxFQUFFLG9CQUFJQyxTQUFKLEVBQWVSLElBQUksQ0FBQ00sSUFBcEI7QUFGK0QsS0FBdEMsbURBR3pDRyxJQUh5QyxLQUdqQyxFQUhxQixDQUFqQztBQUtBLFVBQU1DLElBQUksR0FBRyxvQkFBU1YsSUFBSSxDQUFDVyxRQUFkLEVBQXdCLEtBQXhCLENBQWI7QUFDQVgsSUFBQUEsSUFBSSxDQUFDVyxRQUFMLEdBQWdCRCxJQUFJLElBQUlWLElBQUksQ0FBQ1csUUFBYixHQUF3QkQsSUFBeEIsR0FBZ0MsR0FBRUEsSUFBSyxLQUF2RDtBQUNILEdBUkssQ0FESCxFQVVGWCxJQVZFLENBVUdGLGNBQUtlLElBQUwsQ0FBVSxHQUFWLENBVkgsQ0FBUDtBQVdILENBbEJNOzs7QUFvQlBwQixVQUFVLENBQUNELFdBQVgsR0FBeUIseUZBQXpCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gPyBUbyByZWdlbmVyYXRlIHRoaXMgZmlsZSAoaS5lLiBpZiB5b3UgY2hhbmdlZCBpdCBhbmQgd2FudCB5b3VyIGNoYW5nZXMgdG9cbi8vID8gYmUgcGVybWFuZW50KSwgY2FsbCBgbnBtIHJ1biByZWdlbmVyYXRlYCBhZnRlcndhcmRzXG5cbi8vICEgQmUgc3VyZSB0aGF0IHRhc2tzIGV4cGVjdGVkIHRvIHJ1biBvbiBucG0gaW5zdGFsbCAobWFya2VkIEBkZXBlbmRlbnQpIGhhdmVcbi8vICEgYWxsIHJlcXVpcmVkIHBhY2thZ2VzIGxpc3RlZCB1bmRlciBcImRlcGVuZGVuY2llc1wiIGluc3RlYWQgb2Zcbi8vICEgXCJkZXZEZXBlbmRlbmNpZXNcIiBpbiB0aGlzIHByb2plY3QncyBwYWNrYWdlLmpzb25cblxuaW1wb3J0IHsgcmVsYXRpdmUgYXMgcmVsLCBiYXNlbmFtZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyB0cmFuc2Zvcm1TeW5jIGFzIGJhYmVsIH0gZnJvbSAnQGJhYmVsL2NvcmUnXG5pbXBvcnQgZ3VscCBmcm9tICdndWxwJ1xuaW1wb3J0IHRhcCBmcm9tICdndWxwLXRhcCdcbmltcG9ydCBsb2cgZnJvbSAnZmFuY3ktbG9nJ1xuXG4vLyA/IE5vdCB1c2luZyBFUzYvVFMgaW1wb3J0IHN5bnRheCBoZXJlIGJlY2F1c2UgZGV2LXV0aWxzIGhhcyBzcGVjaWFsXG4vLyA/IGNpcmN1bXN0YW5jZXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgeyBwb3B1bGF0ZUVudiB9ID0gcmVxdWlyZSgnLi9zcmMvZGV2LXV0aWxzJyk7XG5cbmNvbnN0IHJlZ2VuVGFyZ2V0cyA9IFtcbiAgICBgY29uZmlnLyouW2p0XXNgXG5dO1xuXG4vLyAqIENIRUNLRU5WXG5cbmV4cG9ydCBjb25zdCBjaGVja0VudiA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHBvcHVsYXRlRW52KCk7XG5cbmNoZWNrRW52LmRlc2NyaXB0aW9uID0gYFRocm93cyBhbiBlcnJvciBpZiBhbnkgZXhwZWN0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgcHJvcGVybHkgc2V0IGBcbiAgICArIGAoc2VlIGV4cGVjdGVkRW52VmFyaWFibGVzIGtleSBpbiBwYWNrYWdlLmpzb24pYDtcblxuLy8gKiBSRUdFTkVSQVRFXG5cbi8vID8gSWYgeW91IGNoYW5nZSB0aGlzIGZ1bmN0aW9uLCBydW4gYG5wbSBydW4gcmVnZW5lcmF0ZWAgdHdpY2U6IG9uY2UgdG9cbi8vID8gY29tcGlsZSB0aGlzIG5ldyBmdW5jdGlvbiBhbmQgb25jZSBhZ2FpbiB0byBjb21waWxlIGl0c2VsZiB3aXRoIHRoZSBuZXdseVxuLy8gPyBjb21waWxlZCBsb2dpYy4gSWYgdGhlcmUgaXMgYW4gZXJyb3IgdGhhdCBwcmV2ZW50cyByZWdlbmVyYXRpb24sIHlvdSBjYW5cbi8vID8gcnVuIGBucG0gcnVuIGdlbmVyYXRlYCB0aGVuIGBucG0gcnVuIHJlZ2VuZXJhdGVgIGluc3RlYWQuXG5leHBvcnQgY29uc3QgcmVnZW5lcmF0ZSA9ICgpOiBOb2RlSlMuUmVhZFdyaXRlU3RyZWFtID0+IHtcbiAgICBwb3B1bGF0ZUVudigpO1xuXG4gICAgbG9nKGBSZWdlbmVyYXRpbmcgdGFyZ2V0czogXCIke3JlZ2VuVGFyZ2V0cy5qb2luKCdcIiBcIicpfVwiYCk7XG5cbiAgICBwcm9jZXNzLmVudi5CQUJFTF9FTlYgPSAnZ2VuZXJhdG9yJztcblxuICAgIHJldHVybiBndWxwLnNyYyhyZWdlblRhcmdldHMpXG4gICAgICAgIC5waXBlKHRhcChmaWxlID0+IHtcbiAgICAgICAgICAgIGZpbGUuY29udGVudHMgPSBmaWxlLmNvbnRlbnRzICYmIEJ1ZmZlci5mcm9tKGJhYmVsKGZpbGUuY29udGVudHMudG9TdHJpbmcoJ3V0ZjgnKSwge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlLnBhdGgsXG4gICAgICAgICAgICAgICAgc291cmNlRmlsZU5hbWU6IHJlbChfX2Rpcm5hbWUsIGZpbGUucGF0aClcbiAgICAgICAgICAgIH0pPy5jb2RlIHx8ICcnKTtcblxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUuYmFzZW5hbWUsICcudHMnKTtcbiAgICAgICAgICAgIGZpbGUuYmFzZW5hbWUgPSBuYW1lID09IGZpbGUuYmFzZW5hbWUgPyBuYW1lIDogYCR7bmFtZX0uanNgO1xuICAgICAgICB9KSlcbiAgICAgICAgLnBpcGUoZ3VscC5kZXN0KCcuJykpO1xufTtcblxucmVnZW5lcmF0ZS5kZXNjcmlwdGlvbiA9ICdJbnZva2VzIGJhYmVsIG9uIHRoZSBmaWxlcyBpbiBjb25maWcsIHRyYW5zcGlsaW5nIHRoZW0gaW50byB0aGVpciBwcm9qZWN0IHJvb3QgdmVyc2lvbnMnO1xuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbmZpZy9ndWxwZmlsZS50cyJdLCJuYW1lcyI6WyJwb3B1bGF0ZUVudiIsInJlcXVpcmUiLCJyZWdlblRhcmdldHMiLCJjaGVja0VudiIsImRlc2NyaXB0aW9uIiwicmVnZW5lcmF0ZSIsImpvaW4iLCJwcm9jZXNzIiwiZW52IiwiQkFCRUxfRU5WIiwiZ3VscCIsInNyYyIsInBpcGUiLCJmaWxlIiwiY29udGVudHMiLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJmaWxlbmFtZSIsInBhdGgiLCJzb3VyY2VGaWxlTmFtZSIsIl9fZGlybmFtZSIsImNvZGUiLCJuYW1lIiwiYmFzZW5hbWUiLCJkZXN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFLQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBa0JDLE9BQU8sQ0FBQyxpQkFBRCxDQUEvQjs7QUFFQSxNQUFNQyxZQUFZLEdBQUcsQ0FDaEIsZ0JBRGdCLENBQXJCOztBQU1PLE1BQU1DLFFBQVEsR0FBRyxZQUFZSCxXQUFXLEVBQXhDOzs7QUFFUEcsUUFBUSxDQUFDQyxXQUFULEdBQXdCLDZFQUFELEdBQ2hCLGdEQURQOztBQVNPLE1BQU1DLFVBQVUsR0FBRyxNQUFNO0FBQzVCTCxFQUFBQSxXQUFXO0FBRVgseUJBQUssMEJBQXlCRSxZQUFZLENBQUNJLElBQWIsQ0FBa0IsS0FBbEIsQ0FBeUIsR0FBdkQ7QUFFQUMsRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFNBQVosR0FBd0IsV0FBeEI7QUFFQSxTQUFPQyxjQUFLQyxHQUFMLENBQVNULFlBQVQsRUFDRlUsSUFERSxDQUNHLHNCQUFJQyxJQUFJLElBQUk7QUFBQTs7QUFDZEEsSUFBQUEsSUFBSSxDQUFDQyxRQUFMLEdBQWdCRCxJQUFJLENBQUNDLFFBQUwsSUFBaUJDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLG9DQUFNSCxJQUFJLENBQUNDLFFBQUwsQ0FBY0csUUFBZCxDQUF1QixNQUF2QixDQUFOLEVBQXNDO0FBQy9FQyxNQUFBQSxRQUFRLEVBQUVMLElBQUksQ0FBQ00sSUFEZ0U7QUFFL0VDLE1BQUFBLGNBQWMsRUFBRSxvQkFBSUMsU0FBSixFQUFlUixJQUFJLENBQUNNLElBQXBCO0FBRitELEtBQXRDLG1EQUd6Q0csSUFIeUMsS0FHakMsRUFIcUIsQ0FBakM7QUFLQSxVQUFNQyxJQUFJLEdBQUcsb0JBQVNWLElBQUksQ0FBQ1csUUFBZCxFQUF3QixLQUF4QixDQUFiO0FBQ0FYLElBQUFBLElBQUksQ0FBQ1csUUFBTCxHQUFnQkQsSUFBSSxJQUFJVixJQUFJLENBQUNXLFFBQWIsR0FBd0JELElBQXhCLEdBQWdDLEdBQUVBLElBQUssS0FBdkQ7QUFDSCxHQVJLLENBREgsRUFVRlgsSUFWRSxDQVVHRixjQUFLZSxJQUFMLENBQVUsR0FBVixDQVZILENBQVA7QUFXSCxDQWxCTTs7O0FBb0JQcEIsVUFBVSxDQUFDRCxXQUFYLEdBQXlCLHlGQUF6QiIsInNvdXJjZXNDb250ZW50IjpbIi8vID8gVG8gcmVnZW5lcmF0ZSB0aGlzIGZpbGUgKGkuZS4gaWYgeW91IGNoYW5nZWQgaXQgYW5kIHdhbnQgeW91ciBjaGFuZ2VzIHRvXG4vLyA/IGJlIHBlcm1hbmVudCksIGNhbGwgYG5wbSBydW4gcmVnZW5lcmF0ZWAgYWZ0ZXJ3YXJkc1xuXG4vLyAhIEJlIHN1cmUgdGhhdCB0YXNrcyBleHBlY3RlZCB0byBydW4gb24gbnBtIGluc3RhbGwgKG1hcmtlZCBAZGVwZW5kZW50KSBoYXZlXG4vLyAhIGFsbCByZXF1aXJlZCBwYWNrYWdlcyBsaXN0ZWQgdW5kZXIgXCJkZXBlbmRlbmNpZXNcIiBpbnN0ZWFkIG9mXG4vLyAhIFwiZGV2RGVwZW5kZW5jaWVzXCIgaW4gdGhpcyBwcm9qZWN0J3MgcGFja2FnZS5qc29uXG5cbmltcG9ydCB7IHJlbGF0aXZlIGFzIHJlbCwgYmFzZW5hbWUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgdHJhbnNmb3JtU3luYyBhcyBiYWJlbCB9IGZyb20gJ0BiYWJlbC9jb3JlJ1xuaW1wb3J0IGd1bHAgZnJvbSAnZ3VscCdcbmltcG9ydCB0YXAgZnJvbSAnZ3VscC10YXAnXG5pbXBvcnQgbG9nIGZyb20gJ2ZhbmN5LWxvZydcblxuLy8gPyBOb3QgdXNpbmcgRVM2L1RTIGltcG9ydCBzeW50YXggaGVyZSBiZWNhdXNlIGRldi11dGlscyBoYXMgc3BlY2lhbFxuLy8gPyBjaXJjdW1zdGFuY2VzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVucmVzb2x2ZWQsIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbmNvbnN0IHsgcG9wdWxhdGVFbnYgfSA9IHJlcXVpcmUoJy4vc3JjL2Rldi11dGlscycpO1xuXG5jb25zdCByZWdlblRhcmdldHMgPSBbXG4gICAgYGNvbmZpZy8qLltqdF1zYFxuXTtcblxuLy8gKiBDSEVDS0VOVlxuXG5leHBvcnQgY29uc3QgY2hlY2tFbnYgPSBhc3luYyAoKSA9PiBwb3B1bGF0ZUVudigpO1xuXG5jaGVja0Vudi5kZXNjcmlwdGlvbiA9IGBUaHJvd3MgYW4gZXJyb3IgaWYgYW55IGV4cGVjdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgbm90IHByb3Blcmx5IHNldCBgXG4gICAgKyBgKHNlZSBleHBlY3RlZEVudlZhcmlhYmxlcyBrZXkgaW4gcGFja2FnZS5qc29uKWA7XG5cbi8vICogUkVHRU5FUkFURVxuXG4vLyA/IElmIHlvdSBjaGFuZ2UgdGhpcyBmdW5jdGlvbiwgcnVuIGBucG0gcnVuIHJlZ2VuZXJhdGVgIHR3aWNlOiBvbmNlIHRvXG4vLyA/IGNvbXBpbGUgdGhpcyBuZXcgZnVuY3Rpb24gYW5kIG9uY2UgYWdhaW4gdG8gY29tcGlsZSBpdHNlbGYgd2l0aCB0aGUgbmV3bHlcbi8vID8gY29tcGlsZWQgbG9naWMuIElmIHRoZXJlIGlzIGFuIGVycm9yIHRoYXQgcHJldmVudHMgcmVnZW5lcmF0aW9uLCB5b3UgY2FuXG4vLyA/IHJ1biBgbnBtIHJ1biBnZW5lcmF0ZWAgdGhlbiBgbnBtIHJ1biByZWdlbmVyYXRlYCBpbnN0ZWFkLlxuZXhwb3J0IGNvbnN0IHJlZ2VuZXJhdGUgPSAoKSA9PiB7XG4gICAgcG9wdWxhdGVFbnYoKTtcblxuICAgIGxvZyhgUmVnZW5lcmF0aW5nIHRhcmdldHM6IFwiJHtyZWdlblRhcmdldHMuam9pbignXCIgXCInKX1cImApO1xuXG4gICAgcHJvY2Vzcy5lbnYuQkFCRUxfRU5WID0gJ2dlbmVyYXRvcic7XG5cbiAgICByZXR1cm4gZ3VscC5zcmMocmVnZW5UYXJnZXRzKVxuICAgICAgICAucGlwZSh0YXAoZmlsZSA9PiB7XG4gICAgICAgICAgICBmaWxlLmNvbnRlbnRzID0gZmlsZS5jb250ZW50cyAmJiBCdWZmZXIuZnJvbShiYWJlbChmaWxlLmNvbnRlbnRzLnRvU3RyaW5nKCd1dGY4JyksIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZS5wYXRoLFxuICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVOYW1lOiByZWwoX19kaXJuYW1lLCBmaWxlLnBhdGgpXG4gICAgICAgICAgICB9KT8uY29kZSB8fCAnJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLmJhc2VuYW1lLCAnLnRzJyk7XG4gICAgICAgICAgICBmaWxlLmJhc2VuYW1lID0gbmFtZSA9PSBmaWxlLmJhc2VuYW1lID8gbmFtZSA6IGAke25hbWV9LmpzYDtcbiAgICAgICAgfSkpXG4gICAgICAgIC5waXBlKGd1bHAuZGVzdCgnLicpKTtcbn07XG5cbnJlZ2VuZXJhdGUuZGVzY3JpcHRpb24gPSAnSW52b2tlcyBiYWJlbCBvbiB0aGUgZmlsZXMgaW4gY29uZmlnLCB0cmFuc3BpbGluZyB0aGVtIGludG8gdGhlaXIgcHJvamVjdCByb290IHZlcnNpb25zJztcbiJdfQ== \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fc924be..395e774 100644 --- a/package-lock.json +++ b/package-lock.json @@ -953,23 +953,207 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz", - "integrity": "sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", + "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", "requires": { - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "requires": { - "object.assign": "^4.1.0" + "@babel/highlight": "^7.10.1" + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "requires": { + "@babel/types": "^7.10.1" } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.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" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -3513,6 +3697,14 @@ } } }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, "babel-plugin-istanbul": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", @@ -10778,6 +10970,17 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz", + "integrity": "sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==", + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, "@babel/runtime": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", diff --git a/package.json b/package.json index e27afaf..9b7d617 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "list-tasks": "npm run && echo 'Compiling gulp task list...' && gulp --tasks", "repl": "rlwrap npx -p @babel/core -p @babel/node babel-node", "preinstall": "npx npm-force-resolutions", - "check-types": "tsc && echo 'no problems detected!'" + "check-types": "tsc && echo 'no problems detected!'", + "reset-db": "echo 'This can be achieved with command `NODE_ENV=development HYDRATE_DB_ON_STARTUP=true npm run dev`'" }, "author": "Xunnamius", "license": "ISC", diff --git a/src/backend/env.ts b/src/backend/env.ts index 13190eb..df6dfc0 100644 --- a/src/backend/env.ts +++ b/src/backend/env.ts @@ -1,11 +1,10 @@ -import { isNumber } from 'util' +import { isNumber, isUndefined as isU } from 'util' import { parse as parseAsBytes } from 'bytes' import isServer from 'multiverse/is-server-side' import { DEFAULT_RESULT_LIMIT } from 'universe/backend' export function getEnv(silent=false) { const env = { - NODE_ENV: process.env.NODE_ENV || process.env.BABEL_ENV || process.env.APP_ENV || 'unknown', MONGODB_URI: (process.env.MONGODB_URI || '').toString(), MAX_LIMIT: parseInt(process.env.MAX_LIMIT ?? '-Infinity'), @@ -16,6 +15,7 @@ export function getEnv(silent=false) { MAX_OPTIONS_PER_ELECTION: parseInt(process.env.MAX_OPTIONS_PER_ELECTION || '-Infinity'), MAX_RANKINGS_PER_ELECTION: parseInt(process.env.MAX_RANKINGS_PER_ELECTION || '-Infinity'), MAX_CONTENT_LENGTH_BYTES: parseAsBytes(process.env.MAX_CONTENT_LENGTH_BYTES || '-Infinity'), + HYDRATE_DB_ON_STARTUP: !isU(process.env.HYDRATE_DB_ON_STARTUP) && process.env.HYDRATE_DB_ON_STARTUP !== 'false', }; const _mustBeGtZero = [ @@ -40,6 +40,7 @@ export function getEnv(silent=false) { // env.MAX_OPTIONS_PER_ELECTION: ${env.MAX_OPTIONS_PER_ELECTION} // env.MAX_RANKINGS_PER_ELECTION: ${env.MAX_RANKINGS_PER_ELECTION} // env.MAX_CONTENT_LENGTH_BYTES: ${env.MAX_CONTENT_LENGTH_BYTES} + // env.HYDRATE_DB_ON_STARTUP: ${env.HYDRATE_DB_ON_STARTUP} // ---`); /* eslint-enable no-console */ } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 2201829..c16b5f4 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,13 +1,53 @@ import * as React from 'react' import { getEnv } from 'universe/backend/env' +import { getDb, initializeDb, destroyDb } from 'universe/backend/db' +import { hydrateDb, unhydratedDummyDbData } from 'universe/__test__/db' -const env = getEnv().NODE_ENV; +type Props = { + previouslyHydratedDb: boolean; + shouldHydrateDb: boolean; + isInProduction: boolean; + nodeEnv: string; +}; + +let previouslyHydratedDb = false; + +export async function getServerSideProps() { + const env = getEnv(); + const shouldHydrateDb = env.NODE_ENV == 'development' && !previouslyHydratedDb && env.HYDRATE_DB_ON_STARTUP; + + const props = { + isInProduction: env.NODE_ENV == 'production', + shouldHydrateDb, + previouslyHydratedDb, + nodeEnv: env.NODE_ENV + }; + + if(shouldHydrateDb) { + const db = await getDb(); + + await destroyDb(db); + await initializeDb(db); + await hydrateDb(db, unhydratedDummyDbData); + previouslyHydratedDb = true; + } + + return { props }; +} + +export default function Index({ previouslyHydratedDb, shouldHydrateDb, isInProduction, nodeEnv }: Props): JSX.Element { + let status = (unchanged); + + if(previouslyHydratedDb) + status = (previously hydrated); + + else if(shouldHydrateDb) + status = (hydrated); -export default function Index(): JSX.Element { return (

Psst: there is no web frontend for this API.

- { env != 'production' &&

{`(in ${env} mode!)`}

} + { !isInProduction &&

{`[ NODE_ENV=${nodeEnv} | db=`}{status}{' ]'}

}
); }