├── .eslintrc.json ├── .gitignore ├── .tsconfig.json ├── .vscode └── launch.json ├── README.md ├── graphql ├── .gitignore ├── .vscode │ └── launch.json ├── api │ ├── posts │ │ └── index.js │ └── utils.js ├── app.js ├── database │ ├── actions │ │ ├── create-migration.js │ │ ├── db-connect.js │ │ └── run-migration.js │ ├── migrations │ │ ├── 1591564582828_roles.sql │ │ ├── 1591564633084_users.sql │ │ ├── 1591564643738_permissions.sql │ │ ├── 1591564652701_role_permissions.sql │ │ ├── 1591564660955_blog_categories.sql │ │ ├── 1591564665733_blog_posts.sql │ │ ├── 1591564674855_blog_post_comments.sql │ │ ├── 1591564679465_blog_post_categories.sql │ │ ├── 1591564684092_blog_post_likes.sql │ │ └── 1591564700514_seeds.sql │ └── mysql.js ├── package-lock.json ├── package.json └── schemas │ ├── index.js │ └── posts │ ├── index.js │ └── posts-schema.graphql ├── package.json ├── public ├── favicon.ico ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json └── robots.txt ├── src ├── App.js ├── App.test.js ├── assets │ ├── images │ │ ├── anyone_can_code.jpg │ │ ├── apollo_graphql.png │ │ ├── circuit_brain.jpg │ │ ├── cloud_storage.jpeg │ │ ├── cloud_storage.jpg │ │ ├── crypto.jpg │ │ ├── gql_image.png │ │ ├── graphql.png │ │ ├── home_budget.jpg │ │ ├── logo.png │ │ ├── money.jpg │ │ ├── neuron.jpg │ │ ├── programming_languages.jpeg │ │ ├── puzzled_programmer.jpeg │ │ └── spending_money.jpg │ ├── mocks │ │ ├── featured.js │ │ └── trending.js │ └── scss │ │ ├── _home.scss │ │ ├── _masonry-post.scss │ │ ├── _navigation.scss │ │ ├── _post-editor.scss │ │ ├── _post-grid.scss │ │ ├── _post-masonry.scss │ │ ├── _post.scss │ │ ├── _tag-row.scss │ │ ├── _variables.scss │ │ └── base.scss ├── components │ ├── common │ │ ├── __tests__ │ │ │ └── post-masonry.test.js │ │ ├── index.js │ │ ├── masonry-post │ │ │ ├── component.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── post-grid.js │ │ ├── post-masonry.js │ │ ├── styles.js │ │ ├── tag-row.js │ │ └── with-title.js │ └── navigation.js ├── index.js ├── logo.svg ├── page-renderer.js ├── pages │ ├── algos.js │ ├── cloud.js │ ├── edit-post.js │ ├── health.js │ ├── home.js │ ├── login.js │ ├── post.js │ └── web-dev.js ├── queries │ └── posts │ │ └── index.js ├── serviceWorker.js ├── setupTests.js └── types │ └── index.ts └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "eslint:recommended", 4 | "plugin:react/recommended", 5 | "plugin:prettier/recommended", 6 | "plugin:@typescript-eslint/recommended" 7 | ], 8 | "plugins": [ 9 | "prettier", 10 | "react", 11 | "react-hooks", 12 | "@typescript-eslint" 13 | ], 14 | "rules": { 15 | "eqeqeq": "error", 16 | "no-console": "warn", 17 | "prettier/prettier": "error", 18 | "react/display-name": "off", 19 | "react/no-children-prop": "off", 20 | // if you use React 17+; otherwise, turn this on 21 | "react/react-in-jsx-scope": "off", 22 | "react-hooks/rules-of-hooks": "error", 23 | "react-hooks/exhaustive-deps": "warn", 24 | "react/jsx-key": "off" 25 | }, 26 | "parserOptions": { 27 | "ecmaVersion": 6, 28 | "sourceType": "module", 29 | "ecmaFeatures": { 30 | "jsx": true 31 | } 32 | }, 33 | "env": { 34 | "browser": true, 35 | "node": true, 36 | "es6": true, 37 | "jest": true 38 | }, 39 | "ignorePatterns": [ 40 | "node_modules", 41 | "build", 42 | "dist", 43 | "public" 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /.tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es5", 5 | "lib": ["es6", "dom"], 6 | "sourceMap": true, 7 | "allowJs": true, 8 | "jsx": "react", 9 | "moduleResolution": "node", 10 | "rootDir": "src", 11 | "noImplicitReturns": true, 12 | "noImplicitAny": true, 13 | "strictNullChecks": true 14 | }, 15 | "exclude": [ 16 | "node_modules", 17 | "build", 18 | "scripts", 19 | "acceptance-tests", 20 | "webpack", 21 | "jest", 22 | "src/setupTests.ts" 23 | ], 24 | "types": [ 25 | "typePatches" 26 | ] 27 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Debug graphql", 5 | "program": "${workspaceFolder}/graphql/app.js", 6 | "request": "launch", 7 | "skipFiles": [ 8 | "/**" 9 | ], 10 | "type": "pwa-node" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 2 | 3 | ## Available Scripts 4 | 5 | In the project directory, you can run: 6 | 7 | ### `yarn start` 8 | 9 | Runs the app in the development mode.
10 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 11 | 12 | The page will reload if you make edits.
13 | You will also see any lint errors in the console. 14 | 15 | ### `yarn test` 16 | 17 | Launches the test runner in the interactive watch mode.
18 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 19 | 20 | ### `yarn build` 21 | 22 | Builds the app for production to the `build` folder.
23 | It correctly bundles React in production mode and optimizes the build for the best performance. 24 | 25 | The build is minified and the filenames include the hashes.
26 | Your app is ready to be deployed! 27 | 28 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 29 | 30 | ### `yarn eject` 31 | 32 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 33 | 34 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 35 | 36 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 37 | 38 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 39 | 40 | ## Learn More 41 | 42 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 43 | 44 | To learn React, check out the [React documentation](https://reactjs.org/). 45 | 46 | ### Code Splitting 47 | 48 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting 49 | 50 | ### Analyzing the Bundle Size 51 | 52 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size 53 | 54 | ### Making a Progressive Web App 55 | 56 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app 57 | 58 | ### Advanced Configuration 59 | 60 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration 61 | 62 | ### Deployment 63 | 64 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment 65 | 66 | ### `yarn build` fails to minify 67 | 68 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify 69 | -------------------------------------------------------------------------------- /graphql/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | 3 | .env 4 | database/certs/* -------------------------------------------------------------------------------- /graphql/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "skipFiles": [ 12 | "/**" 13 | ], 14 | "program": "${workspaceFolder}/app.js" 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /graphql/api/posts/index.js: -------------------------------------------------------------------------------- 1 | const db = require("../../database/mysql"); 2 | const { errorHandler } = require("../utils"); 3 | const intersection = require("lodash/intersection"); 4 | 5 | module.exports = { 6 | getPost: async (id) => { 7 | const posts = db 8 | .select("*") 9 | .from("blog_posts") 10 | .where({ id }) 11 | .catch(errorHandler); 12 | 13 | const comments = await db 14 | .select("*") 15 | .from("blog_post_comments") 16 | .where({ post_id: id }) 17 | .catch(errorHandler); 18 | 19 | let commentAuthorIds = [ 20 | ...new Set(comments.map(({ author_id }) => author_id)), 21 | ]; 22 | 23 | let commentAuthors = await db 24 | .select("*") 25 | .from("users") 26 | .whereIn("id", commentAuthorIds); 27 | 28 | comments.forEach((comment) => { 29 | let authorUser = commentAuthors.find( 30 | ({ id }) => id === comment.author_id 31 | ); 32 | 33 | comment.author = `${authorUser.first_name} ${authorUser.last_name}`; 34 | comment.author_image = authorUser.image; 35 | }); 36 | 37 | let likes = db 38 | .select("*") 39 | .from("blog_post_likes") 40 | .where({ post_id: id }) 41 | .catch(errorHandler); 42 | 43 | let categories = await db 44 | .select("*") 45 | .from("blog_post_categories") 46 | .leftJoin("blog_categories", "category_id", "blog_categories.id") 47 | .where({ post_id: id }); 48 | 49 | let [post] = await posts; 50 | 51 | return { 52 | ...post, 53 | comments, 54 | likes: await likes.length, 55 | categories: await categories.map(({ label }) => label), 56 | }; 57 | }, 58 | 59 | createPost: async (args) => 60 | await db.insert(args.data).then((res) => { 61 | return res; 62 | }), 63 | 64 | getPosts: (type, category_ids) => { 65 | let qry = db 66 | .select( 67 | "blog_posts.id", 68 | "blog_posts.description", 69 | "blog_posts.author_id", 70 | "title", 71 | "image", 72 | "created_at", 73 | "updated_at", 74 | db.raw("GROUP_CONCAT(label) as categories"), 75 | db.raw("GROUP_CONCAT(blog_categories.id) as cat_ids") 76 | ) 77 | .from("blog_posts") 78 | .leftJoin( 79 | "blog_post_categories", 80 | "blog_posts.id", 81 | "blog_post_categories.post_id" 82 | ) 83 | .leftJoin( 84 | "blog_categories", 85 | "blog_post_categories.category_id", 86 | "blog_categories.id" 87 | ) 88 | .where({ active: 1 }) 89 | .groupBy("blog_posts.id"); 90 | 91 | qry = { 92 | trending: () => 93 | qry 94 | .select(db.raw("COUNT(blog_post_likes.author_id) as likes")) 95 | .leftJoin( 96 | "blog_post_likes", 97 | "blog_post_likes.post_id", 98 | "blog_posts.id" 99 | ) 100 | .groupBy("blog_posts.id") 101 | .orderBy("likes", "asc") 102 | .limit(5), 103 | 104 | featured: () => qry.whereIn("blog_posts.id", [1, 2, 3, 4]), 105 | 106 | recent: () => qry.orderBy("updated_at", "desc").limit(5), 107 | 108 | default: () => qry, 109 | }[type || "default"](); 110 | 111 | return qry 112 | .then((data) => { 113 | if (category_ids) { 114 | return data.filter( 115 | (post) => 116 | post.cat_ids && 117 | intersection(post.cat_ids.split(",").map(parseInt), category_ids) 118 | .length 119 | ); 120 | } 121 | return data; 122 | }) 123 | .catch((err) => { 124 | console.log(err); 125 | }); 126 | }, 127 | 128 | getPostsLikeCounts: async (ids) => 129 | await db 130 | .select("COUNT(author_id) as likes", "post_id") 131 | .from("blog_post_likes") 132 | .groupBy("post_id") 133 | .whereIn("post_id", ids) 134 | .catch(errorHandler), 135 | 136 | getPostComments: async (id) => 137 | await db 138 | .select("*") 139 | .from("blog_post_comments") 140 | .where("post_id", id) 141 | .catch(errorHandler), 142 | 143 | getPostsAuthors: async (ids) => 144 | await db.select("*").from("users").where("id", ids).catch(errorHandler), 145 | }; 146 | -------------------------------------------------------------------------------- /graphql/api/utils.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | errorHandler: (err) => { 3 | throw new Error(err) 4 | } 5 | } -------------------------------------------------------------------------------- /graphql/app.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa') 2 | const {ApolloServer} = require('apollo-server-koa') 3 | const {makeExecutableSchema} = require('graphql-tools') 4 | const {resolvers, typeDefs} = require('./schemas') 5 | const PORT = 4000 6 | 7 | const server = new ApolloServer({ 8 | schema: makeExecutableSchema({typeDefs, resolvers}) 9 | }) 10 | 11 | const app = new Koa() 12 | server.applyMiddleware({app}) 13 | 14 | app.listen({ port: PORT }, () => { 15 | console.log(` Server ready at http://localhost:${PORT + server.graphqlPath}`) 16 | }) 17 | -------------------------------------------------------------------------------- /graphql/database/actions/create-migration.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | 4 | let tableName 5 | 6 | try { 7 | tableName = process 8 | .argv 9 | .find((arg) => 10 | arg.includes('--tableName=') 11 | ).split('=')[1] 12 | } catch(err) { 13 | return console.error('--tableName parameter not found. Please specify a table name.') 14 | } 15 | 16 | const fileName = new Date().getTime() + `_${tableName}.sql` 17 | 18 | fs.writeFile(path.resolve(__dirname, `../migrations/${fileName}`), '', (err) => { 19 | if (err) throw new Error(err) 20 | console.log('Created new migration file in migrations folder.') 21 | }) -------------------------------------------------------------------------------- /graphql/database/actions/db-connect.js: -------------------------------------------------------------------------------- 1 | const knex = require('../mysql') 2 | 3 | knex.raw('show schemas') 4 | .then(res => console.log(res)) -------------------------------------------------------------------------------- /graphql/database/actions/run-migration.js: -------------------------------------------------------------------------------- 1 | const knex = require("../mysql"); 2 | const promise = require("bluebird"); 3 | const path = require("path"); 4 | const fs = require("fs"); 5 | const db = knex.client.config.connection.database || null; 6 | 7 | function replaceAll(str, delimiter, replacement) { 8 | return str.split(delimiter).join(replacement); 9 | } 10 | 11 | fs.readdir(path.resolve(__dirname, "../migrations"), "utf-8", (err, files) => { 12 | if (err) return console.log(err); 13 | return promise 14 | .each(files, (fileName) => { 15 | return new Promise((resolve, reject) => { 16 | fs.readFile( 17 | path.resolve(__dirname, `../migrations/${fileName}`), 18 | "utf-8", 19 | (err, sql) => { 20 | if (err) reject(err); 21 | return knex 22 | .raw(replaceAll(sql, "{}", db)) 23 | .then(resolve) 24 | .catch((err) => { 25 | console.log(err); 26 | }); 27 | } 28 | ); 29 | }); 30 | }) 31 | .then(() => console.log("Migrations have run successfully.")) 32 | .catch((err) => { 33 | console.log(err); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /graphql/database/migrations/1591564582828_roles.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS {}.roles ( 2 | id INT(12) NOT NULL auto_increment PRIMARY KEY, 3 | title VARCHAR(20) NOT NULL 4 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564633084_users.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS {}.users ( 2 | id INT(12) NOT NULL auto_increment PRIMARY KEY, 3 | role_id INT(12) NOT NULL, 4 | email VARCHAR(30) NOT NULL, 5 | image VARCHAR(200), 6 | first_name VARCHAR(30), 7 | last_name VARCHAR(30), 8 | INDEX uemail (email), 9 | CONSTRAINT fk_urole FOREIGN KEY(role_id) 10 | REFERENCES roles(id) 11 | ON DELETE CASCADE 12 | ON UPDATE CASCADE 13 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564643738_permissions.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS {}.permissions ( 2 | id INT(12) NOT NULL auto_increment PRIMARY KEY, 3 | action VARCHAR(20) NOT NULL 4 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564652701_role_permissions.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS {}.roles_permissions ( 2 | role_id INT(12) NOT NULL, 3 | permission_id INT(12) NOT NULL, 4 | UNIQUE KEY(role_id, permission_id), 5 | CONSTRAINT fk_rprole FOREIGN KEY (role_id) 6 | REFERENCES roles(id) 7 | ON DELETE CASCADE 8 | ON UPDATE CASCADE, 9 | CONSTRAINT fs_rppermission FOREIGN KEY (permission_id) 10 | REFERENCES permissions(id) 11 | ON DELETE CASCADE 12 | ON UPDATE CASCADE 13 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564660955_blog_categories.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS {}.blog_categories ( 2 | id INT(12) NOT NULL auto_increment PRIMARY KEY, 3 | label VARCHAR(100) NOT NULL, 4 | description VARCHAR (300) NOT NULL 5 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564665733_blog_posts.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS blog_posts ( 2 | id INT(12) NOT NULL auto_increment PRIMARY KEY, 3 | author_id INT(12) NOT NULL, 4 | title VARCHAR(50) NOT NULL, 5 | description VARCHAR(200) NOT NULL, 6 | text MEDIUMTEXT NOT NULL, 7 | keyword1 VARCHAR(50) NOT NULL, 8 | keyword2 VARCHAR(50) NOT NULL, 9 | image VARCHAR(400) NOT NULL, 10 | bg_src VARCHAR(400) NOT NULL, 11 | bg_type VARCHAR(10) NOT NULL, 12 | active TINYINT(1) NOT NULL DEFAULT 0, 13 | updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, 14 | created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, 15 | INDEX bpauthor_ind (author_id), 16 | CONSTRAINT fk_bpauthor FOREIGN KEY (author_id) 17 | REFERENCES users(id) 18 | ON DELETE CASCADE 19 | ON UPDATE CASCADE 20 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564674855_blog_post_comments.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS blog_post_comments ( 2 | id INT(12) NOT NULL auto_increment PRIMARY KEY, 3 | post_id INT(12) NOT NULL, 4 | author_id INT(12) NOT NULL, 5 | comment VARCHAR(250) NOT NULL, 6 | INDEX bpcauthor_ind (author_id), 7 | INDEX bpcpost_ind (post_id), 8 | CONSTRAINT fk_bpcauthor FOREIGN KEY (author_id) 9 | REFERENCES users(id) 10 | ON DELETE CASCADE 11 | ON UPDATE CASCADE, 12 | CONSTRAINT fk_bpcpost FOREIGN KEY (post_id) 13 | REFERENCES blog_posts(id) 14 | ON DELETE CASCADE 15 | ON UPDATE CASCADE 16 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564679465_blog_post_categories.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS blog_post_categories ( 2 | post_id INT(12) NOT NULL, 3 | category_id INT(12) NOT NULL, 4 | UNIQUE KEY(post_id, category_id), 5 | CONSTRAINT fk_bpcatpost FOREIGN KEY (post_id) 6 | REFERENCES blog_posts(id) 7 | ON DELETE CASCADE 8 | ON UPDATE CASCADE, 9 | CONSTRAINT fk_bpcatcategory FOREIGN KEY (category_id) 10 | REFERENCES blog_categories(id) 11 | ON DELETE CASCADE 12 | ON UPDATE CASCADE 13 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564684092_blog_post_likes.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS blog_post_likes ( 2 | post_id INT(12) NOT NULL, 3 | author_id INT(12) NOT NULL, 4 | UNIQUE KEY(post_id, author_id), 5 | CONSTRAINT fk_bplpost FOREIGN KEY(post_id) 6 | REFERENCES blog_posts(id) 7 | ON DELETE CASCADE 8 | ON UPDATE CASCADE, 9 | CONSTRAINT fk_bplauthor FOREIGN KEY(author_id) 10 | REFERENCES users(id) 11 | ON DELETE CASCADE 12 | ON UPDATE CASCADE 13 | ) -------------------------------------------------------------------------------- /graphql/database/migrations/1591564700514_seeds.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO roles(title) 2 | VALUES 3 | ('admin'), 4 | ('blogger'); 5 | 6 | INSERT INTO permissions(action) 7 | VALUES 8 | ('post'), 9 | ('manage-users'); 10 | 11 | INSERT INTO roles_permissions (role_id, permission_id) 12 | VALUES 13 | (1, 1), 14 | (1, 2), 15 | (2, 1); 16 | 17 | INSERT INTO users (role_id, email, first_name, last_name) 18 | VALUES 19 | (1, 'mcoder@lavishweb.com', 'Miguel', 'Coder'); 20 | 21 | INSERT INTO blog_categories (label, description) 22 | VALUES 23 | ('JavaScript', 'Category description here.. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam error eius quo, officiis non maxime quos reiciendis perferendis doloremque maiores!'), 24 | ('React', 'Category description here.. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam error eius quo, officiis non maxime quos reiciendis perferendis doloremque maiores!'), 25 | ('Vue', 'Category description here.. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam error eius quo, officiis non maxime quos reiciendis perferendis doloremque maiores!'), 26 | ('Tech Culture', 'Category description here.. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam error eius quo, officiis non maxime quos reiciendis perferendis doloremque maiores!'), 27 | ('Tech News', 'Category description here.. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam error eius quo, officiis non maxime quos reiciendis perferendis doloremque maiores!'), 28 | ('Brain Health', 'Category description here.. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam error eius quo, officiis non maxime quos reiciendis perferendis doloremque maiores!'), 29 | ('Cloud Services', 'Category description here.. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam error eius quo, officiis non maxime quos reiciendis perferendis doloremque maiores!'); 30 | 31 | INSERT INTO blog_posts (author_id, title, description, text, image, active, keyword1, keyword2, bg_src, bg_type) 32 | VALUES 33 | (1, 'Can anyone code?', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'anyone_can_code.jpg', 1,'Programming', 'Everyone', 'anyone_can_code.jpg','Image'), 34 | (1, 'Using AWS S3 for storing blog images', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'cloud_storage.jpeg', 1, 'Functional Programming', 'ES6', 'cloud_storage.jpeg','Image'), 35 | (1, 'Popular Programming Languages in 2020', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'programming_languages.jpeg', 1, 'Functional Programming', 'ES6', 'programming_languages.jpeg','Image'), 36 | (1, 'Brain Hacks for Learning to Program', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'neuron.jpg', 1, 'Functional Programming', 'ES6', 'neuron.jpg','Image'), 37 | (1, 'Software Engineer Salary in 2020', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'money.jpg', 1, 'Functional Programming', 'ES6', 'money.jpg','Image'), 38 | (1, 'GraphQL vs REST', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'apollo_graphql.png', 1, 'Functional Programming', 'ES6', 'apollo_graphql.png','Image'), 39 | (1, 'A Day in the Life of a Programmer', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'puzzled_programmer.jpeg', 1, 'Functional Programming', 'ES6', 'puzzled_programmer.jpeg','Image'), 40 | (1, 'Brain Hacks for Learning to Program', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'neuron.jpg', 1, 'Functional Programming', 'ES6', 'neuron.jpg','Image'), 41 | (1, 'React Vs Vue', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.', '', 'logo.png', 1, 'Functional Programming', 'ES6', 'logo.png','Image'); 42 | 43 | INSERT INTO blog_post_comments (post_id, author_id, comment) 44 | VALUES 45 | (1, 1, 'Totally broooo!'), 46 | (1, 1, 'Friggin owrsome'); 47 | 48 | INSERT INTO blog_post_categories (post_id, category_id) 49 | VALUES 50 | (1,4), 51 | (1,5), 52 | (2,7), 53 | (3,4), 54 | (3,5), 55 | (4,6), 56 | (5,4), 57 | (6,1), 58 | (6,2), 59 | (7,4), 60 | (8,6), 61 | (9,2), 62 | (9,3); -------------------------------------------------------------------------------- /graphql/database/mysql.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | 3 | let config = { 4 | client: 'mysql2', 5 | connection: { 6 | host:process.env.MYSQL_HOST, 7 | user:process.env.MYSQL_USER, 8 | password:process.env.MYSQL_PASS, 9 | database: process.env.MYSQL_DB, 10 | multipleStatements: true 11 | } 12 | } 13 | 14 | module.exports = require('knex')(config) -------------------------------------------------------------------------------- /graphql/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-blog-backend", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@apollo/protobufjs": { 8 | "version": "1.0.3", 9 | "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.0.3.tgz", 10 | "integrity": "sha512-gqeT810Ect9WIqsrgfUvr+ljSB5m1PyBae9HGdrRyQ3HjHjTcjVvxpsMYXlUk4rUHnrfUqyoGvLSy2yLlRGEOw==", 11 | "requires": { 12 | "@protobufjs/aspromise": "^1.1.2", 13 | "@protobufjs/base64": "^1.1.2", 14 | "@protobufjs/codegen": "^2.0.4", 15 | "@protobufjs/eventemitter": "^1.1.0", 16 | "@protobufjs/fetch": "^1.1.0", 17 | "@protobufjs/float": "^1.0.2", 18 | "@protobufjs/inquire": "^1.1.0", 19 | "@protobufjs/path": "^1.1.2", 20 | "@protobufjs/pool": "^1.1.0", 21 | "@protobufjs/utf8": "^1.1.0", 22 | "@types/long": "^4.0.0", 23 | "@types/node": "^10.1.0", 24 | "long": "^4.0.0" 25 | }, 26 | "dependencies": { 27 | "@types/node": { 28 | "version": "10.17.21", 29 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.21.tgz", 30 | "integrity": "sha512-PQKsydPxYxF1DsAFWmunaxd3sOi3iMt6Zmx/tgaagHYmwJ/9cRH91hQkeJZaUGWbvn0K5HlSVEXkn5U/llWPpQ==" 31 | } 32 | } 33 | }, 34 | "@apollographql/apollo-tools": { 35 | "version": "0.4.8", 36 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz", 37 | "integrity": "sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA==", 38 | "requires": { 39 | "apollo-env": "^0.6.5" 40 | } 41 | }, 42 | "@apollographql/graphql-playground-html": { 43 | "version": "1.6.24", 44 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz", 45 | "integrity": "sha512-8GqG48m1XqyXh4mIZrtB5xOhUwSsh1WsrrsaZQOEYYql3YN9DEu9OOSg0ILzXHZo/h2Q74777YE4YzlArQzQEQ==" 46 | }, 47 | "@babel/runtime": { 48 | "version": "7.9.6", 49 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", 50 | "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", 51 | "requires": { 52 | "regenerator-runtime": "^0.13.4" 53 | } 54 | }, 55 | "@koa/cors": { 56 | "version": "2.2.3", 57 | "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-2.2.3.tgz", 58 | "integrity": "sha512-tCVVXa39ETsit5kGBtEWWimjLn1sDaeu8+0phgb8kT3GmBDZOykkI3ZO8nMjV2p3MGkJI4K5P+bxR8Ztq0bwsA==", 59 | "requires": { 60 | "vary": "^1.1.2" 61 | } 62 | }, 63 | "@protobufjs/aspromise": { 64 | "version": "1.1.2", 65 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 66 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 67 | }, 68 | "@protobufjs/base64": { 69 | "version": "1.1.2", 70 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 71 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 72 | }, 73 | "@protobufjs/codegen": { 74 | "version": "2.0.4", 75 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 76 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 77 | }, 78 | "@protobufjs/eventemitter": { 79 | "version": "1.1.0", 80 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 81 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 82 | }, 83 | "@protobufjs/fetch": { 84 | "version": "1.1.0", 85 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 86 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 87 | "requires": { 88 | "@protobufjs/aspromise": "^1.1.1", 89 | "@protobufjs/inquire": "^1.1.0" 90 | } 91 | }, 92 | "@protobufjs/float": { 93 | "version": "1.0.2", 94 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 95 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 96 | }, 97 | "@protobufjs/inquire": { 98 | "version": "1.1.0", 99 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 100 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 101 | }, 102 | "@protobufjs/path": { 103 | "version": "1.1.2", 104 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 105 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 106 | }, 107 | "@protobufjs/pool": { 108 | "version": "1.1.0", 109 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 110 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 111 | }, 112 | "@protobufjs/utf8": { 113 | "version": "1.1.0", 114 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 115 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 116 | }, 117 | "@types/accepts": { 118 | "version": "1.3.5", 119 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", 120 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", 121 | "requires": { 122 | "@types/node": "*" 123 | } 124 | }, 125 | "@types/body-parser": { 126 | "version": "1.19.0", 127 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 128 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 129 | "requires": { 130 | "@types/connect": "*", 131 | "@types/node": "*" 132 | } 133 | }, 134 | "@types/connect": { 135 | "version": "3.4.33", 136 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 137 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 138 | "requires": { 139 | "@types/node": "*" 140 | } 141 | }, 142 | "@types/content-disposition": { 143 | "version": "0.5.3", 144 | "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz", 145 | "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==" 146 | }, 147 | "@types/cookies": { 148 | "version": "0.7.4", 149 | "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.4.tgz", 150 | "integrity": "sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw==", 151 | "requires": { 152 | "@types/connect": "*", 153 | "@types/express": "*", 154 | "@types/keygrip": "*", 155 | "@types/node": "*" 156 | } 157 | }, 158 | "@types/cors": { 159 | "version": "2.8.6", 160 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.6.tgz", 161 | "integrity": "sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg==", 162 | "requires": { 163 | "@types/express": "*" 164 | } 165 | }, 166 | "@types/express": { 167 | "version": "4.17.6", 168 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.6.tgz", 169 | "integrity": "sha512-n/mr9tZI83kd4azlPG5y997C/M4DNABK9yErhFM6hKdym4kkmd9j0vtsJyjFIwfRBxtrxZtAfGZCNRIBMFLK5w==", 170 | "requires": { 171 | "@types/body-parser": "*", 172 | "@types/express-serve-static-core": "*", 173 | "@types/qs": "*", 174 | "@types/serve-static": "*" 175 | } 176 | }, 177 | "@types/express-serve-static-core": { 178 | "version": "4.17.7", 179 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.7.tgz", 180 | "integrity": "sha512-EMgTj/DF9qpgLXyc+Btimg+XoH7A2liE8uKul8qSmMTHCeNYzydDKFdsJskDvw42UsesCnhO63dO0Grbj8J4Dw==", 181 | "requires": { 182 | "@types/node": "*", 183 | "@types/qs": "*", 184 | "@types/range-parser": "*" 185 | } 186 | }, 187 | "@types/fs-capacitor": { 188 | "version": "2.0.0", 189 | "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", 190 | "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==", 191 | "requires": { 192 | "@types/node": "*" 193 | } 194 | }, 195 | "@types/graphql-upload": { 196 | "version": "8.0.3", 197 | "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-8.0.3.tgz", 198 | "integrity": "sha512-hmLg9pCU/GmxBscg8GCr1vmSoEmbItNNxdD5YH2TJkXm//8atjwuprB+xJBK714JG1dkxbbhp5RHX+Pz1KsCMA==", 199 | "requires": { 200 | "@types/express": "*", 201 | "@types/fs-capacitor": "*", 202 | "@types/koa": "*", 203 | "graphql": "^14.5.3" 204 | } 205 | }, 206 | "@types/http-assert": { 207 | "version": "1.5.1", 208 | "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", 209 | "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==" 210 | }, 211 | "@types/keygrip": { 212 | "version": "1.0.2", 213 | "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", 214 | "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" 215 | }, 216 | "@types/koa": { 217 | "version": "2.11.3", 218 | "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.3.tgz", 219 | "integrity": "sha512-ABxVkrNWa4O/Jp24EYI/hRNqEVRlhB9g09p48neQp4m3xL1TJtdWk2NyNQSMCU45ejeELMQZBYyfstyVvO2H3Q==", 220 | "requires": { 221 | "@types/accepts": "*", 222 | "@types/content-disposition": "*", 223 | "@types/cookies": "*", 224 | "@types/http-assert": "*", 225 | "@types/keygrip": "*", 226 | "@types/koa-compose": "*", 227 | "@types/node": "*" 228 | } 229 | }, 230 | "@types/koa-bodyparser": { 231 | "version": "4.3.0", 232 | "resolved": "https://registry.npmjs.org/@types/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", 233 | "integrity": "sha512-aB/vwwq4G9FAtKzqZ2p8UHTscXxZvICFKVjuckqxCtkX1Ro7F5KHkTCUqTRZFBgDoEkmeca+bFLI1bIsdPPZTA==", 234 | "requires": { 235 | "@types/koa": "*" 236 | } 237 | }, 238 | "@types/koa-compose": { 239 | "version": "3.2.5", 240 | "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", 241 | "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", 242 | "requires": { 243 | "@types/koa": "*" 244 | } 245 | }, 246 | "@types/koa__cors": { 247 | "version": "2.2.3", 248 | "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-2.2.3.tgz", 249 | "integrity": "sha512-RfG2EuSc+nv/E+xbDSLW8KCoeri/3AkqwVPuENfF/DctllRoXhooboO//Sw7yFtkLvj7nG7O1H3JcZmoTQz8nQ==", 250 | "requires": { 251 | "@types/koa": "*" 252 | } 253 | }, 254 | "@types/long": { 255 | "version": "4.0.1", 256 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 257 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 258 | }, 259 | "@types/mime": { 260 | "version": "2.0.1", 261 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", 262 | "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" 263 | }, 264 | "@types/node": { 265 | "version": "13.13.5", 266 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", 267 | "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==" 268 | }, 269 | "@types/node-fetch": { 270 | "version": "2.5.7", 271 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", 272 | "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", 273 | "requires": { 274 | "@types/node": "*", 275 | "form-data": "^3.0.0" 276 | } 277 | }, 278 | "@types/qs": { 279 | "version": "6.9.2", 280 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.2.tgz", 281 | "integrity": "sha512-a9bDi4Z3zCZf4Lv1X/vwnvbbDYSNz59h3i3KdyuYYN+YrLjSeJD0dnphdULDfySvUv6Exy/O0K6wX/kQpnPQ+A==" 282 | }, 283 | "@types/range-parser": { 284 | "version": "1.2.3", 285 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 286 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 287 | }, 288 | "@types/serve-static": { 289 | "version": "1.13.3", 290 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", 291 | "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", 292 | "requires": { 293 | "@types/express-serve-static-core": "*", 294 | "@types/mime": "*" 295 | } 296 | }, 297 | "@types/ws": { 298 | "version": "7.2.4", 299 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.4.tgz", 300 | "integrity": "sha512-9S6Ask71vujkVyeEXKxjBSUV8ZUB0mjL5la4IncBoheu04bDaYyUKErh1BQcY9+WzOUOiKqz/OnpJHYckbMfNg==", 301 | "requires": { 302 | "@types/node": "*" 303 | } 304 | }, 305 | "@wry/equality": { 306 | "version": "0.1.11", 307 | "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", 308 | "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", 309 | "requires": { 310 | "tslib": "^1.9.3" 311 | } 312 | }, 313 | "accepts": { 314 | "version": "1.3.7", 315 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 316 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 317 | "requires": { 318 | "mime-types": "~2.1.24", 319 | "negotiator": "0.6.2" 320 | } 321 | }, 322 | "ansicolors": { 323 | "version": "0.3.2", 324 | "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", 325 | "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", 326 | "dev": true 327 | }, 328 | "any-promise": { 329 | "version": "1.3.0", 330 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 331 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 332 | }, 333 | "apollo-cache-control": { 334 | "version": "0.10.0", 335 | "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.10.0.tgz", 336 | "integrity": "sha512-UIcPlrPdRTOKrF7kc5/WD5i6EVkGEEqgOK/fMj92fnnxR1KnQDiN82lqaxu02eZJvWjFJjik0JVJNXKOJXVrpQ==", 337 | "requires": { 338 | "apollo-server-env": "^2.4.3", 339 | "graphql-extensions": "^0.12.0" 340 | } 341 | }, 342 | "apollo-datasource": { 343 | "version": "0.7.0", 344 | "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.0.tgz", 345 | "integrity": "sha512-Yja12BgNQhzuFGG/5Nw2MQe0hkuQy2+9er09HxeEyAf2rUDIPnhPrn1MDoZTB8MU7UGfjwITC+1ofzKkkrZobA==", 346 | "requires": { 347 | "apollo-server-caching": "^0.5.1", 348 | "apollo-server-env": "^2.4.3" 349 | } 350 | }, 351 | "apollo-engine-reporting": { 352 | "version": "1.8.0", 353 | "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-1.8.0.tgz", 354 | "integrity": "sha512-VPVpIGW6lbYXga6sqq/fG8ZaPR70bFuxvCov6X0npuVQPXwgZrzBp50cHx9uIaBVxDDxD3leeznsQbmF37RAww==", 355 | "requires": { 356 | "apollo-engine-reporting-protobuf": "^0.5.0", 357 | "apollo-graphql": "^0.4.0", 358 | "apollo-server-caching": "^0.5.1", 359 | "apollo-server-env": "^2.4.3", 360 | "apollo-server-errors": "^2.4.1", 361 | "apollo-server-types": "^0.4.0", 362 | "async-retry": "^1.2.1", 363 | "graphql-extensions": "^0.12.0" 364 | } 365 | }, 366 | "apollo-engine-reporting-protobuf": { 367 | "version": "0.5.0", 368 | "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.0.tgz", 369 | "integrity": "sha512-OgMwtLcuL+YAaO2xgkPbnRJnISLDSNE5F11p7oq+1ws+ws71CPfHAthDCxSObCPSALdhsLAGD0v3u3soBuNmMg==", 370 | "requires": { 371 | "@apollo/protobufjs": "^1.0.3" 372 | } 373 | }, 374 | "apollo-env": { 375 | "version": "0.6.5", 376 | "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.5.tgz", 377 | "integrity": "sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg==", 378 | "requires": { 379 | "@types/node-fetch": "2.5.7", 380 | "core-js": "^3.0.1", 381 | "node-fetch": "^2.2.0", 382 | "sha.js": "^2.4.11" 383 | } 384 | }, 385 | "apollo-graphql": { 386 | "version": "0.4.4", 387 | "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.4.4.tgz", 388 | "integrity": "sha512-i012iRKT5nfsOaNMx4MTwHw2jrlyaF1zikpejxsGHsKIf3OngGvGh3pyw20bEmwj413OrNQpRxvvIz5A7W/8xw==", 389 | "requires": { 390 | "apollo-env": "^0.6.5", 391 | "lodash.sortby": "^4.7.0" 392 | } 393 | }, 394 | "apollo-link": { 395 | "version": "1.2.14", 396 | "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", 397 | "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", 398 | "requires": { 399 | "apollo-utilities": "^1.3.0", 400 | "ts-invariant": "^0.4.0", 401 | "tslib": "^1.9.3", 402 | "zen-observable-ts": "^0.8.21" 403 | } 404 | }, 405 | "apollo-link-http-common": { 406 | "version": "0.2.16", 407 | "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz", 408 | "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==", 409 | "requires": { 410 | "apollo-link": "^1.2.14", 411 | "ts-invariant": "^0.4.0", 412 | "tslib": "^1.9.3" 413 | } 414 | }, 415 | "apollo-server-caching": { 416 | "version": "0.5.1", 417 | "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.1.tgz", 418 | "integrity": "sha512-L7LHZ3k9Ao5OSf2WStvQhxdsNVplRQi7kCAPfqf9Z3GBEnQ2uaL0EgO0hSmtVHfXTbk5CTRziMT1Pe87bXrFIw==", 419 | "requires": { 420 | "lru-cache": "^5.0.0" 421 | } 422 | }, 423 | "apollo-server-core": { 424 | "version": "2.13.0", 425 | "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.13.0.tgz", 426 | "integrity": "sha512-PqfsexbyObaQYb2jODs8v/XzrJcn+5mh0jA8ZfQCg5GENlua/CjeTZbRm2X0p3qpwc2E5jFAXSshrIWvhQAGZQ==", 427 | "requires": { 428 | "@apollographql/apollo-tools": "^0.4.3", 429 | "@apollographql/graphql-playground-html": "1.6.24", 430 | "@types/graphql-upload": "^8.0.0", 431 | "@types/ws": "^7.0.0", 432 | "apollo-cache-control": "^0.10.0", 433 | "apollo-datasource": "^0.7.0", 434 | "apollo-engine-reporting": "^1.8.0", 435 | "apollo-server-caching": "^0.5.1", 436 | "apollo-server-env": "^2.4.3", 437 | "apollo-server-errors": "^2.4.1", 438 | "apollo-server-plugin-base": "^0.8.0", 439 | "apollo-server-types": "^0.4.0", 440 | "apollo-tracing": "^0.10.0", 441 | "fast-json-stable-stringify": "^2.0.0", 442 | "graphql-extensions": "^0.12.0", 443 | "graphql-tag": "^2.9.2", 444 | "graphql-tools": "^4.0.0", 445 | "graphql-upload": "^8.0.2", 446 | "loglevel": "^1.6.7", 447 | "sha.js": "^2.4.11", 448 | "subscriptions-transport-ws": "^0.9.11", 449 | "ws": "^6.0.0" 450 | }, 451 | "dependencies": { 452 | "graphql-tools": { 453 | "version": "4.0.8", 454 | "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", 455 | "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", 456 | "requires": { 457 | "apollo-link": "^1.2.14", 458 | "apollo-utilities": "^1.0.1", 459 | "deprecated-decorator": "^0.1.6", 460 | "iterall": "^1.1.3", 461 | "uuid": "^3.1.0" 462 | } 463 | } 464 | } 465 | }, 466 | "apollo-server-env": { 467 | "version": "2.4.3", 468 | "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.3.tgz", 469 | "integrity": "sha512-23R5Xo9OMYX0iyTu2/qT0EUb+AULCBriA9w8HDfMoChB8M+lFClqUkYtaTTHDfp6eoARLW8kDBhPOBavsvKAjA==", 470 | "requires": { 471 | "node-fetch": "^2.1.2", 472 | "util.promisify": "^1.0.0" 473 | } 474 | }, 475 | "apollo-server-errors": { 476 | "version": "2.4.1", 477 | "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.4.1.tgz", 478 | "integrity": "sha512-7oEd6pUxqyWYUbQ9TA8tM0NU/3aGtXSEibo6+txUkuHe7QaxfZ2wHRp+pfT1LC1K3RXYjKj61/C2xEO19s3Kdg==" 479 | }, 480 | "apollo-server-koa": { 481 | "version": "2.13.0", 482 | "resolved": "https://registry.npmjs.org/apollo-server-koa/-/apollo-server-koa-2.13.0.tgz", 483 | "integrity": "sha512-tNtDWvJWmOMJRX8Szo7lzWw7K+1l4j4Sc+Y2ZGfr83qSGi0CJM87DoRIPsCNXD2AQwiTJC2f8zKByVpS6NsoFQ==", 484 | "requires": { 485 | "@apollographql/graphql-playground-html": "1.6.24", 486 | "@koa/cors": "^2.2.1", 487 | "@types/accepts": "^1.3.5", 488 | "@types/cors": "^2.8.4", 489 | "@types/koa": "^2.0.46", 490 | "@types/koa-bodyparser": "^4.2.1", 491 | "@types/koa-compose": "^3.2.2", 492 | "@types/koa__cors": "^2.2.1", 493 | "accepts": "^1.3.5", 494 | "apollo-server-core": "^2.13.0", 495 | "apollo-server-types": "^0.4.0", 496 | "graphql-subscriptions": "^1.0.0", 497 | "graphql-tools": "^4.0.0", 498 | "koa": "2.11.0", 499 | "koa-bodyparser": "^4.2.1", 500 | "koa-compose": "^4.1.0", 501 | "koa-router": "^7.4.0", 502 | "type-is": "^1.6.16" 503 | }, 504 | "dependencies": { 505 | "graphql-tools": { 506 | "version": "4.0.8", 507 | "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", 508 | "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", 509 | "requires": { 510 | "apollo-link": "^1.2.14", 511 | "apollo-utilities": "^1.0.1", 512 | "deprecated-decorator": "^0.1.6", 513 | "iterall": "^1.1.3", 514 | "uuid": "^3.1.0" 515 | } 516 | } 517 | } 518 | }, 519 | "apollo-server-plugin-base": { 520 | "version": "0.8.0", 521 | "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.8.0.tgz", 522 | "integrity": "sha512-H8sJlOVJrF0IhYIFMv7NOgB6BFgqobXSZrj1y9ju6dq13OotsqcZC4fJOYc9oWzb/+/mqg/odtVioE71mj68yg==", 523 | "requires": { 524 | "apollo-server-types": "^0.4.0" 525 | } 526 | }, 527 | "apollo-server-types": { 528 | "version": "0.4.0", 529 | "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.4.0.tgz", 530 | "integrity": "sha512-U+6qKCdrucVSMEVvLSqSwxIGr3VI6vcfbhpD86sdb8MgHHGH6egjNAcLrPVRk1AyXs8RV0Ysus+vlj8rpouBzA==", 531 | "requires": { 532 | "apollo-engine-reporting-protobuf": "^0.5.0", 533 | "apollo-server-caching": "^0.5.1", 534 | "apollo-server-env": "^2.4.3" 535 | } 536 | }, 537 | "apollo-tracing": { 538 | "version": "0.10.0", 539 | "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.10.0.tgz", 540 | "integrity": "sha512-yuqA1KT0FQUfzVK3ZIk0hRIE8eUKx9Oklq83AGQxLtS/oafBj/VOCZAtJNJkyEqMJxXQT9uIBtbfO1789Gczkw==", 541 | "requires": { 542 | "apollo-server-env": "^2.4.3", 543 | "graphql-extensions": "^0.12.0" 544 | } 545 | }, 546 | "apollo-upload-client": { 547 | "version": "13.0.0", 548 | "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-13.0.0.tgz", 549 | "integrity": "sha512-lJ9/bk1BH1lD15WhWRha2J3+LrXrPIX5LP5EwiOUHv8PCORp4EUrcujrA3rI5hZeZygrTX8bshcuMdpqpSrvtA==", 550 | "requires": { 551 | "@babel/runtime": "^7.9.2", 552 | "apollo-link": "^1.2.12", 553 | "apollo-link-http-common": "^0.2.14", 554 | "extract-files": "^8.0.0" 555 | } 556 | }, 557 | "apollo-utilities": { 558 | "version": "1.3.4", 559 | "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", 560 | "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", 561 | "requires": { 562 | "@wry/equality": "^0.1.2", 563 | "fast-json-stable-stringify": "^2.0.0", 564 | "ts-invariant": "^0.4.0", 565 | "tslib": "^1.10.0" 566 | } 567 | }, 568 | "arr-diff": { 569 | "version": "4.0.0", 570 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 571 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", 572 | "dev": true 573 | }, 574 | "arr-flatten": { 575 | "version": "1.1.0", 576 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 577 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", 578 | "dev": true 579 | }, 580 | "arr-union": { 581 | "version": "3.1.0", 582 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 583 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", 584 | "dev": true 585 | }, 586 | "array-each": { 587 | "version": "1.0.1", 588 | "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", 589 | "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", 590 | "dev": true 591 | }, 592 | "array-slice": { 593 | "version": "1.1.0", 594 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", 595 | "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", 596 | "dev": true 597 | }, 598 | "array-unique": { 599 | "version": "0.3.2", 600 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 601 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", 602 | "dev": true 603 | }, 604 | "assign-symbols": { 605 | "version": "1.0.0", 606 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 607 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", 608 | "dev": true 609 | }, 610 | "async-limiter": { 611 | "version": "1.0.1", 612 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 613 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 614 | }, 615 | "async-retry": { 616 | "version": "1.3.1", 617 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", 618 | "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", 619 | "requires": { 620 | "retry": "0.12.0" 621 | } 622 | }, 623 | "asynckit": { 624 | "version": "0.4.0", 625 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 626 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 627 | }, 628 | "atob": { 629 | "version": "2.1.2", 630 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 631 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", 632 | "dev": true 633 | }, 634 | "backo2": { 635 | "version": "1.0.2", 636 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 637 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 638 | }, 639 | "base": { 640 | "version": "0.11.2", 641 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 642 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 643 | "dev": true, 644 | "requires": { 645 | "cache-base": "^1.0.1", 646 | "class-utils": "^0.3.5", 647 | "component-emitter": "^1.2.1", 648 | "define-property": "^1.0.0", 649 | "isobject": "^3.0.1", 650 | "mixin-deep": "^1.2.0", 651 | "pascalcase": "^0.1.1" 652 | }, 653 | "dependencies": { 654 | "define-property": { 655 | "version": "1.0.0", 656 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 657 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 658 | "dev": true, 659 | "requires": { 660 | "is-descriptor": "^1.0.0" 661 | } 662 | }, 663 | "is-accessor-descriptor": { 664 | "version": "1.0.0", 665 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 666 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 667 | "dev": true, 668 | "requires": { 669 | "kind-of": "^6.0.0" 670 | } 671 | }, 672 | "is-data-descriptor": { 673 | "version": "1.0.0", 674 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 675 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 676 | "dev": true, 677 | "requires": { 678 | "kind-of": "^6.0.0" 679 | } 680 | }, 681 | "is-descriptor": { 682 | "version": "1.0.2", 683 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 684 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 685 | "dev": true, 686 | "requires": { 687 | "is-accessor-descriptor": "^1.0.0", 688 | "is-data-descriptor": "^1.0.0", 689 | "kind-of": "^6.0.2" 690 | } 691 | } 692 | } 693 | }, 694 | "bluebird": { 695 | "version": "3.7.2", 696 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", 697 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" 698 | }, 699 | "braces": { 700 | "version": "2.3.2", 701 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 702 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 703 | "dev": true, 704 | "requires": { 705 | "arr-flatten": "^1.1.0", 706 | "array-unique": "^0.3.2", 707 | "extend-shallow": "^2.0.1", 708 | "fill-range": "^4.0.0", 709 | "isobject": "^3.0.1", 710 | "repeat-element": "^1.1.2", 711 | "snapdragon": "^0.8.1", 712 | "snapdragon-node": "^2.0.1", 713 | "split-string": "^3.0.2", 714 | "to-regex": "^3.0.1" 715 | }, 716 | "dependencies": { 717 | "extend-shallow": { 718 | "version": "2.0.1", 719 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 720 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 721 | "dev": true, 722 | "requires": { 723 | "is-extendable": "^0.1.0" 724 | } 725 | } 726 | } 727 | }, 728 | "busboy": { 729 | "version": "0.3.1", 730 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", 731 | "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", 732 | "requires": { 733 | "dicer": "0.3.0" 734 | } 735 | }, 736 | "bytes": { 737 | "version": "3.1.0", 738 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 739 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 740 | }, 741 | "cache-base": { 742 | "version": "1.0.1", 743 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 744 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 745 | "dev": true, 746 | "requires": { 747 | "collection-visit": "^1.0.0", 748 | "component-emitter": "^1.2.1", 749 | "get-value": "^2.0.6", 750 | "has-value": "^1.0.0", 751 | "isobject": "^3.0.1", 752 | "set-value": "^2.0.0", 753 | "to-object-path": "^0.3.0", 754 | "union-value": "^1.0.0", 755 | "unset-value": "^1.0.0" 756 | } 757 | }, 758 | "cache-content-type": { 759 | "version": "1.0.1", 760 | "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", 761 | "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", 762 | "requires": { 763 | "mime-types": "^2.1.18", 764 | "ylru": "^1.2.0" 765 | } 766 | }, 767 | "cardinal": { 768 | "version": "2.1.1", 769 | "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", 770 | "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", 771 | "dev": true, 772 | "requires": { 773 | "ansicolors": "~0.3.2", 774 | "redeyed": "~2.1.0" 775 | } 776 | }, 777 | "class-utils": { 778 | "version": "0.3.6", 779 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 780 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 781 | "dev": true, 782 | "requires": { 783 | "arr-union": "^3.1.0", 784 | "define-property": "^0.2.5", 785 | "isobject": "^3.0.0", 786 | "static-extend": "^0.1.1" 787 | }, 788 | "dependencies": { 789 | "define-property": { 790 | "version": "0.2.5", 791 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 792 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 793 | "dev": true, 794 | "requires": { 795 | "is-descriptor": "^0.1.0" 796 | } 797 | } 798 | } 799 | }, 800 | "co": { 801 | "version": "4.6.0", 802 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 803 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 804 | }, 805 | "co-body": { 806 | "version": "6.0.0", 807 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.0.0.tgz", 808 | "integrity": "sha512-9ZIcixguuuKIptnY8yemEOuhb71L/lLf+Rl5JfJEUiDNJk0e02MBt7BPxR2GEh5mw8dPthQYR4jPI/BnS1MQgw==", 809 | "requires": { 810 | "inflation": "^2.0.0", 811 | "qs": "^6.5.2", 812 | "raw-body": "^2.3.3", 813 | "type-is": "^1.6.16" 814 | } 815 | }, 816 | "collection-visit": { 817 | "version": "1.0.0", 818 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 819 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 820 | "dev": true, 821 | "requires": { 822 | "map-visit": "^1.0.0", 823 | "object-visit": "^1.0.0" 824 | } 825 | }, 826 | "colorette": { 827 | "version": "1.1.0", 828 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", 829 | "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==", 830 | "dev": true 831 | }, 832 | "combined-stream": { 833 | "version": "1.0.8", 834 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 835 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 836 | "requires": { 837 | "delayed-stream": "~1.0.0" 838 | } 839 | }, 840 | "commander": { 841 | "version": "5.1.0", 842 | "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", 843 | "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", 844 | "dev": true 845 | }, 846 | "component-emitter": { 847 | "version": "1.3.0", 848 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 849 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", 850 | "dev": true 851 | }, 852 | "content-disposition": { 853 | "version": "0.5.3", 854 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 855 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 856 | "requires": { 857 | "safe-buffer": "5.1.2" 858 | }, 859 | "dependencies": { 860 | "safe-buffer": { 861 | "version": "5.1.2", 862 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 863 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 864 | } 865 | } 866 | }, 867 | "content-type": { 868 | "version": "1.0.4", 869 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 870 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 871 | }, 872 | "cookies": { 873 | "version": "0.8.0", 874 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", 875 | "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", 876 | "requires": { 877 | "depd": "~2.0.0", 878 | "keygrip": "~1.1.0" 879 | }, 880 | "dependencies": { 881 | "depd": { 882 | "version": "2.0.0", 883 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 884 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 885 | } 886 | } 887 | }, 888 | "copy-descriptor": { 889 | "version": "0.1.1", 890 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 891 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", 892 | "dev": true 893 | }, 894 | "copy-to": { 895 | "version": "2.0.1", 896 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 897 | "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" 898 | }, 899 | "core-js": { 900 | "version": "3.6.5", 901 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", 902 | "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" 903 | }, 904 | "debug": { 905 | "version": "3.1.0", 906 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 907 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 908 | "requires": { 909 | "ms": "2.0.0" 910 | } 911 | }, 912 | "decode-uri-component": { 913 | "version": "0.2.0", 914 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 915 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", 916 | "dev": true 917 | }, 918 | "deep-equal": { 919 | "version": "1.0.1", 920 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 921 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 922 | }, 923 | "define-properties": { 924 | "version": "1.1.3", 925 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 926 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 927 | "requires": { 928 | "object-keys": "^1.0.12" 929 | } 930 | }, 931 | "define-property": { 932 | "version": "2.0.2", 933 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 934 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 935 | "dev": true, 936 | "requires": { 937 | "is-descriptor": "^1.0.2", 938 | "isobject": "^3.0.1" 939 | }, 940 | "dependencies": { 941 | "is-accessor-descriptor": { 942 | "version": "1.0.0", 943 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 944 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 945 | "dev": true, 946 | "requires": { 947 | "kind-of": "^6.0.0" 948 | } 949 | }, 950 | "is-data-descriptor": { 951 | "version": "1.0.0", 952 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 953 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 954 | "dev": true, 955 | "requires": { 956 | "kind-of": "^6.0.0" 957 | } 958 | }, 959 | "is-descriptor": { 960 | "version": "1.0.2", 961 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 962 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 963 | "dev": true, 964 | "requires": { 965 | "is-accessor-descriptor": "^1.0.0", 966 | "is-data-descriptor": "^1.0.0", 967 | "kind-of": "^6.0.2" 968 | } 969 | } 970 | } 971 | }, 972 | "delayed-stream": { 973 | "version": "1.0.0", 974 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 975 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 976 | }, 977 | "delegates": { 978 | "version": "1.0.0", 979 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 980 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 981 | }, 982 | "denque": { 983 | "version": "1.4.1", 984 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 985 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==", 986 | "dev": true 987 | }, 988 | "depd": { 989 | "version": "1.1.2", 990 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 991 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 992 | }, 993 | "deprecated-decorator": { 994 | "version": "0.1.6", 995 | "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", 996 | "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" 997 | }, 998 | "destroy": { 999 | "version": "1.0.4", 1000 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 1001 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 1002 | }, 1003 | "detect-file": { 1004 | "version": "1.0.0", 1005 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", 1006 | "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", 1007 | "dev": true 1008 | }, 1009 | "dicer": { 1010 | "version": "0.3.0", 1011 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 1012 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 1013 | "requires": { 1014 | "streamsearch": "0.1.2" 1015 | } 1016 | }, 1017 | "dotenv": { 1018 | "version": "8.2.0", 1019 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 1020 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 1021 | }, 1022 | "ee-first": { 1023 | "version": "1.1.1", 1024 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1025 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1026 | }, 1027 | "encodeurl": { 1028 | "version": "1.0.2", 1029 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1030 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1031 | }, 1032 | "error-inject": { 1033 | "version": "1.0.0", 1034 | "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", 1035 | "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" 1036 | }, 1037 | "es-abstract": { 1038 | "version": "1.17.5", 1039 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 1040 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 1041 | "requires": { 1042 | "es-to-primitive": "^1.2.1", 1043 | "function-bind": "^1.1.1", 1044 | "has": "^1.0.3", 1045 | "has-symbols": "^1.0.1", 1046 | "is-callable": "^1.1.5", 1047 | "is-regex": "^1.0.5", 1048 | "object-inspect": "^1.7.0", 1049 | "object-keys": "^1.1.1", 1050 | "object.assign": "^4.1.0", 1051 | "string.prototype.trimleft": "^2.1.1", 1052 | "string.prototype.trimright": "^2.1.1" 1053 | } 1054 | }, 1055 | "es-to-primitive": { 1056 | "version": "1.2.1", 1057 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1058 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1059 | "requires": { 1060 | "is-callable": "^1.1.4", 1061 | "is-date-object": "^1.0.1", 1062 | "is-symbol": "^1.0.2" 1063 | } 1064 | }, 1065 | "escape-html": { 1066 | "version": "1.0.3", 1067 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1068 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1069 | }, 1070 | "esm": { 1071 | "version": "3.2.25", 1072 | "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", 1073 | "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", 1074 | "dev": true 1075 | }, 1076 | "esprima": { 1077 | "version": "4.0.1", 1078 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1079 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1080 | "dev": true 1081 | }, 1082 | "eventemitter3": { 1083 | "version": "3.1.2", 1084 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", 1085 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" 1086 | }, 1087 | "expand-brackets": { 1088 | "version": "2.1.4", 1089 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 1090 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 1091 | "dev": true, 1092 | "requires": { 1093 | "debug": "^2.3.3", 1094 | "define-property": "^0.2.5", 1095 | "extend-shallow": "^2.0.1", 1096 | "posix-character-classes": "^0.1.0", 1097 | "regex-not": "^1.0.0", 1098 | "snapdragon": "^0.8.1", 1099 | "to-regex": "^3.0.1" 1100 | }, 1101 | "dependencies": { 1102 | "debug": { 1103 | "version": "2.6.9", 1104 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1105 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1106 | "dev": true, 1107 | "requires": { 1108 | "ms": "2.0.0" 1109 | } 1110 | }, 1111 | "define-property": { 1112 | "version": "0.2.5", 1113 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1114 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1115 | "dev": true, 1116 | "requires": { 1117 | "is-descriptor": "^0.1.0" 1118 | } 1119 | }, 1120 | "extend-shallow": { 1121 | "version": "2.0.1", 1122 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1123 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1124 | "dev": true, 1125 | "requires": { 1126 | "is-extendable": "^0.1.0" 1127 | } 1128 | } 1129 | } 1130 | }, 1131 | "expand-tilde": { 1132 | "version": "2.0.2", 1133 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", 1134 | "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", 1135 | "dev": true, 1136 | "requires": { 1137 | "homedir-polyfill": "^1.0.1" 1138 | } 1139 | }, 1140 | "extend": { 1141 | "version": "3.0.2", 1142 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1143 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 1144 | "dev": true 1145 | }, 1146 | "extend-shallow": { 1147 | "version": "3.0.2", 1148 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 1149 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 1150 | "dev": true, 1151 | "requires": { 1152 | "assign-symbols": "^1.0.0", 1153 | "is-extendable": "^1.0.1" 1154 | }, 1155 | "dependencies": { 1156 | "is-extendable": { 1157 | "version": "1.0.1", 1158 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1159 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1160 | "dev": true, 1161 | "requires": { 1162 | "is-plain-object": "^2.0.4" 1163 | } 1164 | } 1165 | } 1166 | }, 1167 | "extglob": { 1168 | "version": "2.0.4", 1169 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 1170 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 1171 | "dev": true, 1172 | "requires": { 1173 | "array-unique": "^0.3.2", 1174 | "define-property": "^1.0.0", 1175 | "expand-brackets": "^2.1.4", 1176 | "extend-shallow": "^2.0.1", 1177 | "fragment-cache": "^0.2.1", 1178 | "regex-not": "^1.0.0", 1179 | "snapdragon": "^0.8.1", 1180 | "to-regex": "^3.0.1" 1181 | }, 1182 | "dependencies": { 1183 | "define-property": { 1184 | "version": "1.0.0", 1185 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 1186 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1187 | "dev": true, 1188 | "requires": { 1189 | "is-descriptor": "^1.0.0" 1190 | } 1191 | }, 1192 | "extend-shallow": { 1193 | "version": "2.0.1", 1194 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1195 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1196 | "dev": true, 1197 | "requires": { 1198 | "is-extendable": "^0.1.0" 1199 | } 1200 | }, 1201 | "is-accessor-descriptor": { 1202 | "version": "1.0.0", 1203 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1204 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1205 | "dev": true, 1206 | "requires": { 1207 | "kind-of": "^6.0.0" 1208 | } 1209 | }, 1210 | "is-data-descriptor": { 1211 | "version": "1.0.0", 1212 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1213 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1214 | "dev": true, 1215 | "requires": { 1216 | "kind-of": "^6.0.0" 1217 | } 1218 | }, 1219 | "is-descriptor": { 1220 | "version": "1.0.2", 1221 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1222 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1223 | "dev": true, 1224 | "requires": { 1225 | "is-accessor-descriptor": "^1.0.0", 1226 | "is-data-descriptor": "^1.0.0", 1227 | "kind-of": "^6.0.2" 1228 | } 1229 | } 1230 | } 1231 | }, 1232 | "extract-files": { 1233 | "version": "8.1.0", 1234 | "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-8.1.0.tgz", 1235 | "integrity": "sha512-PTGtfthZK79WUMk+avLmwx3NGdU8+iVFXC2NMGxKsn0MnihOG2lvumj+AZo8CTwTrwjXDgZ5tztbRlEdRjBonQ==" 1236 | }, 1237 | "fast-json-stable-stringify": { 1238 | "version": "2.1.0", 1239 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1240 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1241 | }, 1242 | "fill-range": { 1243 | "version": "4.0.0", 1244 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 1245 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 1246 | "dev": true, 1247 | "requires": { 1248 | "extend-shallow": "^2.0.1", 1249 | "is-number": "^3.0.0", 1250 | "repeat-string": "^1.6.1", 1251 | "to-regex-range": "^2.1.0" 1252 | }, 1253 | "dependencies": { 1254 | "extend-shallow": { 1255 | "version": "2.0.1", 1256 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1257 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1258 | "dev": true, 1259 | "requires": { 1260 | "is-extendable": "^0.1.0" 1261 | } 1262 | } 1263 | } 1264 | }, 1265 | "findup-sync": { 1266 | "version": "3.0.0", 1267 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", 1268 | "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", 1269 | "dev": true, 1270 | "requires": { 1271 | "detect-file": "^1.0.0", 1272 | "is-glob": "^4.0.0", 1273 | "micromatch": "^3.0.4", 1274 | "resolve-dir": "^1.0.1" 1275 | } 1276 | }, 1277 | "fined": { 1278 | "version": "1.2.0", 1279 | "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", 1280 | "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", 1281 | "dev": true, 1282 | "requires": { 1283 | "expand-tilde": "^2.0.2", 1284 | "is-plain-object": "^2.0.3", 1285 | "object.defaults": "^1.1.0", 1286 | "object.pick": "^1.2.0", 1287 | "parse-filepath": "^1.0.1" 1288 | } 1289 | }, 1290 | "flagged-respawn": { 1291 | "version": "1.0.1", 1292 | "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", 1293 | "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", 1294 | "dev": true 1295 | }, 1296 | "for-in": { 1297 | "version": "1.0.2", 1298 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1299 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 1300 | "dev": true 1301 | }, 1302 | "for-own": { 1303 | "version": "1.0.0", 1304 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", 1305 | "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", 1306 | "dev": true, 1307 | "requires": { 1308 | "for-in": "^1.0.1" 1309 | } 1310 | }, 1311 | "form-data": { 1312 | "version": "3.0.0", 1313 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", 1314 | "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", 1315 | "requires": { 1316 | "asynckit": "^0.4.0", 1317 | "combined-stream": "^1.0.8", 1318 | "mime-types": "^2.1.12" 1319 | } 1320 | }, 1321 | "fragment-cache": { 1322 | "version": "0.2.1", 1323 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 1324 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 1325 | "dev": true, 1326 | "requires": { 1327 | "map-cache": "^0.2.2" 1328 | } 1329 | }, 1330 | "fresh": { 1331 | "version": "0.5.2", 1332 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1333 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1334 | }, 1335 | "fs-capacitor": { 1336 | "version": "2.0.4", 1337 | "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", 1338 | "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" 1339 | }, 1340 | "function-bind": { 1341 | "version": "1.1.1", 1342 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1343 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1344 | }, 1345 | "generate-function": { 1346 | "version": "2.3.1", 1347 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 1348 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 1349 | "dev": true, 1350 | "requires": { 1351 | "is-property": "^1.0.2" 1352 | } 1353 | }, 1354 | "get-value": { 1355 | "version": "2.0.6", 1356 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1357 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", 1358 | "dev": true 1359 | }, 1360 | "getopts": { 1361 | "version": "2.2.5", 1362 | "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz", 1363 | "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==", 1364 | "dev": true 1365 | }, 1366 | "global-modules": { 1367 | "version": "1.0.0", 1368 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", 1369 | "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", 1370 | "dev": true, 1371 | "requires": { 1372 | "global-prefix": "^1.0.1", 1373 | "is-windows": "^1.0.1", 1374 | "resolve-dir": "^1.0.0" 1375 | } 1376 | }, 1377 | "global-prefix": { 1378 | "version": "1.0.2", 1379 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", 1380 | "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", 1381 | "dev": true, 1382 | "requires": { 1383 | "expand-tilde": "^2.0.2", 1384 | "homedir-polyfill": "^1.0.1", 1385 | "ini": "^1.3.4", 1386 | "is-windows": "^1.0.1", 1387 | "which": "^1.2.14" 1388 | } 1389 | }, 1390 | "graphql": { 1391 | "version": "14.6.0", 1392 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.6.0.tgz", 1393 | "integrity": "sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==", 1394 | "requires": { 1395 | "iterall": "^1.2.2" 1396 | } 1397 | }, 1398 | "graphql-extensions": { 1399 | "version": "0.12.0", 1400 | "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.0.tgz", 1401 | "integrity": "sha512-kBRLtNeknrFl0W/UQQYebj6qnvb1E1RpQ2+C7Y8pwMc6yV8+9pWFx5RP0HzfeEuScCmK93i3H5sdPedoQWwENw==", 1402 | "requires": { 1403 | "@apollographql/apollo-tools": "^0.4.3", 1404 | "apollo-server-env": "^2.4.3", 1405 | "apollo-server-types": "^0.4.0" 1406 | } 1407 | }, 1408 | "graphql-subscriptions": { 1409 | "version": "1.1.0", 1410 | "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz", 1411 | "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==", 1412 | "requires": { 1413 | "iterall": "^1.2.1" 1414 | } 1415 | }, 1416 | "graphql-tag": { 1417 | "version": "2.10.3", 1418 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.3.tgz", 1419 | "integrity": "sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA==" 1420 | }, 1421 | "graphql-tools": { 1422 | "version": "5.0.0", 1423 | "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-5.0.0.tgz", 1424 | "integrity": "sha512-5zn3vtn//382b7G3Wzz3d5q/sh+f7tVrnxeuhTMTJ7pWJijNqLxH7VEzv8VwXCq19zAzHYEosFHfXiK7qzvk7w==", 1425 | "requires": { 1426 | "apollo-link": "^1.2.14", 1427 | "apollo-upload-client": "^13.0.0", 1428 | "deprecated-decorator": "^0.1.6", 1429 | "form-data": "^3.0.0", 1430 | "iterall": "^1.3.0", 1431 | "node-fetch": "^2.6.0", 1432 | "tslib": "^1.11.1", 1433 | "uuid": "^7.0.3" 1434 | }, 1435 | "dependencies": { 1436 | "uuid": { 1437 | "version": "7.0.3", 1438 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", 1439 | "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==" 1440 | } 1441 | } 1442 | }, 1443 | "graphql-upload": { 1444 | "version": "8.1.0", 1445 | "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz", 1446 | "integrity": "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==", 1447 | "requires": { 1448 | "busboy": "^0.3.1", 1449 | "fs-capacitor": "^2.0.4", 1450 | "http-errors": "^1.7.3", 1451 | "object-path": "^0.11.4" 1452 | } 1453 | }, 1454 | "has": { 1455 | "version": "1.0.3", 1456 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1457 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1458 | "requires": { 1459 | "function-bind": "^1.1.1" 1460 | } 1461 | }, 1462 | "has-symbols": { 1463 | "version": "1.0.1", 1464 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1465 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 1466 | }, 1467 | "has-value": { 1468 | "version": "1.0.0", 1469 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1470 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1471 | "dev": true, 1472 | "requires": { 1473 | "get-value": "^2.0.6", 1474 | "has-values": "^1.0.0", 1475 | "isobject": "^3.0.0" 1476 | } 1477 | }, 1478 | "has-values": { 1479 | "version": "1.0.0", 1480 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1481 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1482 | "dev": true, 1483 | "requires": { 1484 | "is-number": "^3.0.0", 1485 | "kind-of": "^4.0.0" 1486 | }, 1487 | "dependencies": { 1488 | "kind-of": { 1489 | "version": "4.0.0", 1490 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1491 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1492 | "dev": true, 1493 | "requires": { 1494 | "is-buffer": "^1.1.5" 1495 | } 1496 | } 1497 | } 1498 | }, 1499 | "homedir-polyfill": { 1500 | "version": "1.0.3", 1501 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 1502 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 1503 | "dev": true, 1504 | "requires": { 1505 | "parse-passwd": "^1.0.0" 1506 | } 1507 | }, 1508 | "http-assert": { 1509 | "version": "1.4.1", 1510 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", 1511 | "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", 1512 | "requires": { 1513 | "deep-equal": "~1.0.1", 1514 | "http-errors": "~1.7.2" 1515 | } 1516 | }, 1517 | "http-errors": { 1518 | "version": "1.7.3", 1519 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 1520 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 1521 | "requires": { 1522 | "depd": "~1.1.2", 1523 | "inherits": "2.0.4", 1524 | "setprototypeof": "1.1.1", 1525 | "statuses": ">= 1.5.0 < 2", 1526 | "toidentifier": "1.0.0" 1527 | } 1528 | }, 1529 | "iconv-lite": { 1530 | "version": "0.4.24", 1531 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1532 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1533 | "requires": { 1534 | "safer-buffer": ">= 2.1.2 < 3" 1535 | } 1536 | }, 1537 | "inflation": { 1538 | "version": "2.0.0", 1539 | "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", 1540 | "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" 1541 | }, 1542 | "inherits": { 1543 | "version": "2.0.4", 1544 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1545 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1546 | }, 1547 | "ini": { 1548 | "version": "1.3.5", 1549 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1550 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1551 | "dev": true 1552 | }, 1553 | "interpret": { 1554 | "version": "2.0.0", 1555 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.0.0.tgz", 1556 | "integrity": "sha512-e0/LknJ8wpMMhTiWcjivB+ESwIuvHnBSlBbmP/pSb8CQJldoj1p2qv7xGZ/+BtbTziYRFSz8OsvdbiX45LtYQA==", 1557 | "dev": true 1558 | }, 1559 | "is-absolute": { 1560 | "version": "1.0.0", 1561 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 1562 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 1563 | "dev": true, 1564 | "requires": { 1565 | "is-relative": "^1.0.0", 1566 | "is-windows": "^1.0.1" 1567 | } 1568 | }, 1569 | "is-accessor-descriptor": { 1570 | "version": "0.1.6", 1571 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1572 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1573 | "dev": true, 1574 | "requires": { 1575 | "kind-of": "^3.0.2" 1576 | }, 1577 | "dependencies": { 1578 | "kind-of": { 1579 | "version": "3.2.2", 1580 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1581 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1582 | "dev": true, 1583 | "requires": { 1584 | "is-buffer": "^1.1.5" 1585 | } 1586 | } 1587 | } 1588 | }, 1589 | "is-buffer": { 1590 | "version": "1.1.6", 1591 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1592 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1593 | "dev": true 1594 | }, 1595 | "is-callable": { 1596 | "version": "1.1.5", 1597 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1598 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" 1599 | }, 1600 | "is-data-descriptor": { 1601 | "version": "0.1.4", 1602 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1603 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1604 | "dev": true, 1605 | "requires": { 1606 | "kind-of": "^3.0.2" 1607 | }, 1608 | "dependencies": { 1609 | "kind-of": { 1610 | "version": "3.2.2", 1611 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1612 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1613 | "dev": true, 1614 | "requires": { 1615 | "is-buffer": "^1.1.5" 1616 | } 1617 | } 1618 | } 1619 | }, 1620 | "is-date-object": { 1621 | "version": "1.0.2", 1622 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1623 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 1624 | }, 1625 | "is-descriptor": { 1626 | "version": "0.1.6", 1627 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1628 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1629 | "dev": true, 1630 | "requires": { 1631 | "is-accessor-descriptor": "^0.1.6", 1632 | "is-data-descriptor": "^0.1.4", 1633 | "kind-of": "^5.0.0" 1634 | }, 1635 | "dependencies": { 1636 | "kind-of": { 1637 | "version": "5.1.0", 1638 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1639 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", 1640 | "dev": true 1641 | } 1642 | } 1643 | }, 1644 | "is-extendable": { 1645 | "version": "0.1.1", 1646 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1647 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 1648 | "dev": true 1649 | }, 1650 | "is-extglob": { 1651 | "version": "2.1.1", 1652 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1653 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1654 | "dev": true 1655 | }, 1656 | "is-generator-function": { 1657 | "version": "1.0.7", 1658 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", 1659 | "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" 1660 | }, 1661 | "is-glob": { 1662 | "version": "4.0.1", 1663 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1664 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1665 | "dev": true, 1666 | "requires": { 1667 | "is-extglob": "^2.1.1" 1668 | } 1669 | }, 1670 | "is-number": { 1671 | "version": "3.0.0", 1672 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1673 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1674 | "dev": true, 1675 | "requires": { 1676 | "kind-of": "^3.0.2" 1677 | }, 1678 | "dependencies": { 1679 | "kind-of": { 1680 | "version": "3.2.2", 1681 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1682 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1683 | "dev": true, 1684 | "requires": { 1685 | "is-buffer": "^1.1.5" 1686 | } 1687 | } 1688 | } 1689 | }, 1690 | "is-plain-object": { 1691 | "version": "2.0.4", 1692 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1693 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1694 | "dev": true, 1695 | "requires": { 1696 | "isobject": "^3.0.1" 1697 | } 1698 | }, 1699 | "is-property": { 1700 | "version": "1.0.2", 1701 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1702 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 1703 | "dev": true 1704 | }, 1705 | "is-regex": { 1706 | "version": "1.0.5", 1707 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1708 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1709 | "requires": { 1710 | "has": "^1.0.3" 1711 | } 1712 | }, 1713 | "is-relative": { 1714 | "version": "1.0.0", 1715 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1716 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1717 | "dev": true, 1718 | "requires": { 1719 | "is-unc-path": "^1.0.0" 1720 | } 1721 | }, 1722 | "is-symbol": { 1723 | "version": "1.0.3", 1724 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1725 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1726 | "requires": { 1727 | "has-symbols": "^1.0.1" 1728 | } 1729 | }, 1730 | "is-unc-path": { 1731 | "version": "1.0.0", 1732 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1733 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1734 | "dev": true, 1735 | "requires": { 1736 | "unc-path-regex": "^0.1.2" 1737 | } 1738 | }, 1739 | "is-windows": { 1740 | "version": "1.0.2", 1741 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1742 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 1743 | "dev": true 1744 | }, 1745 | "isarray": { 1746 | "version": "0.0.1", 1747 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1748 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 1749 | }, 1750 | "isexe": { 1751 | "version": "2.0.0", 1752 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1753 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1754 | "dev": true 1755 | }, 1756 | "isobject": { 1757 | "version": "3.0.1", 1758 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1759 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 1760 | "dev": true 1761 | }, 1762 | "iterall": { 1763 | "version": "1.3.0", 1764 | "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", 1765 | "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" 1766 | }, 1767 | "keygrip": { 1768 | "version": "1.1.0", 1769 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", 1770 | "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", 1771 | "requires": { 1772 | "tsscmp": "1.0.6" 1773 | } 1774 | }, 1775 | "kind-of": { 1776 | "version": "6.0.3", 1777 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1778 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1779 | "dev": true 1780 | }, 1781 | "knex": { 1782 | "version": "0.21.1", 1783 | "resolved": "https://registry.npmjs.org/knex/-/knex-0.21.1.tgz", 1784 | "integrity": "sha512-uWszXC2DPaLn/YznGT9wFTWUG9+kqbL4DMz+hCH789GLcLuYzq8werHPDKBJxtKvxrW/S1XIXgrTWdMypiVvsw==", 1785 | "dev": true, 1786 | "requires": { 1787 | "colorette": "1.1.0", 1788 | "commander": "^5.1.0", 1789 | "debug": "4.1.1", 1790 | "esm": "^3.2.25", 1791 | "getopts": "2.2.5", 1792 | "inherits": "~2.0.4", 1793 | "interpret": "^2.0.0", 1794 | "liftoff": "3.1.0", 1795 | "lodash": "^4.17.15", 1796 | "mkdirp": "^1.0.4", 1797 | "pg-connection-string": "2.2.0", 1798 | "tarn": "^3.0.0", 1799 | "tildify": "2.0.0", 1800 | "uuid": "^7.0.3", 1801 | "v8flags": "^3.1.3" 1802 | }, 1803 | "dependencies": { 1804 | "debug": { 1805 | "version": "4.1.1", 1806 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1807 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1808 | "dev": true, 1809 | "requires": { 1810 | "ms": "^2.1.1" 1811 | } 1812 | }, 1813 | "ms": { 1814 | "version": "2.1.2", 1815 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1816 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1817 | "dev": true 1818 | }, 1819 | "uuid": { 1820 | "version": "7.0.3", 1821 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", 1822 | "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", 1823 | "dev": true 1824 | } 1825 | } 1826 | }, 1827 | "koa": { 1828 | "version": "2.11.0", 1829 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.11.0.tgz", 1830 | "integrity": "sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==", 1831 | "requires": { 1832 | "accepts": "^1.3.5", 1833 | "cache-content-type": "^1.0.0", 1834 | "content-disposition": "~0.5.2", 1835 | "content-type": "^1.0.4", 1836 | "cookies": "~0.8.0", 1837 | "debug": "~3.1.0", 1838 | "delegates": "^1.0.0", 1839 | "depd": "^1.1.2", 1840 | "destroy": "^1.0.4", 1841 | "encodeurl": "^1.0.2", 1842 | "error-inject": "^1.0.0", 1843 | "escape-html": "^1.0.3", 1844 | "fresh": "~0.5.2", 1845 | "http-assert": "^1.3.0", 1846 | "http-errors": "^1.6.3", 1847 | "is-generator-function": "^1.0.7", 1848 | "koa-compose": "^4.1.0", 1849 | "koa-convert": "^1.2.0", 1850 | "on-finished": "^2.3.0", 1851 | "only": "~0.0.2", 1852 | "parseurl": "^1.3.2", 1853 | "statuses": "^1.5.0", 1854 | "type-is": "^1.6.16", 1855 | "vary": "^1.1.2" 1856 | } 1857 | }, 1858 | "koa-bodyparser": { 1859 | "version": "4.3.0", 1860 | "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", 1861 | "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", 1862 | "requires": { 1863 | "co-body": "^6.0.0", 1864 | "copy-to": "^2.0.1" 1865 | } 1866 | }, 1867 | "koa-compose": { 1868 | "version": "4.1.0", 1869 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 1870 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 1871 | }, 1872 | "koa-convert": { 1873 | "version": "1.2.0", 1874 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", 1875 | "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", 1876 | "requires": { 1877 | "co": "^4.6.0", 1878 | "koa-compose": "^3.0.0" 1879 | }, 1880 | "dependencies": { 1881 | "koa-compose": { 1882 | "version": "3.2.1", 1883 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", 1884 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", 1885 | "requires": { 1886 | "any-promise": "^1.1.0" 1887 | } 1888 | } 1889 | } 1890 | }, 1891 | "koa-router": { 1892 | "version": "7.4.0", 1893 | "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", 1894 | "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==", 1895 | "requires": { 1896 | "debug": "^3.1.0", 1897 | "http-errors": "^1.3.1", 1898 | "koa-compose": "^3.0.0", 1899 | "methods": "^1.0.1", 1900 | "path-to-regexp": "^1.1.1", 1901 | "urijs": "^1.19.0" 1902 | }, 1903 | "dependencies": { 1904 | "koa-compose": { 1905 | "version": "3.2.1", 1906 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", 1907 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", 1908 | "requires": { 1909 | "any-promise": "^1.1.0" 1910 | } 1911 | } 1912 | } 1913 | }, 1914 | "liftoff": { 1915 | "version": "3.1.0", 1916 | "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", 1917 | "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", 1918 | "dev": true, 1919 | "requires": { 1920 | "extend": "^3.0.0", 1921 | "findup-sync": "^3.0.0", 1922 | "fined": "^1.0.1", 1923 | "flagged-respawn": "^1.0.0", 1924 | "is-plain-object": "^2.0.4", 1925 | "object.map": "^1.0.0", 1926 | "rechoir": "^0.6.2", 1927 | "resolve": "^1.1.7" 1928 | } 1929 | }, 1930 | "lodash": { 1931 | "version": "4.17.15", 1932 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1933 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1934 | "dev": true 1935 | }, 1936 | "lodash.sortby": { 1937 | "version": "4.7.0", 1938 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1939 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1940 | }, 1941 | "loglevel": { 1942 | "version": "1.6.8", 1943 | "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", 1944 | "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" 1945 | }, 1946 | "long": { 1947 | "version": "4.0.0", 1948 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1949 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1950 | }, 1951 | "lru-cache": { 1952 | "version": "5.1.1", 1953 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1954 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1955 | "requires": { 1956 | "yallist": "^3.0.2" 1957 | } 1958 | }, 1959 | "make-iterator": { 1960 | "version": "1.0.1", 1961 | "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", 1962 | "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", 1963 | "dev": true, 1964 | "requires": { 1965 | "kind-of": "^6.0.2" 1966 | } 1967 | }, 1968 | "map-cache": { 1969 | "version": "0.2.2", 1970 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1971 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 1972 | "dev": true 1973 | }, 1974 | "map-visit": { 1975 | "version": "1.0.0", 1976 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 1977 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 1978 | "dev": true, 1979 | "requires": { 1980 | "object-visit": "^1.0.0" 1981 | } 1982 | }, 1983 | "media-typer": { 1984 | "version": "0.3.0", 1985 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1986 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1987 | }, 1988 | "methods": { 1989 | "version": "1.1.2", 1990 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1991 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1992 | }, 1993 | "micromatch": { 1994 | "version": "3.1.10", 1995 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 1996 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 1997 | "dev": true, 1998 | "requires": { 1999 | "arr-diff": "^4.0.0", 2000 | "array-unique": "^0.3.2", 2001 | "braces": "^2.3.1", 2002 | "define-property": "^2.0.2", 2003 | "extend-shallow": "^3.0.2", 2004 | "extglob": "^2.0.4", 2005 | "fragment-cache": "^0.2.1", 2006 | "kind-of": "^6.0.2", 2007 | "nanomatch": "^1.2.9", 2008 | "object.pick": "^1.3.0", 2009 | "regex-not": "^1.0.0", 2010 | "snapdragon": "^0.8.1", 2011 | "to-regex": "^3.0.2" 2012 | } 2013 | }, 2014 | "mime-db": { 2015 | "version": "1.44.0", 2016 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 2017 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 2018 | }, 2019 | "mime-types": { 2020 | "version": "2.1.27", 2021 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 2022 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 2023 | "requires": { 2024 | "mime-db": "1.44.0" 2025 | } 2026 | }, 2027 | "mixin-deep": { 2028 | "version": "1.3.2", 2029 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", 2030 | "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", 2031 | "dev": true, 2032 | "requires": { 2033 | "for-in": "^1.0.2", 2034 | "is-extendable": "^1.0.1" 2035 | }, 2036 | "dependencies": { 2037 | "is-extendable": { 2038 | "version": "1.0.1", 2039 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 2040 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 2041 | "dev": true, 2042 | "requires": { 2043 | "is-plain-object": "^2.0.4" 2044 | } 2045 | } 2046 | } 2047 | }, 2048 | "mkdirp": { 2049 | "version": "1.0.4", 2050 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2051 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 2052 | "dev": true 2053 | }, 2054 | "moment": { 2055 | "version": "2.25.3", 2056 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz", 2057 | "integrity": "sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg==" 2058 | }, 2059 | "ms": { 2060 | "version": "2.0.0", 2061 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2062 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2063 | }, 2064 | "mysql2": { 2065 | "version": "2.1.0", 2066 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.1.0.tgz", 2067 | "integrity": "sha512-9kGVyi930rG2KaHrz3sHwtc6K+GY9d8wWk1XRSYxQiunvGcn4DwuZxOwmK11ftuhhwrYDwGx9Ta4VBwznJn36A==", 2068 | "dev": true, 2069 | "requires": { 2070 | "cardinal": "^2.1.1", 2071 | "denque": "^1.4.1", 2072 | "generate-function": "^2.3.1", 2073 | "iconv-lite": "^0.5.0", 2074 | "long": "^4.0.0", 2075 | "lru-cache": "^5.1.1", 2076 | "named-placeholders": "^1.1.2", 2077 | "seq-queue": "^0.0.5", 2078 | "sqlstring": "^2.3.1" 2079 | }, 2080 | "dependencies": { 2081 | "iconv-lite": { 2082 | "version": "0.5.1", 2083 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", 2084 | "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", 2085 | "dev": true, 2086 | "requires": { 2087 | "safer-buffer": ">= 2.1.2 < 3" 2088 | } 2089 | } 2090 | } 2091 | }, 2092 | "named-placeholders": { 2093 | "version": "1.1.2", 2094 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", 2095 | "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", 2096 | "dev": true, 2097 | "requires": { 2098 | "lru-cache": "^4.1.3" 2099 | }, 2100 | "dependencies": { 2101 | "lru-cache": { 2102 | "version": "4.1.5", 2103 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 2104 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 2105 | "dev": true, 2106 | "requires": { 2107 | "pseudomap": "^1.0.2", 2108 | "yallist": "^2.1.2" 2109 | } 2110 | }, 2111 | "yallist": { 2112 | "version": "2.1.2", 2113 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2114 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 2115 | "dev": true 2116 | } 2117 | } 2118 | }, 2119 | "nanomatch": { 2120 | "version": "1.2.13", 2121 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 2122 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 2123 | "dev": true, 2124 | "requires": { 2125 | "arr-diff": "^4.0.0", 2126 | "array-unique": "^0.3.2", 2127 | "define-property": "^2.0.2", 2128 | "extend-shallow": "^3.0.2", 2129 | "fragment-cache": "^0.2.1", 2130 | "is-windows": "^1.0.2", 2131 | "kind-of": "^6.0.2", 2132 | "object.pick": "^1.3.0", 2133 | "regex-not": "^1.0.0", 2134 | "snapdragon": "^0.8.1", 2135 | "to-regex": "^3.0.1" 2136 | } 2137 | }, 2138 | "negotiator": { 2139 | "version": "0.6.2", 2140 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 2141 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 2142 | }, 2143 | "node-fetch": { 2144 | "version": "2.6.0", 2145 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 2146 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 2147 | }, 2148 | "object-copy": { 2149 | "version": "0.1.0", 2150 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 2151 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 2152 | "dev": true, 2153 | "requires": { 2154 | "copy-descriptor": "^0.1.0", 2155 | "define-property": "^0.2.5", 2156 | "kind-of": "^3.0.3" 2157 | }, 2158 | "dependencies": { 2159 | "define-property": { 2160 | "version": "0.2.5", 2161 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2162 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2163 | "dev": true, 2164 | "requires": { 2165 | "is-descriptor": "^0.1.0" 2166 | } 2167 | }, 2168 | "kind-of": { 2169 | "version": "3.2.2", 2170 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2171 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2172 | "dev": true, 2173 | "requires": { 2174 | "is-buffer": "^1.1.5" 2175 | } 2176 | } 2177 | } 2178 | }, 2179 | "object-inspect": { 2180 | "version": "1.7.0", 2181 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 2182 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" 2183 | }, 2184 | "object-keys": { 2185 | "version": "1.1.1", 2186 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2187 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 2188 | }, 2189 | "object-path": { 2190 | "version": "0.11.4", 2191 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", 2192 | "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" 2193 | }, 2194 | "object-visit": { 2195 | "version": "1.0.1", 2196 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 2197 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 2198 | "dev": true, 2199 | "requires": { 2200 | "isobject": "^3.0.0" 2201 | } 2202 | }, 2203 | "object.assign": { 2204 | "version": "4.1.0", 2205 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 2206 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 2207 | "requires": { 2208 | "define-properties": "^1.1.2", 2209 | "function-bind": "^1.1.1", 2210 | "has-symbols": "^1.0.0", 2211 | "object-keys": "^1.0.11" 2212 | } 2213 | }, 2214 | "object.defaults": { 2215 | "version": "1.1.0", 2216 | "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", 2217 | "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", 2218 | "dev": true, 2219 | "requires": { 2220 | "array-each": "^1.0.1", 2221 | "array-slice": "^1.0.0", 2222 | "for-own": "^1.0.0", 2223 | "isobject": "^3.0.0" 2224 | } 2225 | }, 2226 | "object.getownpropertydescriptors": { 2227 | "version": "2.1.0", 2228 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 2229 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 2230 | "requires": { 2231 | "define-properties": "^1.1.3", 2232 | "es-abstract": "^1.17.0-next.1" 2233 | } 2234 | }, 2235 | "object.map": { 2236 | "version": "1.0.1", 2237 | "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", 2238 | "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", 2239 | "dev": true, 2240 | "requires": { 2241 | "for-own": "^1.0.0", 2242 | "make-iterator": "^1.0.0" 2243 | } 2244 | }, 2245 | "object.pick": { 2246 | "version": "1.3.0", 2247 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 2248 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 2249 | "dev": true, 2250 | "requires": { 2251 | "isobject": "^3.0.1" 2252 | } 2253 | }, 2254 | "on-finished": { 2255 | "version": "2.3.0", 2256 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2257 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2258 | "requires": { 2259 | "ee-first": "1.1.1" 2260 | } 2261 | }, 2262 | "only": { 2263 | "version": "0.0.2", 2264 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", 2265 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" 2266 | }, 2267 | "parse-filepath": { 2268 | "version": "1.0.2", 2269 | "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", 2270 | "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", 2271 | "dev": true, 2272 | "requires": { 2273 | "is-absolute": "^1.0.0", 2274 | "map-cache": "^0.2.0", 2275 | "path-root": "^0.1.1" 2276 | } 2277 | }, 2278 | "parse-passwd": { 2279 | "version": "1.0.0", 2280 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 2281 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 2282 | "dev": true 2283 | }, 2284 | "parseurl": { 2285 | "version": "1.3.3", 2286 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2287 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2288 | }, 2289 | "pascalcase": { 2290 | "version": "0.1.1", 2291 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 2292 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", 2293 | "dev": true 2294 | }, 2295 | "path-parse": { 2296 | "version": "1.0.6", 2297 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 2298 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 2299 | "dev": true 2300 | }, 2301 | "path-root": { 2302 | "version": "0.1.1", 2303 | "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", 2304 | "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", 2305 | "dev": true, 2306 | "requires": { 2307 | "path-root-regex": "^0.1.0" 2308 | } 2309 | }, 2310 | "path-root-regex": { 2311 | "version": "0.1.2", 2312 | "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", 2313 | "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", 2314 | "dev": true 2315 | }, 2316 | "path-to-regexp": { 2317 | "version": "1.8.0", 2318 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 2319 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 2320 | "requires": { 2321 | "isarray": "0.0.1" 2322 | } 2323 | }, 2324 | "pg-connection-string": { 2325 | "version": "2.2.0", 2326 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.2.0.tgz", 2327 | "integrity": "sha512-xB/+wxcpFipUZOQcSzcgkjcNOosGhEoPSjz06jC89lv1dj7mc9bZv6wLVy8M2fVjP0a/xN0N988YDq1L0FhK3A==", 2328 | "dev": true 2329 | }, 2330 | "posix-character-classes": { 2331 | "version": "0.1.1", 2332 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 2333 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", 2334 | "dev": true 2335 | }, 2336 | "pseudomap": { 2337 | "version": "1.0.2", 2338 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2339 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 2340 | "dev": true 2341 | }, 2342 | "qs": { 2343 | "version": "6.9.4", 2344 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", 2345 | "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" 2346 | }, 2347 | "raw-body": { 2348 | "version": "2.4.1", 2349 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", 2350 | "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", 2351 | "requires": { 2352 | "bytes": "3.1.0", 2353 | "http-errors": "1.7.3", 2354 | "iconv-lite": "0.4.24", 2355 | "unpipe": "1.0.0" 2356 | } 2357 | }, 2358 | "rechoir": { 2359 | "version": "0.6.2", 2360 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 2361 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 2362 | "dev": true, 2363 | "requires": { 2364 | "resolve": "^1.1.6" 2365 | } 2366 | }, 2367 | "redeyed": { 2368 | "version": "2.1.1", 2369 | "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", 2370 | "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", 2371 | "dev": true, 2372 | "requires": { 2373 | "esprima": "~4.0.0" 2374 | } 2375 | }, 2376 | "regenerator-runtime": { 2377 | "version": "0.13.5", 2378 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", 2379 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" 2380 | }, 2381 | "regex-not": { 2382 | "version": "1.0.2", 2383 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 2384 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 2385 | "dev": true, 2386 | "requires": { 2387 | "extend-shallow": "^3.0.2", 2388 | "safe-regex": "^1.1.0" 2389 | } 2390 | }, 2391 | "repeat-element": { 2392 | "version": "1.1.3", 2393 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 2394 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", 2395 | "dev": true 2396 | }, 2397 | "repeat-string": { 2398 | "version": "1.6.1", 2399 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2400 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 2401 | "dev": true 2402 | }, 2403 | "resolve": { 2404 | "version": "1.17.0", 2405 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 2406 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 2407 | "dev": true, 2408 | "requires": { 2409 | "path-parse": "^1.0.6" 2410 | } 2411 | }, 2412 | "resolve-dir": { 2413 | "version": "1.0.1", 2414 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", 2415 | "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", 2416 | "dev": true, 2417 | "requires": { 2418 | "expand-tilde": "^2.0.0", 2419 | "global-modules": "^1.0.0" 2420 | } 2421 | }, 2422 | "resolve-url": { 2423 | "version": "0.2.1", 2424 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2425 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 2426 | "dev": true 2427 | }, 2428 | "ret": { 2429 | "version": "0.1.15", 2430 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2431 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", 2432 | "dev": true 2433 | }, 2434 | "retry": { 2435 | "version": "0.12.0", 2436 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 2437 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" 2438 | }, 2439 | "safe-buffer": { 2440 | "version": "5.2.0", 2441 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 2442 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 2443 | }, 2444 | "safe-regex": { 2445 | "version": "1.1.0", 2446 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2447 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2448 | "dev": true, 2449 | "requires": { 2450 | "ret": "~0.1.10" 2451 | } 2452 | }, 2453 | "safer-buffer": { 2454 | "version": "2.1.2", 2455 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2456 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2457 | }, 2458 | "seq-queue": { 2459 | "version": "0.0.5", 2460 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", 2461 | "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=", 2462 | "dev": true 2463 | }, 2464 | "set-value": { 2465 | "version": "2.0.1", 2466 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", 2467 | "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", 2468 | "dev": true, 2469 | "requires": { 2470 | "extend-shallow": "^2.0.1", 2471 | "is-extendable": "^0.1.1", 2472 | "is-plain-object": "^2.0.3", 2473 | "split-string": "^3.0.1" 2474 | }, 2475 | "dependencies": { 2476 | "extend-shallow": { 2477 | "version": "2.0.1", 2478 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2479 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2480 | "dev": true, 2481 | "requires": { 2482 | "is-extendable": "^0.1.0" 2483 | } 2484 | } 2485 | } 2486 | }, 2487 | "setprototypeof": { 2488 | "version": "1.1.1", 2489 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 2490 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 2491 | }, 2492 | "sha.js": { 2493 | "version": "2.4.11", 2494 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 2495 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 2496 | "requires": { 2497 | "inherits": "^2.0.1", 2498 | "safe-buffer": "^5.0.1" 2499 | } 2500 | }, 2501 | "snapdragon": { 2502 | "version": "0.8.2", 2503 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 2504 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 2505 | "dev": true, 2506 | "requires": { 2507 | "base": "^0.11.1", 2508 | "debug": "^2.2.0", 2509 | "define-property": "^0.2.5", 2510 | "extend-shallow": "^2.0.1", 2511 | "map-cache": "^0.2.2", 2512 | "source-map": "^0.5.6", 2513 | "source-map-resolve": "^0.5.0", 2514 | "use": "^3.1.0" 2515 | }, 2516 | "dependencies": { 2517 | "debug": { 2518 | "version": "2.6.9", 2519 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2520 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2521 | "dev": true, 2522 | "requires": { 2523 | "ms": "2.0.0" 2524 | } 2525 | }, 2526 | "define-property": { 2527 | "version": "0.2.5", 2528 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2529 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2530 | "dev": true, 2531 | "requires": { 2532 | "is-descriptor": "^0.1.0" 2533 | } 2534 | }, 2535 | "extend-shallow": { 2536 | "version": "2.0.1", 2537 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2538 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2539 | "dev": true, 2540 | "requires": { 2541 | "is-extendable": "^0.1.0" 2542 | } 2543 | } 2544 | } 2545 | }, 2546 | "snapdragon-node": { 2547 | "version": "2.1.1", 2548 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 2549 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 2550 | "dev": true, 2551 | "requires": { 2552 | "define-property": "^1.0.0", 2553 | "isobject": "^3.0.0", 2554 | "snapdragon-util": "^3.0.1" 2555 | }, 2556 | "dependencies": { 2557 | "define-property": { 2558 | "version": "1.0.0", 2559 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 2560 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 2561 | "dev": true, 2562 | "requires": { 2563 | "is-descriptor": "^1.0.0" 2564 | } 2565 | }, 2566 | "is-accessor-descriptor": { 2567 | "version": "1.0.0", 2568 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2569 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 2570 | "dev": true, 2571 | "requires": { 2572 | "kind-of": "^6.0.0" 2573 | } 2574 | }, 2575 | "is-data-descriptor": { 2576 | "version": "1.0.0", 2577 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 2578 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 2579 | "dev": true, 2580 | "requires": { 2581 | "kind-of": "^6.0.0" 2582 | } 2583 | }, 2584 | "is-descriptor": { 2585 | "version": "1.0.2", 2586 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 2587 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 2588 | "dev": true, 2589 | "requires": { 2590 | "is-accessor-descriptor": "^1.0.0", 2591 | "is-data-descriptor": "^1.0.0", 2592 | "kind-of": "^6.0.2" 2593 | } 2594 | } 2595 | } 2596 | }, 2597 | "snapdragon-util": { 2598 | "version": "3.0.1", 2599 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 2600 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 2601 | "dev": true, 2602 | "requires": { 2603 | "kind-of": "^3.2.0" 2604 | }, 2605 | "dependencies": { 2606 | "kind-of": { 2607 | "version": "3.2.2", 2608 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2609 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2610 | "dev": true, 2611 | "requires": { 2612 | "is-buffer": "^1.1.5" 2613 | } 2614 | } 2615 | } 2616 | }, 2617 | "source-map": { 2618 | "version": "0.5.7", 2619 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2620 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2621 | "dev": true 2622 | }, 2623 | "source-map-resolve": { 2624 | "version": "0.5.3", 2625 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", 2626 | "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", 2627 | "dev": true, 2628 | "requires": { 2629 | "atob": "^2.1.2", 2630 | "decode-uri-component": "^0.2.0", 2631 | "resolve-url": "^0.2.1", 2632 | "source-map-url": "^0.4.0", 2633 | "urix": "^0.1.0" 2634 | } 2635 | }, 2636 | "source-map-url": { 2637 | "version": "0.4.0", 2638 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 2639 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", 2640 | "dev": true 2641 | }, 2642 | "split-string": { 2643 | "version": "3.1.0", 2644 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 2645 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 2646 | "dev": true, 2647 | "requires": { 2648 | "extend-shallow": "^3.0.0" 2649 | } 2650 | }, 2651 | "sqlstring": { 2652 | "version": "2.3.2", 2653 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", 2654 | "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", 2655 | "dev": true 2656 | }, 2657 | "static-extend": { 2658 | "version": "0.1.2", 2659 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 2660 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 2661 | "dev": true, 2662 | "requires": { 2663 | "define-property": "^0.2.5", 2664 | "object-copy": "^0.1.0" 2665 | }, 2666 | "dependencies": { 2667 | "define-property": { 2668 | "version": "0.2.5", 2669 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2670 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2671 | "dev": true, 2672 | "requires": { 2673 | "is-descriptor": "^0.1.0" 2674 | } 2675 | } 2676 | } 2677 | }, 2678 | "statuses": { 2679 | "version": "1.5.0", 2680 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2681 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2682 | }, 2683 | "streamsearch": { 2684 | "version": "0.1.2", 2685 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 2686 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 2687 | }, 2688 | "string.prototype.trimend": { 2689 | "version": "1.0.1", 2690 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 2691 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 2692 | "requires": { 2693 | "define-properties": "^1.1.3", 2694 | "es-abstract": "^1.17.5" 2695 | } 2696 | }, 2697 | "string.prototype.trimleft": { 2698 | "version": "2.1.2", 2699 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 2700 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 2701 | "requires": { 2702 | "define-properties": "^1.1.3", 2703 | "es-abstract": "^1.17.5", 2704 | "string.prototype.trimstart": "^1.0.0" 2705 | } 2706 | }, 2707 | "string.prototype.trimright": { 2708 | "version": "2.1.2", 2709 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 2710 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 2711 | "requires": { 2712 | "define-properties": "^1.1.3", 2713 | "es-abstract": "^1.17.5", 2714 | "string.prototype.trimend": "^1.0.0" 2715 | } 2716 | }, 2717 | "string.prototype.trimstart": { 2718 | "version": "1.0.1", 2719 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 2720 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 2721 | "requires": { 2722 | "define-properties": "^1.1.3", 2723 | "es-abstract": "^1.17.5" 2724 | } 2725 | }, 2726 | "subscriptions-transport-ws": { 2727 | "version": "0.9.16", 2728 | "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.16.tgz", 2729 | "integrity": "sha512-pQdoU7nC+EpStXnCfh/+ho0zE0Z+ma+i7xvj7bkXKb1dvYHSZxgRPaU6spRP+Bjzow67c/rRDoix5RT0uU9omw==", 2730 | "requires": { 2731 | "backo2": "^1.0.2", 2732 | "eventemitter3": "^3.1.0", 2733 | "iterall": "^1.2.1", 2734 | "symbol-observable": "^1.0.4", 2735 | "ws": "^5.2.0" 2736 | }, 2737 | "dependencies": { 2738 | "ws": { 2739 | "version": "5.2.2", 2740 | "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", 2741 | "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", 2742 | "requires": { 2743 | "async-limiter": "~1.0.0" 2744 | } 2745 | } 2746 | } 2747 | }, 2748 | "symbol-observable": { 2749 | "version": "1.2.0", 2750 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", 2751 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 2752 | }, 2753 | "tarn": { 2754 | "version": "3.0.0", 2755 | "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.0.tgz", 2756 | "integrity": "sha512-PKUnlDFODZueoA8owLehl8vLcgtA8u4dRuVbZc92tspDYZixjJL6TqYOmryf/PfP/EBX+2rgNcrj96NO+RPkdQ==", 2757 | "dev": true 2758 | }, 2759 | "tildify": { 2760 | "version": "2.0.0", 2761 | "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", 2762 | "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", 2763 | "dev": true 2764 | }, 2765 | "to-object-path": { 2766 | "version": "0.3.0", 2767 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 2768 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 2769 | "dev": true, 2770 | "requires": { 2771 | "kind-of": "^3.0.2" 2772 | }, 2773 | "dependencies": { 2774 | "kind-of": { 2775 | "version": "3.2.2", 2776 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2777 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2778 | "dev": true, 2779 | "requires": { 2780 | "is-buffer": "^1.1.5" 2781 | } 2782 | } 2783 | } 2784 | }, 2785 | "to-regex": { 2786 | "version": "3.0.2", 2787 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 2788 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 2789 | "dev": true, 2790 | "requires": { 2791 | "define-property": "^2.0.2", 2792 | "extend-shallow": "^3.0.2", 2793 | "regex-not": "^1.0.2", 2794 | "safe-regex": "^1.1.0" 2795 | } 2796 | }, 2797 | "to-regex-range": { 2798 | "version": "2.1.1", 2799 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 2800 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 2801 | "dev": true, 2802 | "requires": { 2803 | "is-number": "^3.0.0", 2804 | "repeat-string": "^1.6.1" 2805 | } 2806 | }, 2807 | "toidentifier": { 2808 | "version": "1.0.0", 2809 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 2810 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 2811 | }, 2812 | "ts-invariant": { 2813 | "version": "0.4.4", 2814 | "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", 2815 | "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", 2816 | "requires": { 2817 | "tslib": "^1.9.3" 2818 | } 2819 | }, 2820 | "tslib": { 2821 | "version": "1.11.2", 2822 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", 2823 | "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" 2824 | }, 2825 | "tsscmp": { 2826 | "version": "1.0.6", 2827 | "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", 2828 | "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" 2829 | }, 2830 | "type-is": { 2831 | "version": "1.6.18", 2832 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2833 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2834 | "requires": { 2835 | "media-typer": "0.3.0", 2836 | "mime-types": "~2.1.24" 2837 | } 2838 | }, 2839 | "unc-path-regex": { 2840 | "version": "0.1.2", 2841 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 2842 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 2843 | "dev": true 2844 | }, 2845 | "union-value": { 2846 | "version": "1.0.1", 2847 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", 2848 | "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", 2849 | "dev": true, 2850 | "requires": { 2851 | "arr-union": "^3.1.0", 2852 | "get-value": "^2.0.6", 2853 | "is-extendable": "^0.1.1", 2854 | "set-value": "^2.0.1" 2855 | } 2856 | }, 2857 | "unpipe": { 2858 | "version": "1.0.0", 2859 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2860 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2861 | }, 2862 | "unset-value": { 2863 | "version": "1.0.0", 2864 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 2865 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 2866 | "dev": true, 2867 | "requires": { 2868 | "has-value": "^0.3.1", 2869 | "isobject": "^3.0.0" 2870 | }, 2871 | "dependencies": { 2872 | "has-value": { 2873 | "version": "0.3.1", 2874 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 2875 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 2876 | "dev": true, 2877 | "requires": { 2878 | "get-value": "^2.0.3", 2879 | "has-values": "^0.1.4", 2880 | "isobject": "^2.0.0" 2881 | }, 2882 | "dependencies": { 2883 | "isobject": { 2884 | "version": "2.1.0", 2885 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 2886 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 2887 | "dev": true, 2888 | "requires": { 2889 | "isarray": "1.0.0" 2890 | } 2891 | } 2892 | } 2893 | }, 2894 | "has-values": { 2895 | "version": "0.1.4", 2896 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 2897 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", 2898 | "dev": true 2899 | }, 2900 | "isarray": { 2901 | "version": "1.0.0", 2902 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2903 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 2904 | "dev": true 2905 | } 2906 | } 2907 | }, 2908 | "urijs": { 2909 | "version": "1.19.2", 2910 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.2.tgz", 2911 | "integrity": "sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==" 2912 | }, 2913 | "urix": { 2914 | "version": "0.1.0", 2915 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 2916 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 2917 | "dev": true 2918 | }, 2919 | "use": { 2920 | "version": "3.1.1", 2921 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 2922 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", 2923 | "dev": true 2924 | }, 2925 | "util.promisify": { 2926 | "version": "1.0.1", 2927 | "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", 2928 | "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", 2929 | "requires": { 2930 | "define-properties": "^1.1.3", 2931 | "es-abstract": "^1.17.2", 2932 | "has-symbols": "^1.0.1", 2933 | "object.getownpropertydescriptors": "^2.1.0" 2934 | } 2935 | }, 2936 | "uuid": { 2937 | "version": "3.4.0", 2938 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 2939 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 2940 | }, 2941 | "v8flags": { 2942 | "version": "3.1.3", 2943 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", 2944 | "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", 2945 | "dev": true, 2946 | "requires": { 2947 | "homedir-polyfill": "^1.0.1" 2948 | } 2949 | }, 2950 | "vary": { 2951 | "version": "1.1.2", 2952 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2953 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2954 | }, 2955 | "which": { 2956 | "version": "1.3.1", 2957 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2958 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2959 | "dev": true, 2960 | "requires": { 2961 | "isexe": "^2.0.0" 2962 | } 2963 | }, 2964 | "ws": { 2965 | "version": "6.2.1", 2966 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", 2967 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", 2968 | "requires": { 2969 | "async-limiter": "~1.0.0" 2970 | } 2971 | }, 2972 | "yallist": { 2973 | "version": "3.1.1", 2974 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 2975 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 2976 | }, 2977 | "ylru": { 2978 | "version": "1.2.1", 2979 | "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", 2980 | "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" 2981 | }, 2982 | "zen-observable": { 2983 | "version": "0.8.15", 2984 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", 2985 | "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" 2986 | }, 2987 | "zen-observable-ts": { 2988 | "version": "0.8.21", 2989 | "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", 2990 | "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", 2991 | "requires": { 2992 | "tslib": "^1.9.3", 2993 | "zen-observable": "^0.8.0" 2994 | } 2995 | } 2996 | } 2997 | } 2998 | -------------------------------------------------------------------------------- /graphql/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-blog-backend", 3 | "version": "1.0.0", 4 | "description": "A Koa and GraphQL backend for React Blog", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "test", 8 | "create-migration": "node ./database/actions/create-migration.js", 9 | "run-migration": "node ./database/actions/run-migration.js" 10 | }, 11 | "author": "Miguel Coder", 12 | "license": "ISC", 13 | "dependencies": { 14 | "apollo-server-koa": "^2.13.0", 15 | "bluebird": "^3.7.2", 16 | "dotenv": "^8.2.0", 17 | "graphql-tools": "^5.0.0", 18 | "koa": "^2.11.0", 19 | "moment": "^2.25.3" 20 | }, 21 | "devDependencies": { 22 | "knex": "^0.21.1", 23 | "mysql2": "^2.1.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /graphql/schemas/index.js: -------------------------------------------------------------------------------- 1 | const postsSchema = require('./posts') 2 | 3 | const resolvers = [ 4 | postsSchema.resolvers 5 | ] 6 | 7 | const typeDefs = [ 8 | postsSchema.schema 9 | ] 10 | 11 | module.exports = { 12 | resolvers, 13 | typeDefs 14 | } -------------------------------------------------------------------------------- /graphql/schemas/posts/index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const PostService = require("../../api/posts"); 4 | const { errorHandler } = require("../../api/utils"); 5 | 6 | const getPostsWithAuthors = (cb) => async (parent, args, context, info) => { 7 | const posts = await cb(args, parent).catch(errorHandler); 8 | 9 | if (!posts.length) return []; 10 | 11 | const authors = await PostService.getPostsAuthors([ 12 | ...new Set(posts.map(({ author_id }) => author_id)), 13 | ]).catch(errorHandler); 14 | 15 | const authorMap = authors.reduce( 16 | (map, author) => ({ 17 | ...map, 18 | [author.id]: `${author.first_name} ${author.last_name}`, 19 | }), 20 | {} 21 | ); 22 | 23 | return posts.map(({ categories, author_id, ...rest }, index) => ({ 24 | categories: categories.split(","), 25 | ...rest, 26 | author: authorMap[author_id], 27 | })); 28 | }; 29 | 30 | module.exports = { 31 | resolvers: { 32 | Query: { 33 | getPostsByType: getPostsWithAuthors( 34 | async ({ type }) => await PostService.getPosts(type) 35 | ), 36 | getPostsByCategories: getPostsWithAuthors( 37 | async ({ cat_ids }) => await PostService.getPosts("default", cat_ids) 38 | ), 39 | getPost: async (parent, { id }) => { 40 | const post = await PostService.getPost(id); 41 | 42 | return post; 43 | }, 44 | }, 45 | Mutation: { 46 | createPost: async (parent, args) => await PostService.createPost(args), 47 | }, 48 | }, 49 | schema: fs 50 | .readFileSync(path.resolve(__dirname, "./posts-schema.graphql")) 51 | .toString(), 52 | }; 53 | -------------------------------------------------------------------------------- /graphql/schemas/posts/posts-schema.graphql: -------------------------------------------------------------------------------- 1 | type Query { 2 | getPostsByType(type: String): [Post]! 3 | getPostsByCategories(cat_ids: [Int]): [Post]! 4 | getPost(id: ID!): Post 5 | } 6 | 7 | type Mutation { 8 | createPost(data: PostInput): ID! 9 | } 10 | 11 | input PostInput { 12 | title: String 13 | categories: [String] 14 | description: String 15 | image: String 16 | keyword1: String 17 | keyword2: String 18 | bg_src: String 19 | bg_type: String 20 | } 21 | 22 | type Post { 23 | id: Int 24 | title: String 25 | text: String, 26 | keyword1: String 27 | keyword2: String 28 | bg_src: String 29 | bg_type: String 30 | categories: [String] 31 | author: String 32 | description: String 33 | image: String 34 | likes: Int 35 | comments: [Comment] 36 | updated_at: String 37 | } 38 | 39 | type Comment { 40 | id: Int 41 | post_id: Int 42 | author: String 43 | comment: String 44 | author_image: String 45 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-react-blog", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@apollo/client": "^3.1.3", 7 | "@apollo/react-hooks": "^4.0.0", 8 | "@quasar/extras": "^1.7.0", 9 | "@testing-library/jest-dom": "^4.2.4", 10 | "@testing-library/react": "^9.3.2", 11 | "@testing-library/user-event": "^7.1.2", 12 | "@types/jest": "^26.0.24", 13 | "@types/node": "^16.0.1", 14 | "@types/react": "^17.0.14", 15 | "@types/react-dom": "^17.0.9", 16 | "antd": "^4.2.0", 17 | "apollo-cache-inmemory": "^1.6.6", 18 | "apollo-client": "^2.6.10", 19 | "apollo-link-http": "^1.5.17", 20 | "babel-eslint": "^10.1.0", 21 | "bootstrap": "^4.5.0", 22 | "graphql": "^15.3.0", 23 | "graphql-tag": "^2.11.0", 24 | "lodash": "^4.17.19", 25 | "moment": "^2.27.0", 26 | "node-sass": "^4.13.1", 27 | "quill": "^1.3.7", 28 | "react": "^16.13.1", 29 | "react-dom": "^16.13.1", 30 | "react-helmet": "^6.1.0", 31 | "react-quill": "^1.3.5", 32 | "react-router": "^5.1.2", 33 | "react-router-dom": "^5.1.2", 34 | "react-scripts": "3.4.1", 35 | "react-test-renderer": "^17.0.1", 36 | "sass-loader": "^8.0.2", 37 | "typescript": "^4.3.5" 38 | }, 39 | "scripts": { 40 | "start": "react-scripts start", 41 | "build": "react-scripts build", 42 | "test": "react-scripts test", 43 | "eject": "react-scripts eject" 44 | }, 45 | "eslintConfig": { 46 | "extends": "react-app" 47 | }, 48 | "jest": { 49 | "coverageReporters": [ 50 | "text-summary" 51 | ] 52 | }, 53 | "browserslist": { 54 | "production": [ 55 | ">0.2%", 56 | "not dead", 57 | "not op_mini all" 58 | ], 59 | "development": [ 60 | "last 1 chrome version", 61 | "last 1 firefox version", 62 | "last 1 safari version" 63 | ] 64 | }, 65 | "devDependencies": { 66 | "@typescript-eslint/eslint-plugin": "^4.28.2", 67 | "@typescript-eslint/parser": "^4.28.2", 68 | "eslint": "^7.30.0", 69 | "eslint-config-prettier": "^8.3.0", 70 | "eslint-plugin-prettier": "^3.4.0", 71 | "eslint-plugin-react": "^7.24.0", 72 | "eslint-plugin-react-hooks": "^4.2.0", 73 | "prettier": "^2.3.2", 74 | "prettierrc": "^0.0.0-5" 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | My React Blog 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/public/logo512.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Navigation from "./components/navigation"; 3 | import { BrowserRouter as Router, Switch, Route } from "react-router-dom"; 4 | 5 | import Algos from "./pages/algos"; 6 | import Cloud from "./pages/cloud"; 7 | import Health from "./pages/health"; 8 | import Home from "./pages/home"; 9 | import Login from "./pages/login"; 10 | import Post from "./pages/post"; 11 | import WebDev from "./pages/web-dev"; 12 | import EditPost from "./pages/edit-post"; 13 | 14 | function App() { 15 | return ( 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 404} /> 29 | 30 |
31 |
32 | ); 33 | } 34 | 35 | export default App; 36 | -------------------------------------------------------------------------------- /src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {render, act, fireEvent} from '@testing-library/react'; 3 | import App from './App'; 4 | 5 | window.localeStorage = { 6 | get: jest.fn(), 7 | set: jest.fn() 8 | } 9 | 10 | test.skip('renders learn react link', () => { 11 | 12 | const {getByTestId} = render() 13 | 14 | const element = getByTestId('form-button') 15 | 16 | act(() => { 17 | fireEvent.click(element) 18 | }) 19 | 20 | expect(tree).toMatchSnapshot(); 21 | 22 | expect(window.localStorage.get).toHaveBeenCalled() 23 | }); 24 | -------------------------------------------------------------------------------- /src/assets/images/anyone_can_code.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/anyone_can_code.jpg -------------------------------------------------------------------------------- /src/assets/images/apollo_graphql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/apollo_graphql.png -------------------------------------------------------------------------------- /src/assets/images/circuit_brain.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/circuit_brain.jpg -------------------------------------------------------------------------------- /src/assets/images/cloud_storage.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/cloud_storage.jpeg -------------------------------------------------------------------------------- /src/assets/images/cloud_storage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/cloud_storage.jpg -------------------------------------------------------------------------------- /src/assets/images/crypto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/crypto.jpg -------------------------------------------------------------------------------- /src/assets/images/gql_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/gql_image.png -------------------------------------------------------------------------------- /src/assets/images/graphql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/graphql.png -------------------------------------------------------------------------------- /src/assets/images/home_budget.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/home_budget.jpg -------------------------------------------------------------------------------- /src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/logo.png -------------------------------------------------------------------------------- /src/assets/images/money.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/money.jpg -------------------------------------------------------------------------------- /src/assets/images/neuron.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/neuron.jpg -------------------------------------------------------------------------------- /src/assets/images/programming_languages.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/programming_languages.jpeg -------------------------------------------------------------------------------- /src/assets/images/puzzled_programmer.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/puzzled_programmer.jpeg -------------------------------------------------------------------------------- /src/assets/images/spending_money.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syntacticsolutions/react-blog/fa5ffcab7264c500a07738be144a38f73636671d/src/assets/images/spending_money.jpg -------------------------------------------------------------------------------- /src/assets/mocks/featured.js: -------------------------------------------------------------------------------- 1 | import moment from 'moment' 2 | 3 | export default [ 4 | { 5 | title: 'Can anyone code?', 6 | date: moment().format('MMMM DD, YYYY'), 7 | categories: ['Tech Culture', 'Tech News'], 8 | link: '#', 9 | image: 'anyone_can_code.jpg', 10 | }, 11 | { 12 | title: 'Using AWS S3 for Storing Blog Images', 13 | date: moment().format('MMMM DD, YYYY'), 14 | categories: ['Cloud'], 15 | link: '#', 16 | image: 'cloud_storage.jpeg', 17 | }, 18 | { 19 | title: 'Popular Programming Languages in 2020', 20 | date: moment().format('MMMM DD, YYYY'), 21 | categories: ['Tech News', 'Tech Culture'], 22 | link: '#', 23 | image: 'programming_languages.jpeg' 24 | }, 25 | { 26 | title: 'Brain Hacks for Learning to Program', 27 | date: moment().format('MMMM DD, YYYY'), 28 | categories: ['Brain Health'], 29 | link: '#', 30 | image: 'neuron.jpg' 31 | }, 32 | ] -------------------------------------------------------------------------------- /src/assets/mocks/trending.js: -------------------------------------------------------------------------------- 1 | import moment from 'moment' 2 | 3 | export default [ 4 | { 5 | title: 'Software Engineer Salary in 2020', 6 | date: moment().format('MMMM DD, YYYY'), 7 | categories: ['Tech Culture'], 8 | link: '#', 9 | image: 'money.jpg' 10 | }, 11 | { 12 | title: 'GraphQL vs REST', 13 | date: moment().format('MMMM DD, YYYY'), 14 | categories: ['React', 'JavaScript'], 15 | link: '#', 16 | image: 'apollo_graphql.png', 17 | }, 18 | { 19 | title: 'A Day in the Life of a Programmer', 20 | date: moment().format('MMMM DD, YYYY'), 21 | categories: ['Tech Culture'], 22 | link: '#', 23 | image: 'puzzled_programmer.jpeg' 24 | }, 25 | { 26 | title: 'Brain Hacks for Learning to Program', 27 | date: moment().format('MMMM DD, YYYY'), 28 | categories: ['Brain Health'], 29 | link: '#', 30 | image: 'neuron.jpg' 31 | }, 32 | { 33 | title: 'React Vs Vue', 34 | date: moment().format('MMMM DD, YYYY'), 35 | categories: ['React', 'Vue'], 36 | link: '#', 37 | image: 'logo.png' 38 | }, 39 | ] -------------------------------------------------------------------------------- /src/assets/scss/_home.scss: -------------------------------------------------------------------------------- 1 | .home { 2 | padding: 2em 0; 3 | 4 | h1 { 5 | width: 100%; 6 | color: $text-color; 7 | padding: 1.5em 0; 8 | } 9 | 10 | .featured-posts-container { 11 | display: flex; 12 | } 13 | 14 | .bg-white { 15 | background: white; 16 | } 17 | } 18 | 19 | @media screen and (max-width: 900px) { 20 | .home { 21 | h1 { 22 | margin: 5; 23 | margin-block-start: 1.5em; 24 | margin-block-end: 1.5em; 25 | } 26 | 27 | .featured-posts-container { 28 | flex-direction: column; 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /src/assets/scss/_masonry-post.scss: -------------------------------------------------------------------------------- 1 | .masonry-post { 2 | position: relative; 3 | border-radius: 5px; 4 | overflow: hidden; 5 | background-size: cover; 6 | background-position: center center; 7 | height: 100%; 8 | width: 100%; 9 | text-decoration: none; 10 | margin: 0 auto; 11 | min-height: 225px; 12 | 13 | .image-text { 14 | height: 100%; 15 | width: 100%; 16 | display: flex; 17 | flex-direction: column; 18 | padding: 20px; 19 | box-sizing: border-box; 20 | } 21 | 22 | .image-title, .image-date, .tags-container, div { 23 | float: left; 24 | width: 100%; 25 | z-index: 10; 26 | font-weight: 300; 27 | } 28 | 29 | .image-title { 30 | font-size: 20px; 31 | margin-block-start: 0; 32 | margin-block-end: 10px; 33 | color: white; 34 | } 35 | 36 | .image-date { 37 | font-size: 18px; 38 | color: $text-light; 39 | } 40 | } 41 | 42 | @media screen and (max-width: 900px) { 43 | .masonry-post { 44 | width: 100%; 45 | margin: 10px 0; 46 | height: 300px; 47 | } 48 | } -------------------------------------------------------------------------------- /src/assets/scss/_navigation.scss: -------------------------------------------------------------------------------- 1 | .site-navigation { 2 | background: white; 3 | height: 65px; 4 | width: 100%; 5 | display: flex; 6 | justify-content: space-between; 7 | color: $text-color; 8 | position: fixed; 9 | z-index: 100; 10 | top: 0; 11 | 12 | .ion-ios-menu { 13 | font-size: 36px; 14 | width: 65px; 15 | align-items:center; 16 | cursor: pointer; 17 | display: none; 18 | } 19 | 20 | .menu-content-container { 21 | display: flex; 22 | align-items: center; 23 | margin-right: 30px; 24 | 25 | .ant-avatar { 26 | background-color: $background; 27 | border: 1px solid $border; 28 | } 29 | 30 | .menu-avatar-name { 31 | font-size: 18px; 32 | margin-left: 15px; 33 | } 34 | } 35 | 36 | .menu-title { 37 | font-weight: 500; 38 | font-size: 22px; 39 | height: 100%; 40 | display: flex; 41 | align-items: center; 42 | margin-left: 30px; 43 | } 44 | 45 | ul { 46 | height: 100%; 47 | margin-block-start: 0; 48 | margin-block-end: 0; 49 | padding-inline-start: 0; 50 | display: flex; 51 | justify-content: flex-end; 52 | align-items: center; 53 | list-style-type: none; 54 | margin: 0 20px 0 50px; 55 | 56 | a { 57 | text-decoration: none; 58 | padding: 0 20px 0 20px; 59 | font-size: 20px; 60 | color: $text-color; 61 | 62 | &:hover { 63 | color: $text-link; 64 | } 65 | } 66 | } 67 | } 68 | 69 | @media screen and (max-width: 900px) { 70 | .site-navigation { 71 | .menu-content-container { 72 | width: 300px; 73 | height: calc(100% - 65px); 74 | background: white; 75 | position: fixed; 76 | top: 65px; 77 | left: -300px; 78 | transition: 300ms ease left; 79 | flex-direction: column-reverse; 80 | 81 | ul { 82 | flex-direction: column; 83 | justify-content: flex-start; 84 | 85 | li { 86 | text-align:left; 87 | height: 65px; 88 | display: flex; 89 | align-items: center; 90 | } 91 | a { 92 | padding: 20px 15px; 93 | width: 100%; 94 | } 95 | } 96 | 97 | ul, li, .menu-avatar-container { 98 | width: 100%; 99 | } 100 | 101 | .ant-avatar { 102 | align-self: flex-start; 103 | margin-left: 30px; 104 | } 105 | } 106 | &.active { 107 | .menu-content-container { 108 | left: 0px; 109 | } 110 | } 111 | .ion-ios-menu { 112 | display: flex; 113 | } 114 | } 115 | } -------------------------------------------------------------------------------- /src/assets/scss/_post-editor.scss: -------------------------------------------------------------------------------- 1 | .post-editor { 2 | padding: 80px 30px; 3 | 4 | .quill { 5 | // height: 60vh; 6 | border: 1px solid #ccc; 7 | border-radius: 4px; 8 | } 9 | } -------------------------------------------------------------------------------- /src/assets/scss/_post-grid.scss: -------------------------------------------------------------------------------- 1 | .grid-pagination-container { 2 | .ant-pagination { 3 | text-align: center; 4 | padding-bottom: 50px; 5 | } 6 | } 7 | 8 | .post-grid { 9 | display: grid; 10 | grid-template-columns: repeat(auto-fill, minmax(275px, 1fr)); 11 | grid-gap: 30px; 12 | grid-auto-rows: 1fr; 13 | padding-bottom: 50px; 14 | 15 | figure { 16 | height: 100%; 17 | max-height: 280px; 18 | } 19 | 20 | img { 21 | position: relative; 22 | border-radius: 5px; 23 | overflow: hidden; 24 | object-fit: cover; 25 | object-position: center center; 26 | height: 100%; 27 | width: 100%; 28 | margin: 0 auto; 29 | max-height: 280px; 30 | } 31 | 32 | .post-container { 33 | display: flex; 34 | flex-direction: column; 35 | 36 | .author-text { 37 | color: $text-light; 38 | } 39 | 40 | .author-text a { 41 | padding: 0 5px; 42 | } 43 | 44 | .description-text { 45 | font-size: 18px; 46 | font-weight: 400px; 47 | color: #555; 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /src/assets/scss/_post-masonry.scss: -------------------------------------------------------------------------------- 1 | 2 | .masonry { 3 | display: grid; 4 | grid-gap: 30px; 5 | } 6 | 7 | @media screen and (max-width: 900px) { 8 | .masonry { 9 | display: flex; 10 | flex-direction: column; 11 | } 12 | } -------------------------------------------------------------------------------- /src/assets/scss/_post.scss: -------------------------------------------------------------------------------- 1 | .post-viewer-container { 2 | position: relative; 3 | background: white; 4 | 5 | .ql-toolbar { 6 | display: none; 7 | } 8 | 9 | .ql-container { 10 | border: none; 11 | 12 | .ql-editor { 13 | padding: 0; 14 | } 15 | 16 | h2, h3, h4, p { 17 | max-width: 1000px; 18 | margin: auto auto; 19 | } 20 | } 21 | 22 | .post-intro-container { 23 | width: 100vw; 24 | height: 80vh; 25 | overflow: hidden; 26 | background: white; 27 | 28 | figure { 29 | position: fixed; 30 | height: 100%; 31 | width: 100%; 32 | } 33 | 34 | img { 35 | height: 100%; 36 | object-position: center; 37 | object-fit: cover; 38 | width: 100%; 39 | } 40 | 41 | iframe { 42 | height: 100%; 43 | width: 100%; 44 | } 45 | } 46 | 47 | .post-title-container { 48 | position: relative; 49 | display: flex; 50 | 51 | .title-wrapper { 52 | display: flex; 53 | flex-wrap: wrap; 54 | justify-content: space-between; 55 | max-width: 1050px; 56 | margin: 0 auto; 57 | background: white; 58 | flex-grow: 1; 59 | border-top-right-radius: 8px; 60 | border-top-left-radius: 8px; 61 | padding: 20px; 62 | } 63 | 64 | h1 { 65 | font-weight: 400; 66 | font-size: 36px; 67 | 68 | } 69 | 70 | p { 71 | text-align: left; 72 | align-items: flex-start; 73 | justify-content: flex-end; 74 | padding: 10px; 75 | } 76 | } 77 | 78 | .post-content-container { 79 | border-radius: 4px; 80 | padding-top: 30px; 81 | margin: 0 auto; 82 | z-index: 1; 83 | position: relative; 84 | background: white; 85 | 86 | h2 { 87 | font-size: 32px; 88 | font-weight: 400; 89 | } 90 | 91 | p { 92 | line-height: 32px; 93 | font-size: 20px; 94 | } 95 | } 96 | } -------------------------------------------------------------------------------- /src/assets/scss/_tag-row.scss: -------------------------------------------------------------------------------- 1 | 2 | .tags-container { 3 | font-size: 12px; 4 | font-weight: 500; 5 | margin-bottom: 15px; 6 | margin-left: -1px; 7 | color: white; 8 | .tag { 9 | border-radius: 5px; 10 | padding: 4px 8px; 11 | margin-right: 5px; 12 | } 13 | } -------------------------------------------------------------------------------- /src/assets/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | $text-link: #2997ff; 2 | $text-color: #444; 3 | $text-light: #999; 4 | 5 | $background: #f8f9fa; 6 | $border: #ddd; -------------------------------------------------------------------------------- /src/assets/scss/base.scss: -------------------------------------------------------------------------------- 1 | @import './variables'; 2 | @import './navigation'; 3 | @import './home'; 4 | @import './masonry-post'; 5 | @import './post-masonry'; 6 | @import './tag-row'; 7 | @import './post-grid'; 8 | @import './post'; 9 | @import './post-editor'; 10 | 11 | 12 | body { 13 | font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif; 14 | font-weight: 500; 15 | margin: 0; 16 | background-color: #f8f9fa; 17 | } 18 | 19 | h1 { 20 | font-size: 2rem; 21 | } 22 | 23 | .container { 24 | max-width: 1200px; 25 | margin: 0 auto; 26 | } 27 | 28 | .row { 29 | margin: 4em 20px; 30 | } 31 | 32 | .overlay::before { 33 | z-index: 1; 34 | content: ''; 35 | position: absolute; 36 | top: 0; 37 | right: 0; 38 | bottom: 0; 39 | left: 0; 40 | background: linear-gradient(180deg, transparent 0%, transparent 18%, rgba(0,0,0,0.8) 99%, rgba(0,0,0,0.8) 100%) 41 | } -------------------------------------------------------------------------------- /src/components/common/__tests__/post-masonry.test.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import renderer from "react-test-renderer"; 3 | import { PostMasonry } from "../"; 4 | import featured from "../../../assets/mocks/featured"; 5 | 6 | const mergeStyles = function (posts, config) { 7 | posts.forEach((post, index) => { 8 | post.style = config[index]; 9 | post.author = "Miguel Coder"; 10 | post.description = 11 | "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quo sunt tempora dolor laudantium sed optio, explicabo ad deleniti impedit facilis fugit recusandae! Illo, aliquid, dicta beatae quia porro id est."; 12 | }); 13 | }; 14 | 15 | const featuredConfig = { 16 | 0: { 17 | gridArea: "1 / 1 / 2 / 3", 18 | height: "300px", 19 | }, 20 | 1: { 21 | height: "300px", 22 | }, 23 | 3: { 24 | height: "630px", 25 | marginLeft: "30px", 26 | width: "630px", 27 | }, 28 | }; 29 | 30 | mergeStyles(featured, featuredConfig); 31 | 32 | describe(" Component", () => { 33 | it("Should render properly", () => { 34 | const tree = renderer 35 | .create() 36 | .toJSON(); 37 | 38 | expect(tree).toMatchSnapshot(); 39 | }); 40 | }); 41 | -------------------------------------------------------------------------------- /src/components/common/index.js: -------------------------------------------------------------------------------- 1 | import PostMasonry from "./post-masonry"; 2 | import { MasonryPost } from "./masonry-post"; 3 | import PostGrid from "./post-grid"; 4 | import TagRow from "./tag-row"; 5 | 6 | export { PostMasonry, MasonryPost, PostGrid, TagRow }; 7 | -------------------------------------------------------------------------------- /src/components/common/masonry-post/component.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { TagRow } from "../"; 3 | import { IMasonryPost } from "./"; 4 | 5 | export default function MasonryPost({ 6 | post, 7 | tagsOnTop, 8 | }: IMasonryPost): JSX.Element { 9 | const windowWidth = window.innerWidth; 10 | const imageBackground = { 11 | backgroundImage: `url("${require(`../../assets/images/${post.image}`)}")`, 12 | }; 13 | 14 | const style = 15 | windowWidth > 900 ? { ...imageBackground, ...post.style } : imageBackground; 16 | 17 | return ( 18 | 19 |
23 | 24 |
25 |

{post.title}

26 | {post.date} 27 |
28 |
29 |
30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /src/components/common/masonry-post/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./component"; 2 | export * from "./types"; 3 | -------------------------------------------------------------------------------- /src/components/common/masonry-post/types.ts: -------------------------------------------------------------------------------- 1 | import { Post } from "../../../types"; 2 | 3 | export interface IMasonryPost { 4 | post: Post; 5 | tagsOnTop: boolean; 6 | } 7 | -------------------------------------------------------------------------------- /src/components/common/post-grid.js: -------------------------------------------------------------------------------- 1 | import React, {useState, useMemo, useEffect} from 'react' 2 | import {Link} from 'react-router-dom' 3 | import {Pagination} from 'antd' 4 | import {TagRow} from './' 5 | 6 | export default function PostGrid ({posts}) { 7 | const [pageSize, setPageSize] = useState(9) 8 | const [current, setCurrent] = useState(1) 9 | 10 | const paginatedPosts = useMemo(() => { 11 | const lastIndex = current * pageSize 12 | const firstIndex = lastIndex - pageSize 13 | 14 | return posts.slice(firstIndex, lastIndex) 15 | }, [current, pageSize, posts]) 16 | 17 | useEffect(() => { 18 | window.scroll({ 19 | top: 0, 20 | left: 0, 21 | behavior: 'smooth' 22 | }) 23 | }, [current, pageSize]) 24 | 25 | 26 | 27 | return ( 28 |
29 |
30 | {paginatedPosts.map((post, index) => ( 31 |
32 |
33 | 34 | {post.image}/ 35 | 36 |
37 | 38 |

{post.title}

39 |

40 | 41 | By: 42 | 43 | {post.author} 44 | 45 | 46 | 47 | - {post.date} 48 | 49 |

50 |

51 | {post.description} 52 |

53 | Read More... 54 |
55 | ))} 56 |
57 | 66 |
67 | ) 68 | } -------------------------------------------------------------------------------- /src/components/common/post-masonry.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {MasonryPost} from './' 3 | 4 | export default function PostMasonry ({posts, columns, tagsOnTop}) { 5 | return ( 6 |
7 | { posts.map((post, index) => 8 | 9 | )} 10 |
11 | ) 12 | } -------------------------------------------------------------------------------- /src/components/common/styles.js: -------------------------------------------------------------------------------- 1 | 2 | const categoryColors = { 3 | 'Tech Culture': 'rgb(255,59,48)', 4 | 'Tech News': 'rgb(0,113,164)', 5 | 'Brain Health': 'rgb(255,45,85)', 6 | Vue: 'rgb(52,199,89)', 7 | React: 'rgb(64,156,255)', 8 | JavaScript: 'rgb(255, 179, 64)', 9 | Cloud: 'rgb(175,82,250)' 10 | } 11 | 12 | export { 13 | categoryColors 14 | } -------------------------------------------------------------------------------- /src/components/common/tag-row.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {categoryColors} from './styles' 3 | 4 | export default function TagRow ({tags}) { 5 | return ( 6 |
7 | {tags.map((tag, ind) => 8 | 9 | {tag.toUpperCase()} 10 | 11 | )} 12 |
13 | ) 14 | } -------------------------------------------------------------------------------- /src/components/common/with-title.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export default function withTitle (title, component) { 4 | return ( 5 |
6 |
7 |
8 |

{title}

9 | {component} 10 |
11 |
12 |
13 | ) 14 | } -------------------------------------------------------------------------------- /src/components/navigation.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react' 2 | import { Link } from 'react-router-dom' 3 | import { Avatar } from 'antd'; 4 | 5 | const navLinks = [ 6 | { 7 | title: 'Blog', 8 | path: '/' 9 | }, 10 | { 11 | title: 'Web Dev', 12 | path: '/web-dev' 13 | }, 14 | { 15 | title: 'Cloud', 16 | path: '/cloud' 17 | }, 18 | { 19 | title: 'Algorithms', 20 | path: '/algos' 21 | }, 22 | { 23 | title: 'Brain Hacking', 24 | path: '/health' 25 | }, 26 | { 27 | title: 'Login', 28 | path: '/login' 29 | }, 30 | { 31 | title: 'Post Viewer', 32 | path: '/post' 33 | } 34 | ] 35 | 36 | export default function Navigation () { 37 | const [menuActive, setMenuActive] = useState(false) 38 | 39 | return ( 40 | 63 | ) 64 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import 'antd/dist/antd.css'; 4 | import '@quasar/extras/ionicons-v4/ionicons-v4.css' 5 | import App from './App'; 6 | import * as serviceWorker from './serviceWorker'; 7 | 8 | 9 | import { ApolloClient } from 'apollo-client'; 10 | import { HttpLink } from 'apollo-link-http'; 11 | import { InMemoryCache } from 'apollo-cache-inmemory'; 12 | import { ApolloProvider } from '@apollo/react-hooks'; 13 | 14 | import './assets/scss/base.scss' 15 | 16 | const cache = new InMemoryCache() 17 | 18 | const httpLink = new HttpLink({ 19 | uri: 'http://localhost:4000/graphql' 20 | }) 21 | 22 | const client = new ApolloClient({ 23 | cache, 24 | link: httpLink 25 | }) 26 | 27 | ReactDOM.render( 28 | 29 | 30 | 31 | 32 | , 33 | document.getElementById('root') 34 | ); 35 | 36 | // If you want your app to work offline and load faster, you can change 37 | // unregister() to register() below. Note this comes with some pitfalls. 38 | // Learn more about service workers: https://bit.ly/CRA-PWA 39 | serviceWorker.unregister(); 40 | -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/page-renderer.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {useRouteMatch} from 'react-router-dom' 3 | 4 | const generatePage = page => { 5 | try { 6 | const Component = require(`./pages/${page}`).default 7 | return ; 8 | } catch (err) { 9 | console.warn(err) 10 | return 'Under Construction' 11 | } 12 | } 13 | 14 | const PageRenderer = () => { 15 | const { 16 | params: { page } 17 | } = useRouteMatch() 18 | 19 | return generatePage(page) 20 | } 21 | 22 | export default PageRenderer -------------------------------------------------------------------------------- /src/pages/algos.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {useQuery} from '@apollo/react-hooks' 3 | 4 | import withTitle from '../components/common/with-title' 5 | import PostGrid from '../components/common/post-grid' 6 | import {GET_POSTS_BY_CATEGORIES_QUERY} from '../queries/posts' 7 | 8 | const catIds = [8] 9 | 10 | export default function Algorithms ({history}) { 11 | 12 | const {data, error} = useQuery(GET_POSTS_BY_CATEGORIES_QUERY, { 13 | variables: { 14 | cat_ids: catIds 15 | } 16 | }) 17 | 18 | if (error) { 19 | console.log(error) 20 | return 'Something went wrong.' 21 | } 22 | 23 | return withTitle( 24 | 'Algorithms', 25 | data?.posts 26 | ? 27 | : 'Loading' 28 | 29 | ) 30 | } -------------------------------------------------------------------------------- /src/pages/cloud.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {useQuery} from '@apollo/react-hooks' 3 | 4 | import withTitle from '../components/common/with-title' 5 | import PostGrid from '../components/common/post-grid' 6 | import {GET_POSTS_BY_CATEGORIES_QUERY} from '../queries/posts' 7 | 8 | const catIds = [7] 9 | 10 | export default function Cloud ({history}) { 11 | const {data, error} = useQuery(GET_POSTS_BY_CATEGORIES_QUERY, { 12 | variables: { 13 | cat_ids: catIds 14 | } 15 | }) 16 | 17 | if (error) { 18 | return 'Something went wrong.' 19 | } 20 | 21 | return withTitle( 22 | 'Cloud', 23 | data?.posts 24 | ? 25 | : 'Loading' 26 | 27 | ) 28 | } -------------------------------------------------------------------------------- /src/pages/edit-post.js: -------------------------------------------------------------------------------- 1 | import React, {useCallback} from 'react'; 2 | import {Input} from 'antd'; 3 | import ReactQuill from 'react-quill'; 4 | 5 | export default function EditPost (props) { 6 | 7 | const getDelta = useCallback((value, delta, source, editor) => { 8 | console.log({value,delta,source,editor}) 9 | }, []) 10 | 11 | return ( 12 |
13 | 14 |
15 | ) 16 | } -------------------------------------------------------------------------------- /src/pages/health.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {useQuery} from '@apollo/react-hooks' 3 | 4 | import withTitle from '../components/common/with-title' 5 | import PostGrid from '../components/common/post-grid' 6 | import {GET_POSTS_BY_CATEGORIES_QUERY} from '../queries/posts' 7 | 8 | const catIds = [6] 9 | 10 | export default function BrainHacking ({history}) { 11 | const {data, error} = useQuery(GET_POSTS_BY_CATEGORIES_QUERY, { 12 | variables: { 13 | cat_ids: catIds 14 | } 15 | }) 16 | 17 | if (error) { 18 | console.log(error) 19 | return 'Something went wrong.' 20 | } 21 | 22 | return withTitle( 23 | 'Brain Hacking', 24 | data?.posts 25 | ? 26 | : 'Loading' 27 | 28 | ) 29 | } -------------------------------------------------------------------------------- /src/pages/home.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {PostMasonry, MasonryPost, PostGrid} from '../components/common' 3 | import trending from '../assets/mocks/trending' 4 | import featured from '../assets/mocks/featured' 5 | 6 | const trendingConfig = { 7 | 1: { 8 | gridArea: '1 / 2 / 3 / 3', 9 | } 10 | } 11 | 12 | const featuredConfig = { 13 | 0: { 14 | gridArea: '1 / 1 / 2 / 3', 15 | height: '300px' 16 | }, 17 | 1: { 18 | height: '300px' 19 | }, 20 | 3: { 21 | height: '630px', 22 | marginLeft: '30px', 23 | width: '630px', 24 | } 25 | } 26 | 27 | const mergeStyles = function (posts, config){ 28 | posts.forEach((post, index) => { 29 | post.style = config[index] 30 | post.author = 'Miguel Coder' 31 | post.description = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quo sunt tempora dolor laudantium sed optio, explicabo ad deleniti impedit facilis fugit recusandae! Illo, aliquid, dicta beatae quia porro id est.' 32 | }) 33 | } 34 | 35 | const recentPosts = [...trending, ...featured, ...featured] 36 | 37 | mergeStyles(featured, featuredConfig) 38 | mergeStyles(trending, trendingConfig) 39 | 40 | const lastPost = featured.pop() 41 | 42 | export default function Home () { 43 | return ( 44 |
45 |
46 |
47 |
48 | 49 | 50 |
51 |
52 |
53 |
54 |
55 |
56 |

Recent Posts

57 | 58 |
59 |
60 |
61 | 62 |
63 |
64 | 65 |
66 |
67 |
68 | )} -------------------------------------------------------------------------------- /src/pages/login.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export default function Login () { 4 | return
Login
5 | } -------------------------------------------------------------------------------- /src/pages/post.js: -------------------------------------------------------------------------------- 1 | import React, {useEffect, useRef} from 'react'; 2 | import { useParams, useHistory } from 'react-router-dom'; 3 | import {useQuery} from '@apollo/client'; 4 | import {Button} from 'antd'; 5 | import Quill from 'quill' 6 | import 'quill/dist/quill.snow.css' 7 | import {GET_POST_QUERY} from '../queries/posts'; 8 | 9 | 10 | export default function PostViewer () { 11 | const contentContainer = useRef(null) 12 | const {id} = useParams() 13 | let history = useHistory(); 14 | 15 | const {data, error, loading} = useQuery(GET_POST_QUERY, { 16 | variables: { 17 | id 18 | } 19 | }) 20 | 21 | const editPost = () => history.push({ 22 | pathname: '/edit-post', 23 | state: { 24 | data 25 | } 26 | }) 27 | 28 | useEffect(() => { 29 | if(contentContainer.current !== null) { 30 | const article = document.createElement('article') 31 | const options = { 32 | readOnly: true, 33 | modules: { 34 | toolbar: '#toolbar' 35 | } 36 | } 37 | 38 | new Quill(article, options) 39 | 40 | setTimeout(() => { contentContainer.current.appendChild(article) }, 0) 41 | } 42 | },[data]) 43 | 44 | return ( 45 |
46 | 47 |
48 |
49 | ) 50 | } -------------------------------------------------------------------------------- /src/pages/web-dev.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {useQuery} from '@apollo/react-hooks' 3 | 4 | import withTitle from '../components/common/with-title' 5 | import PostGrid from '../components/common/post-grid' 6 | import {GET_POSTS_BY_CATEGORIES_QUERY} from '../queries/posts' 7 | 8 | const catIds = [1,2,3,4,5,9] 9 | 10 | export default function WebDev ({history}) { 11 | const {data, error} = useQuery(GET_POSTS_BY_CATEGORIES_QUERY, { 12 | variables: { 13 | cat_ids: catIds 14 | } 15 | }) 16 | 17 | if (error) { 18 | console.log(error) 19 | return 'Something went wrong.' 20 | } 21 | 22 | return withTitle( 23 | 'Web Development', 24 | data?.posts 25 | ? 26 | : 'Loading' 27 | 28 | ) 29 | } -------------------------------------------------------------------------------- /src/queries/posts/index.js: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag' 2 | 3 | export const GET_POSTS_BY_CATEGORIES_QUERY = gql` 4 | query GetBlogPostsByCategories($cat_ids: [Int]) { 5 | posts: getPostsByCategories(cat_ids: $cat_ids) { 6 | id 7 | title 8 | description 9 | updated_at 10 | author 11 | image 12 | categories 13 | } 14 | } 15 | ` 16 | 17 | export const GET_POST_QUERY = gql` 18 | query GetPostQuery($id: ID!) { 19 | post: getPost(id: $id) { 20 | id 21 | author 22 | title 23 | text 24 | keyword1 25 | keyword2 26 | description 27 | image 28 | bg_src 29 | bg_type 30 | updated_at 31 | } 32 | } 33 | ` 34 | 35 | -------------------------------------------------------------------------------- /src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read https://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.0/8 are considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl, { 104 | headers: { 'Service-Worker': 'script' }, 105 | }) 106 | .then(response => { 107 | // Ensure service worker exists, and that we really are getting a JS file. 108 | const contentType = response.headers.get('content-type'); 109 | if ( 110 | response.status === 404 || 111 | (contentType != null && contentType.indexOf('javascript') === -1) 112 | ) { 113 | // No service worker found. Probably a different app. Reload the page. 114 | navigator.serviceWorker.ready.then(registration => { 115 | registration.unregister().then(() => { 116 | window.location.reload(); 117 | }); 118 | }); 119 | } else { 120 | // Service worker found. Proceed as normal. 121 | registerValidSW(swUrl, config); 122 | } 123 | }) 124 | .catch(() => { 125 | console.log( 126 | 'No internet connection found. App is running in offline mode.' 127 | ); 128 | }); 129 | } 130 | 131 | export function unregister() { 132 | if ('serviceWorker' in navigator) { 133 | navigator.serviceWorker.ready 134 | .then(registration => { 135 | registration.unregister(); 136 | }) 137 | .catch(error => { 138 | console.error(error.message); 139 | }); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom/extend-expect'; 6 | -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | export type Post = { 2 | title: string; 3 | date: string; 4 | categories: Array; 5 | link: string; 6 | image: string; 7 | author: string; 8 | style?: Record; 9 | }; 10 | --------------------------------------------------------------------------------