├── .gitignore ├── LICENSE.txt ├── README.md ├── package.json ├── public ├── favicon.ico ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json └── robots.txt ├── server ├── .gitignore ├── README.md ├── package.json ├── prisma │ ├── dev.db │ ├── migrations │ │ ├── 20220119075639_init │ │ │ └── migration.sql │ │ └── migration_lock.toml │ └── schema.prisma ├── src │ ├── index.js │ ├── resolvers │ │ ├── Link.js │ │ ├── Mutation.js │ │ ├── Query.js │ │ ├── Subscription.js │ │ ├── User.js │ │ └── Vote.js │ ├── schema.graphql │ └── utils.js └── yarn.lock ├── src ├── components │ ├── App.js │ ├── CreateLink.js │ ├── Header.js │ ├── Link.js │ ├── LinkList.js │ ├── Login.js │ └── Search.js ├── constants.js ├── index.js ├── logo.svg ├── reportWebVitals.js ├── setupTests.js ├── styles │ ├── App.css │ └── index.css └── utils.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | .idea 3 | .code 4 | 5 | # dependencies 6 | /node_modules 7 | /server/node_modules 8 | /.pnp 9 | .pnp.js 10 | 11 | # testing 12 | /coverage 13 | 14 | # production 15 | /build 16 | 17 | # misc 18 | .DS_Store 19 | .env.local 20 | .env.development.local 21 | .env.test.local 22 | .env.production.local 23 | 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2018] [Graphcool] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React & Apollo Tutorial 2 | 3 | This is the sample project that belongs to the [React & Apollo Tutorial](https://www.howtographql.com/react-apollo/0-introduction/) on How to GraphQL. 4 | 5 | ## How to use 6 | 7 | ### 1. Clone repository 8 | 9 | ```sh 10 | git clone https://github.com/howtographql/react-apollo/ 11 | ``` 12 | 13 | 14 | ### 2. Start the backend server 15 | 16 | Go to the `server` folder, install dependencies and start the server. 17 | 18 | ```sh 19 | cd react-apollo/server 20 | yarn install 21 | yarn dev 22 | ``` 23 | 24 | > **Note**: If you want to interact with the GraphQL API of the server inside a [GraphQL Playground](https://github.com/prisma/graphql-playground), you can navigate to [http://localhost:4000](http://localhost:4000). 25 | 26 | 27 | ### 3. Run the app 28 | 29 | Now that the server is running, you can start the React app as well. The commands need to be run in a new terminal tab/window inside the root directory `react-apollo` (because the current tab is blocked by the process running the server): 30 | 31 | ```sh 32 | yarn install 33 | yarn start 34 | ``` 35 | 36 | You can now open your browser and use the app on [http://localhost:3000](http://localhost:3000). 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hackernews-react-apollo-follow-along", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@apollo/client": "^3.5.7", 7 | "@testing-library/jest-dom": "^5.14.1", 8 | "@testing-library/react": "^12.0.0", 9 | "@testing-library/user-event": "^13.2.1", 10 | "graphql": "^16.2.0", 11 | "react": "^17.0.2", 12 | "react-dom": "^17.0.2", 13 | "react-router-dom": "^6.2.1", 14 | "react-scripts": "5.0.0", 15 | "subscriptions-transport-ws": "^0.11.0", 16 | "web-vitals": "^2.1.0" 17 | }, 18 | "scripts": { 19 | "start": "react-scripts start", 20 | "build": "react-scripts build", 21 | "test": "react-scripts test", 22 | "eject": "react-scripts eject" 23 | }, 24 | "eslintConfig": { 25 | "extends": [ 26 | "react-app", 27 | "react-app/jest" 28 | ] 29 | }, 30 | "browserslist": { 31 | "production": [ 32 | ">0.2%", 33 | "not dead", 34 | "not op_mini all" 35 | ], 36 | "development": [ 37 | "last 1 chrome version", 38 | "last 1 firefox version", 39 | "last 1 safari version" 40 | ] 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howtographql/react-apollo/30b57fe8d1a654fc701e30d5b94aef4b5196a601/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | 31 | React App 32 | 33 | 34 | 35 |
36 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howtographql/react-apollo/30b57fe8d1a654fc701e30d5b94aef4b5196a601/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howtographql/react-apollo/30b57fe8d1a654fc701e30d5b94aef4b5196a601/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 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | .env* 2 | dist 3 | package-lock.json 4 | node_modules 5 | .idea 6 | .vscode 7 | *.log -------------------------------------------------------------------------------- /server/README.md: -------------------------------------------------------------------------------- 1 | # hackernews-graphql-js 2 | 3 | This repository contains the final project for the [**GraphQL.js tutorial**](https://www.howtographql.com/graphql-js/0-introduction/) on [How to GraphQL](https://www.howtographql.com/). Note that it also serves as foundation for all frontend tutorials on the site. 4 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hackernews-node", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "start": "node src/index.js", 7 | "dev": "nodemon src/index.js" 8 | }, 9 | "dependencies": { 10 | "@prisma/client": "^3.7.0", 11 | "apollo-server": "^2.19.0", 12 | "bcryptjs": "2.4.3", 13 | "jsonwebtoken": "8.5.1" 14 | }, 15 | "devDependencies": { 16 | "prisma": "^3.7.0", 17 | "nodemon": "^2.0.6" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /server/prisma/dev.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/howtographql/react-apollo/30b57fe8d1a654fc701e30d5b94aef4b5196a601/server/prisma/dev.db -------------------------------------------------------------------------------- /server/prisma/migrations/20220119075639_init/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "Link" ( 3 | "id" TEXT NOT NULL PRIMARY KEY, 4 | "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, 5 | "description" TEXT NOT NULL, 6 | "url" TEXT NOT NULL, 7 | "postedById" TEXT, 8 | CONSTRAINT "Link_postedById_fkey" FOREIGN KEY ("postedById") REFERENCES "User" ("id") ON DELETE SET NULL ON UPDATE CASCADE 9 | ); 10 | 11 | -- CreateTable 12 | CREATE TABLE "User" ( 13 | "id" TEXT NOT NULL PRIMARY KEY, 14 | "name" TEXT NOT NULL, 15 | "email" TEXT NOT NULL, 16 | "password" TEXT NOT NULL 17 | ); 18 | 19 | -- CreateTable 20 | CREATE TABLE "Vote" ( 21 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 22 | "linkId" TEXT NOT NULL, 23 | "userId" TEXT NOT NULL, 24 | CONSTRAINT "Vote_linkId_fkey" FOREIGN KEY ("linkId") REFERENCES "Link" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, 25 | CONSTRAINT "Vote_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE 26 | ); 27 | 28 | -- CreateIndex 29 | CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); 30 | 31 | -- CreateIndex 32 | CREATE UNIQUE INDEX "Vote_linkId_userId_key" ON "Vote"("linkId", "userId"); 33 | -------------------------------------------------------------------------------- /server/prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "sqlite" -------------------------------------------------------------------------------- /server/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | datasource db { 2 | provider = "sqlite" 3 | url = "file:./dev.db" 4 | } 5 | 6 | generator client { 7 | provider = "prisma-client-js" 8 | } 9 | 10 | model Link { 11 | id String @id @default(uuid()) 12 | createdAt DateTime @default(now()) 13 | description String 14 | url String 15 | postedBy User? @relation(fields: [postedById], references: [id]) 16 | postedById String? 17 | votes Vote[] 18 | } 19 | 20 | model User { 21 | id String @id @default(uuid()) 22 | name String 23 | email String @unique 24 | password String 25 | links Link[] 26 | votes Vote[] 27 | } 28 | 29 | model Vote { 30 | id Int @id @default(autoincrement()) 31 | link Link @relation(fields: [linkId], references: [id]) 32 | linkId String 33 | user User @relation(fields: [userId], references: [id]) 34 | userId String 35 | 36 | @@unique([linkId, userId]) 37 | } 38 | -------------------------------------------------------------------------------- /server/src/index.js: -------------------------------------------------------------------------------- 1 | const {ApolloServer, PubSub} = require('apollo-server'); 2 | const {PrismaClient} = require('@prisma/client'); 3 | const Query = require('./resolvers/Query'); 4 | const Mutation = require('./resolvers/Mutation'); 5 | const Subscription = require('./resolvers/Subscription'); 6 | const User = require('./resolvers/User'); 7 | const Link = require('./resolvers/Link'); 8 | const Vote = require('./resolvers/Vote'); 9 | const fs = require('fs'); 10 | const path = require('path'); 11 | const {getUserId} = require('./utils'); 12 | 13 | const pubsub = new PubSub(); 14 | 15 | const prisma = new PrismaClient({ 16 | errorFormat: 'minimal' 17 | }); 18 | 19 | const resolvers = { 20 | Query, 21 | Mutation, 22 | Subscription, 23 | User, 24 | Link, 25 | Vote 26 | }; 27 | 28 | const server = new ApolloServer({ 29 | typeDefs: fs.readFileSync( 30 | path.join(__dirname, 'schema.graphql'), 31 | 'utf8' 32 | ), 33 | resolvers, 34 | context: ({req}) => { 35 | return { 36 | ...req, 37 | prisma, 38 | pubsub, 39 | userId: 40 | req && req.headers.authorization 41 | ? getUserId(req) 42 | : null 43 | }; 44 | }, 45 | subscriptions: { 46 | onConnect: (connectionParams) => { 47 | if (connectionParams.authToken) { 48 | return { 49 | prisma, 50 | userId: getUserId( 51 | null, 52 | connectionParams.authToken 53 | ) 54 | }; 55 | } else { 56 | return { 57 | prisma 58 | }; 59 | } 60 | } 61 | } 62 | }); 63 | 64 | server 65 | .listen() 66 | .then(({url}) => 67 | console.log(`Server is running on ${url}`) 68 | ); 69 | -------------------------------------------------------------------------------- /server/src/resolvers/Link.js: -------------------------------------------------------------------------------- 1 | function postedBy(parent, args, context) { 2 | return context.prisma.link 3 | .findUnique({where: {id: parent.id}}) 4 | .postedBy(); 5 | } 6 | 7 | function votes(parent, args, context) { 8 | return context.prisma.link 9 | .findUnique({where: {id: parent.id}}) 10 | .votes(); 11 | } 12 | 13 | module.exports = { 14 | postedBy, 15 | votes 16 | }; 17 | -------------------------------------------------------------------------------- /server/src/resolvers/Mutation.js: -------------------------------------------------------------------------------- 1 | const bcrypt = require('bcryptjs'); 2 | const jwt = require('jsonwebtoken'); 3 | const {APP_SECRET} = require('../utils'); 4 | 5 | async function post(parent, args, context, info) { 6 | const {userId} = context; 7 | 8 | let postedBy = undefined 9 | if (userId) { 10 | postedBy = {connect: {id: userId}} 11 | } 12 | 13 | const newLink = await context.prisma.link.create({ 14 | data: { 15 | url: args.url, 16 | description: args.description, 17 | postedBy 18 | } 19 | }); 20 | 21 | context.pubsub.publish('NEW_LINK', newLink); 22 | 23 | return newLink; 24 | } 25 | 26 | async function signup(parent, args, context, info) { 27 | const password = await bcrypt.hash(args.password, 10); 28 | const user = await context.prisma.user.create({ 29 | data: {...args, password} 30 | }); 31 | 32 | const token = jwt.sign({userId: user.id}, APP_SECRET); 33 | 34 | return { 35 | token, 36 | user 37 | }; 38 | } 39 | 40 | async function login(parent, args, context, info) { 41 | const user = await context.prisma.user.findUnique({ 42 | where: {email: args.email} 43 | }); 44 | if (!user) { 45 | throw new Error('No such user found'); 46 | } 47 | 48 | const valid = await bcrypt.compare( 49 | args.password, 50 | user.password 51 | ); 52 | if (!valid) { 53 | throw new Error('Invalid password'); 54 | } 55 | 56 | const token = jwt.sign({userId: user.id}, APP_SECRET); 57 | 58 | return { 59 | token, 60 | user 61 | }; 62 | } 63 | 64 | async function vote(parent, args, context, info) { 65 | const {userId} = context; 66 | 67 | const vote = await context.prisma.vote.findUnique({ 68 | where: { 69 | linkId_userId: { 70 | linkId: args.linkId, 71 | userId: userId 72 | } 73 | } 74 | }); 75 | 76 | if (Boolean(vote)) { 77 | throw new Error( 78 | `Already voted for link: ${args.linkId}` 79 | ); 80 | } 81 | 82 | const newVote = context.prisma.vote.create({ 83 | data: { 84 | user: {connect: {id: userId}}, 85 | link: {connect: {id: args.linkId}} 86 | } 87 | }); 88 | context.pubsub.publish('NEW_VOTE', newVote); 89 | 90 | return newVote; 91 | } 92 | 93 | module.exports = { 94 | post, 95 | signup, 96 | login, 97 | vote 98 | }; 99 | -------------------------------------------------------------------------------- /server/src/resolvers/Query.js: -------------------------------------------------------------------------------- 1 | async function feed(parent, args, context, info) { 2 | const where = args.filter 3 | ? { 4 | OR: [ 5 | {description: {contains: args.filter}}, 6 | {url: {contains: args.filter}} 7 | ] 8 | } 9 | : {}; 10 | 11 | const links = await context.prisma.link.findMany({ 12 | where, 13 | skip: args.skip, 14 | take: args.take, 15 | orderBy: args.orderBy 16 | }); 17 | 18 | const count = await context.prisma.link.count({where}); 19 | 20 | return { 21 | id: `main-feed:${JSON.stringify(args)}`, 22 | links, 23 | count 24 | }; 25 | } 26 | 27 | module.exports = { 28 | feed 29 | }; 30 | -------------------------------------------------------------------------------- /server/src/resolvers/Subscription.js: -------------------------------------------------------------------------------- 1 | function newLinkSubscribe(parent, args, context, info) { 2 | return context.pubsub.asyncIterator("NEW_LINK") 3 | } 4 | 5 | const newLink = { 6 | subscribe: newLinkSubscribe, 7 | resolve: payload => { 8 | return payload 9 | }, 10 | } 11 | 12 | function newVoteSubscribe(parent, args, context, info) { 13 | return context.pubsub.asyncIterator("NEW_VOTE") 14 | } 15 | 16 | const newVote = { 17 | subscribe: newVoteSubscribe, 18 | resolve: payload => { 19 | return payload 20 | }, 21 | } 22 | 23 | module.exports = { 24 | newLink, 25 | newVote 26 | } -------------------------------------------------------------------------------- /server/src/resolvers/User.js: -------------------------------------------------------------------------------- 1 | function links(parent, args, context) { 2 | return context.prisma.user 3 | .findUnique({where: {id: parent.id}}) 4 | .links(); 5 | } 6 | 7 | module.exports = { 8 | links 9 | }; 10 | -------------------------------------------------------------------------------- /server/src/resolvers/Vote.js: -------------------------------------------------------------------------------- 1 | function link(parent, args, context) { 2 | return context.prisma.vote 3 | .findUnique({where: {id: parent.id}}) 4 | .link(); 5 | } 6 | 7 | function user(parent, args, context) { 8 | return context.prisma.vote 9 | .findUnique({where: {id: parent.id}}) 10 | .user(); 11 | } 12 | 13 | module.exports = { 14 | link, 15 | user 16 | }; 17 | -------------------------------------------------------------------------------- /server/src/schema.graphql: -------------------------------------------------------------------------------- 1 | type Query { 2 | info: String! 3 | feed( 4 | filter: String 5 | skip: Int 6 | take: Int 7 | orderBy: LinkOrderByInput 8 | ): Feed! 9 | } 10 | 11 | type Feed { 12 | id: ID! 13 | links: [Link!]! 14 | count: Int! 15 | } 16 | 17 | type Mutation { 18 | post(url: String!, description: String!): Link! 19 | signup( 20 | email: String! 21 | password: String! 22 | name: String! 23 | ): AuthPayload 24 | login(email: String!, password: String!): AuthPayload 25 | vote(linkId: ID!): Vote 26 | } 27 | 28 | type Subscription { 29 | newLink: Link 30 | newVote: Vote 31 | } 32 | 33 | type AuthPayload { 34 | token: String 35 | user: User 36 | } 37 | 38 | type User { 39 | id: ID! 40 | name: String! 41 | email: String! 42 | links: [Link!]! 43 | } 44 | 45 | type Link { 46 | id: ID! 47 | description: String! 48 | url: String! 49 | postedBy: User 50 | votes: [Vote!]! 51 | createdAt: DateTime! 52 | } 53 | 54 | type Vote { 55 | id: ID! 56 | link: Link! 57 | user: User! 58 | } 59 | 60 | input LinkOrderByInput { 61 | description: Sort 62 | url: Sort 63 | createdAt: Sort 64 | } 65 | 66 | enum Sort { 67 | asc 68 | desc 69 | } 70 | 71 | scalar DateTime 72 | -------------------------------------------------------------------------------- /server/src/utils.js: -------------------------------------------------------------------------------- 1 | const jwt = require('jsonwebtoken'); 2 | const APP_SECRET = 'GraphQL-is-aw3some'; 3 | 4 | function getTokenPayload(token) { 5 | return jwt.verify(token, APP_SECRET); 6 | } 7 | 8 | function getUserId(req, authToken) { 9 | if (req) { 10 | const authHeader = req.headers.authorization; 11 | if (authHeader) { 12 | const token = authHeader.replace('Bearer ', ''); 13 | if (!token) { 14 | throw new Error('No token found'); 15 | } 16 | const {userId} = getTokenPayload(token); 17 | return userId; 18 | } 19 | } else if (authToken) { 20 | const {userId} = getTokenPayload(authToken); 21 | return userId; 22 | } 23 | 24 | throw new Error('Not authenticated'); 25 | } 26 | 27 | module.exports = { 28 | APP_SECRET, 29 | getUserId 30 | }; 31 | -------------------------------------------------------------------------------- /server/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@apollo/protobufjs@^1.0.3": 6 | "integrity" "sha512-ZtyaBH1icCgqwIGb3zrtopV2D5Q8yxibkJzlaViM08eOhTQc7rACdYu0pfORFfhllvdMZ3aq69vifYHszY4gNA==" 7 | "resolved" "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.0.5.tgz" 8 | "version" "1.0.5" 9 | dependencies: 10 | "@protobufjs/aspromise" "^1.1.2" 11 | "@protobufjs/base64" "^1.1.2" 12 | "@protobufjs/codegen" "^2.0.4" 13 | "@protobufjs/eventemitter" "^1.1.0" 14 | "@protobufjs/fetch" "^1.1.0" 15 | "@protobufjs/float" "^1.0.2" 16 | "@protobufjs/inquire" "^1.1.0" 17 | "@protobufjs/path" "^1.1.2" 18 | "@protobufjs/pool" "^1.1.0" 19 | "@protobufjs/utf8" "^1.1.0" 20 | "@types/long" "^4.0.0" 21 | "@types/node" "^10.1.0" 22 | "long" "^4.0.0" 23 | 24 | "@apollographql/apollo-tools@^0.4.3": 25 | "integrity" "sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA==" 26 | "resolved" "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz" 27 | "version" "0.4.8" 28 | dependencies: 29 | "apollo-env" "^0.6.5" 30 | 31 | "@apollographql/graphql-playground-html@1.6.26": 32 | "integrity" "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==" 33 | "resolved" "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz" 34 | "version" "1.6.26" 35 | dependencies: 36 | "xss" "^1.0.6" 37 | 38 | "@prisma/client@^3.7.0": 39 | "integrity" "sha512-NxD1Xbkx1eT1mxSwo1RwZe665mqBETs0VxohuwNfFIxMqcp0g6d4TgugPxwZ4Jb4e5wCu8mQ9quMedhNWIWcZQ==" 40 | "resolved" "https://registry.npmjs.org/@prisma/client/-/client-3.8.1.tgz" 41 | "version" "3.8.1" 42 | dependencies: 43 | "@prisma/engines-version" "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" 44 | 45 | "@prisma/engines-version@3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f": 46 | "integrity" "sha512-G2JH6yWt6ixGKmsRmVgaQYahfwMopim0u/XLIZUo2o/mZ5jdu7+BL+2V5lZr7XiG1axhyrpvlyqE/c0OgYSl3g==" 47 | "resolved" "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f.tgz" 48 | "version" "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" 49 | 50 | "@prisma/engines@3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f": 51 | "integrity" "sha512-bHYubuItSN/DGYo36aDu7xJiJmK52JOSHs4MK+KbceAtwS20BCWadRgtpQ3iZ2EXfN/B1T0iCXlNraaNwnpU2w==" 52 | "resolved" "https://registry.npmjs.org/@prisma/engines/-/engines-3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f.tgz" 53 | "version" "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" 54 | 55 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 56 | "integrity" "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 57 | "resolved" "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" 58 | "version" "1.1.2" 59 | 60 | "@protobufjs/base64@^1.1.2": 61 | "integrity" "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 62 | "resolved" "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" 63 | "version" "1.1.2" 64 | 65 | "@protobufjs/codegen@^2.0.4": 66 | "integrity" "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 67 | "resolved" "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" 68 | "version" "2.0.4" 69 | 70 | "@protobufjs/eventemitter@^1.1.0": 71 | "integrity" "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 72 | "resolved" "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" 73 | "version" "1.1.0" 74 | 75 | "@protobufjs/fetch@^1.1.0": 76 | "integrity" "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=" 77 | "resolved" "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" 78 | "version" "1.1.0" 79 | dependencies: 80 | "@protobufjs/aspromise" "^1.1.1" 81 | "@protobufjs/inquire" "^1.1.0" 82 | 83 | "@protobufjs/float@^1.0.2": 84 | "integrity" "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 85 | "resolved" "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" 86 | "version" "1.0.2" 87 | 88 | "@protobufjs/inquire@^1.1.0": 89 | "integrity" "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 90 | "resolved" "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" 91 | "version" "1.1.0" 92 | 93 | "@protobufjs/path@^1.1.2": 94 | "integrity" "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 95 | "resolved" "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" 96 | "version" "1.1.2" 97 | 98 | "@protobufjs/pool@^1.1.0": 99 | "integrity" "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 100 | "resolved" "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" 101 | "version" "1.1.0" 102 | 103 | "@protobufjs/utf8@^1.1.0": 104 | "integrity" "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 105 | "resolved" "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" 106 | "version" "1.1.0" 107 | 108 | "@sindresorhus/is@^0.14.0": 109 | "integrity" "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" 110 | "resolved" "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" 111 | "version" "0.14.0" 112 | 113 | "@szmarczak/http-timer@^1.1.2": 114 | "integrity" "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==" 115 | "resolved" "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" 116 | "version" "1.1.2" 117 | dependencies: 118 | "defer-to-connect" "^1.0.1" 119 | 120 | "@types/accepts@*", "@types/accepts@^1.3.5": 121 | "integrity" "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==" 122 | "resolved" "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz" 123 | "version" "1.3.5" 124 | dependencies: 125 | "@types/node" "*" 126 | 127 | "@types/body-parser@*", "@types/body-parser@1.19.0": 128 | "integrity" "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==" 129 | "resolved" "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz" 130 | "version" "1.19.0" 131 | dependencies: 132 | "@types/connect" "*" 133 | "@types/node" "*" 134 | 135 | "@types/connect@*": 136 | "integrity" "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==" 137 | "resolved" "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz" 138 | "version" "3.4.33" 139 | dependencies: 140 | "@types/node" "*" 141 | 142 | "@types/content-disposition@*": 143 | "integrity" "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==" 144 | "resolved" "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz" 145 | "version" "0.5.3" 146 | 147 | "@types/cookies@*": 148 | "integrity" "sha512-3+TAFSm78O7/bAeYdB8FoYGntuT87vVP9JKuQRL8sRhv9313LP2SpHHL50VeFtnyjIcb3UELddMk5Yt0eOSOkg==" 149 | "resolved" "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.5.tgz" 150 | "version" "0.7.5" 151 | dependencies: 152 | "@types/connect" "*" 153 | "@types/express" "*" 154 | "@types/keygrip" "*" 155 | "@types/node" "*" 156 | 157 | "@types/cors@2.8.8": 158 | "integrity" "sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w==" 159 | "resolved" "https://registry.npmjs.org/@types/cors/-/cors-2.8.8.tgz" 160 | "version" "2.8.8" 161 | dependencies: 162 | "@types/express" "*" 163 | 164 | "@types/express-serve-static-core@*": 165 | "integrity" "sha512-uFTLwu94TfUFMToXNgRZikwPuZdOtDgs3syBtAIr/OXorL1kJqUJT9qCLnRZ5KBOWfZQikQ2xKgR2tnDj1OgDA==" 166 | "resolved" "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.14.tgz" 167 | "version" "4.17.14" 168 | dependencies: 169 | "@types/node" "*" 170 | "@types/qs" "*" 171 | "@types/range-parser" "*" 172 | 173 | "@types/express-serve-static-core@4.17.13": 174 | "integrity" "sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA==" 175 | "resolved" "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz" 176 | "version" "4.17.13" 177 | dependencies: 178 | "@types/node" "*" 179 | "@types/qs" "*" 180 | "@types/range-parser" "*" 181 | 182 | "@types/express@*": 183 | "integrity" "sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw==" 184 | "resolved" "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz" 185 | "version" "4.17.9" 186 | dependencies: 187 | "@types/body-parser" "*" 188 | "@types/express-serve-static-core" "*" 189 | "@types/qs" "*" 190 | "@types/serve-static" "*" 191 | 192 | "@types/express@4.17.7": 193 | "integrity" "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==" 194 | "resolved" "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz" 195 | "version" "4.17.7" 196 | dependencies: 197 | "@types/body-parser" "*" 198 | "@types/express-serve-static-core" "*" 199 | "@types/qs" "*" 200 | "@types/serve-static" "*" 201 | 202 | "@types/fs-capacitor@*": 203 | "integrity" "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==" 204 | "resolved" "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz" 205 | "version" "2.0.0" 206 | dependencies: 207 | "@types/node" "*" 208 | 209 | "@types/graphql-upload@^8.0.0": 210 | "integrity" "sha512-0TRyJD2o8vbkmJF8InppFcPVcXKk+Rvlg/xvpHBIndSJYpmDWfmtx/ZAtl4f3jR2vfarpTqYgj8MZuJssSoU7Q==" 211 | "resolved" "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-8.0.4.tgz" 212 | "version" "8.0.4" 213 | dependencies: 214 | "@types/express" "*" 215 | "@types/fs-capacitor" "*" 216 | "@types/koa" "*" 217 | "graphql" "^15.3.0" 218 | 219 | "@types/http-assert@*": 220 | "integrity" "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==" 221 | "resolved" "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz" 222 | "version" "1.5.1" 223 | 224 | "@types/http-errors@*": 225 | "integrity" "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==" 226 | "resolved" "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz" 227 | "version" "1.8.0" 228 | 229 | "@types/keygrip@*": 230 | "integrity" "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" 231 | "resolved" "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz" 232 | "version" "1.0.2" 233 | 234 | "@types/koa-compose@*": 235 | "integrity" "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==" 236 | "resolved" "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz" 237 | "version" "3.2.5" 238 | dependencies: 239 | "@types/koa" "*" 240 | 241 | "@types/koa@*": 242 | "integrity" "sha512-BhyrMj06eQkk04C97fovEDQMpLpd2IxCB4ecitaXwOKGq78Wi2tooaDOWOFGajPk8IkQOAtMppApgSVkYe1F/A==" 243 | "resolved" "https://registry.npmjs.org/@types/koa/-/koa-2.11.6.tgz" 244 | "version" "2.11.6" 245 | dependencies: 246 | "@types/accepts" "*" 247 | "@types/content-disposition" "*" 248 | "@types/cookies" "*" 249 | "@types/http-assert" "*" 250 | "@types/http-errors" "*" 251 | "@types/keygrip" "*" 252 | "@types/koa-compose" "*" 253 | "@types/node" "*" 254 | 255 | "@types/long@^4.0.0": 256 | "integrity" "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 257 | "resolved" "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz" 258 | "version" "4.0.1" 259 | 260 | "@types/mime@*": 261 | "integrity" "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==" 262 | "resolved" "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz" 263 | "version" "2.0.3" 264 | 265 | "@types/node-fetch@2.5.7": 266 | "integrity" "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==" 267 | "resolved" "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz" 268 | "version" "2.5.7" 269 | dependencies: 270 | "@types/node" "*" 271 | "form-data" "^3.0.0" 272 | 273 | "@types/node@*": 274 | "integrity" "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==" 275 | "resolved" "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz" 276 | "version" "14.14.10" 277 | 278 | "@types/node@^10.1.0": 279 | "integrity" "sha512-YZ1mMAdUPouBZCdeugjV8y1tqqr28OyL8DYbH5ePCfe9zcXtvbh1wDBy7uzlHkXo3Qi07kpzXfvycvrkby/jXw==" 280 | "resolved" "https://registry.npmjs.org/@types/node/-/node-10.17.47.tgz" 281 | "version" "10.17.47" 282 | 283 | "@types/qs@*": 284 | "integrity" "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" 285 | "resolved" "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz" 286 | "version" "6.9.5" 287 | 288 | "@types/range-parser@*": 289 | "integrity" "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 290 | "resolved" "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz" 291 | "version" "1.2.3" 292 | 293 | "@types/serve-static@*": 294 | "integrity" "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==" 295 | "resolved" "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz" 296 | "version" "1.13.8" 297 | dependencies: 298 | "@types/mime" "*" 299 | "@types/node" "*" 300 | 301 | "@types/ws@^7.0.0": 302 | "integrity" "sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw==" 303 | "resolved" "https://registry.npmjs.org/@types/ws/-/ws-7.4.0.tgz" 304 | "version" "7.4.0" 305 | dependencies: 306 | "@types/node" "*" 307 | 308 | "@wry/equality@^0.1.2": 309 | "integrity" "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==" 310 | "resolved" "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz" 311 | "version" "0.1.11" 312 | dependencies: 313 | "tslib" "^1.9.3" 314 | 315 | "abbrev@1": 316 | "integrity" "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 317 | "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" 318 | "version" "1.1.1" 319 | 320 | "accepts@^1.3.5", "accepts@~1.3.7": 321 | "integrity" "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==" 322 | "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" 323 | "version" "1.3.7" 324 | dependencies: 325 | "mime-types" "~2.1.24" 326 | "negotiator" "0.6.2" 327 | 328 | "ansi-align@^3.0.0": 329 | "integrity" "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==" 330 | "resolved" "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz" 331 | "version" "3.0.0" 332 | dependencies: 333 | "string-width" "^3.0.0" 334 | 335 | "ansi-regex@^4.1.0": 336 | "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 337 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" 338 | "version" "4.1.0" 339 | 340 | "ansi-regex@^5.0.0": 341 | "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 342 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" 343 | "version" "5.0.0" 344 | 345 | "ansi-styles@^4.1.0": 346 | "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" 347 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 348 | "version" "4.3.0" 349 | dependencies: 350 | "color-convert" "^2.0.1" 351 | 352 | "anymatch@~3.1.1": 353 | "integrity" "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==" 354 | "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" 355 | "version" "3.1.1" 356 | dependencies: 357 | "normalize-path" "^3.0.0" 358 | "picomatch" "^2.0.4" 359 | 360 | "apollo-cache-control@^0.11.4": 361 | "integrity" "sha512-FUKE8ASr8GxVq5rmky/tY8bsf++cleGT591lfLiqnPsP1fo3kAfgRfWA2QRHTCKFNlQxzUhVOEDv+PaysqiOjw==" 362 | "resolved" "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.4.tgz" 363 | "version" "0.11.4" 364 | dependencies: 365 | "apollo-server-env" "^2.4.5" 366 | "apollo-server-plugin-base" "^0.10.2" 367 | 368 | "apollo-datasource@^0.7.2": 369 | "integrity" "sha512-ibnW+s4BMp4K2AgzLEtvzkjg7dJgCaw9M5b5N0YKNmeRZRnl/I/qBTQae648FsRKgMwTbRQIvBhQ0URUFAqFOw==" 370 | "resolved" "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.2.tgz" 371 | "version" "0.7.2" 372 | dependencies: 373 | "apollo-server-caching" "^0.5.2" 374 | "apollo-server-env" "^2.4.5" 375 | 376 | "apollo-env@^0.6.5": 377 | "integrity" "sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg==" 378 | "resolved" "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.5.tgz" 379 | "version" "0.6.5" 380 | dependencies: 381 | "@types/node-fetch" "2.5.7" 382 | "core-js" "^3.0.1" 383 | "node-fetch" "^2.2.0" 384 | "sha.js" "^2.4.11" 385 | 386 | "apollo-graphql@^0.6.0": 387 | "integrity" "sha512-BxTf5LOQe649e9BNTPdyCGItVv4Ll8wZ2BKnmiYpRAocYEXAVrQPWuSr3dO4iipqAU8X0gvle/Xu9mSqg5b7Qg==" 388 | "resolved" "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.6.0.tgz" 389 | "version" "0.6.0" 390 | dependencies: 391 | "apollo-env" "^0.6.5" 392 | "lodash.sortby" "^4.7.0" 393 | 394 | "apollo-link@^1.2.14": 395 | "integrity" "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==" 396 | "resolved" "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz" 397 | "version" "1.2.14" 398 | dependencies: 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 | "apollo-reporting-protobuf@^0.6.1": 405 | "integrity" "sha512-qr4DheFP154PGZsd93SSIS9RkqHnR5b6vT+eCloWjy3UIpY+yZ3cVLlttlIjYvOG4xTJ25XEwcHiAExatQo/7g==" 406 | "resolved" "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.1.tgz" 407 | "version" "0.6.1" 408 | dependencies: 409 | "@apollo/protobufjs" "^1.0.3" 410 | 411 | "apollo-server-caching@^0.5.2": 412 | "integrity" "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==" 413 | "resolved" "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz" 414 | "version" "0.5.2" 415 | dependencies: 416 | "lru-cache" "^5.0.0" 417 | 418 | "apollo-server-core@^2.19.0": 419 | "integrity" "sha512-2aMKUVPyNbomJQaG2tkpfqvp1Tfgxgkdr7nX5zHudYNSzsPrHw+CcYlCbIVFFI/mTZsjoK9czNq1qerFRxZbJw==" 420 | "resolved" "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.19.0.tgz" 421 | "version" "2.19.0" 422 | dependencies: 423 | "@apollographql/apollo-tools" "^0.4.3" 424 | "@apollographql/graphql-playground-html" "1.6.26" 425 | "@types/graphql-upload" "^8.0.0" 426 | "@types/ws" "^7.0.0" 427 | "apollo-cache-control" "^0.11.4" 428 | "apollo-datasource" "^0.7.2" 429 | "apollo-graphql" "^0.6.0" 430 | "apollo-reporting-protobuf" "^0.6.1" 431 | "apollo-server-caching" "^0.5.2" 432 | "apollo-server-env" "^2.4.5" 433 | "apollo-server-errors" "^2.4.2" 434 | "apollo-server-plugin-base" "^0.10.2" 435 | "apollo-server-types" "^0.6.1" 436 | "apollo-tracing" "^0.12.0" 437 | "async-retry" "^1.2.1" 438 | "fast-json-stable-stringify" "^2.0.0" 439 | "graphql-extensions" "^0.12.6" 440 | "graphql-tag" "^2.9.2" 441 | "graphql-tools" "^4.0.0" 442 | "graphql-upload" "^8.0.2" 443 | "loglevel" "^1.6.7" 444 | "lru-cache" "^5.0.0" 445 | "sha.js" "^2.4.11" 446 | "subscriptions-transport-ws" "^0.9.11" 447 | "uuid" "^8.0.0" 448 | "ws" "^6.0.0" 449 | 450 | "apollo-server-env@^2.4.5": 451 | "integrity" "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==" 452 | "resolved" "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz" 453 | "version" "2.4.5" 454 | dependencies: 455 | "node-fetch" "^2.1.2" 456 | "util.promisify" "^1.0.0" 457 | 458 | "apollo-server-errors@^2.4.2": 459 | "integrity" "sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ==" 460 | "resolved" "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz" 461 | "version" "2.4.2" 462 | 463 | "apollo-server-express@^2.19.0": 464 | "integrity" "sha512-3rgSrTme1SlLoecAYtSa8ThH6vYvz29QecgZCigq5Vdc6bFP2SZrCk0ls6BAdD8OZbVKUtizzRxd0yd/uREPAw==" 465 | "resolved" "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.19.0.tgz" 466 | "version" "2.19.0" 467 | dependencies: 468 | "@apollographql/graphql-playground-html" "1.6.26" 469 | "@types/accepts" "^1.3.5" 470 | "@types/body-parser" "1.19.0" 471 | "@types/cors" "2.8.8" 472 | "@types/express" "4.17.7" 473 | "@types/express-serve-static-core" "4.17.13" 474 | "accepts" "^1.3.5" 475 | "apollo-server-core" "^2.19.0" 476 | "apollo-server-types" "^0.6.1" 477 | "body-parser" "^1.18.3" 478 | "cors" "^2.8.4" 479 | "express" "^4.17.1" 480 | "graphql-subscriptions" "^1.0.0" 481 | "graphql-tools" "^4.0.0" 482 | "parseurl" "^1.3.2" 483 | "subscriptions-transport-ws" "^0.9.16" 484 | "type-is" "^1.6.16" 485 | 486 | "apollo-server-plugin-base@^0.10.2": 487 | "integrity" "sha512-uM5uL1lOxbXdgvt/aEIbgs40fV9xA45Y3Mmh0VtQ/ddqq0MXR5aG92nnf8rM+URarBCUfxKJKaYzJJ/CXAnEdA==" 488 | "resolved" "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.10.2.tgz" 489 | "version" "0.10.2" 490 | dependencies: 491 | "apollo-server-types" "^0.6.1" 492 | 493 | "apollo-server-types@^0.6.1": 494 | "integrity" "sha512-IEQ37aYvMLiTUzsySVLOSuvvhxuyYdhI05f3cnH6u2aN1HgGp7vX6bg+U3Ue8wbHfdcifcGIk5UEU+Q+QO6InA==" 495 | "resolved" "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.1.tgz" 496 | "version" "0.6.1" 497 | dependencies: 498 | "apollo-reporting-protobuf" "^0.6.1" 499 | "apollo-server-caching" "^0.5.2" 500 | "apollo-server-env" "^2.4.5" 501 | 502 | "apollo-server@^2.19.0": 503 | "integrity" "sha512-CchLtSwgm6NxQPvOXcMaxp8ckQT2ryLqdWIxjs2e+lCZ15tDsbqyPE+jVmqQKs9rsQNKnTwkMRdqmXqTciFJ8Q==" 504 | "resolved" "https://registry.npmjs.org/apollo-server/-/apollo-server-2.19.0.tgz" 505 | "version" "2.19.0" 506 | dependencies: 507 | "apollo-server-core" "^2.19.0" 508 | "apollo-server-express" "^2.19.0" 509 | "express" "^4.0.0" 510 | "graphql-subscriptions" "^1.0.0" 511 | "graphql-tools" "^4.0.0" 512 | 513 | "apollo-tracing@^0.12.0": 514 | "integrity" "sha512-cMUYGE6mOEwb9HDqhf4fiPEo2JMhjPIqEprAQEC57El76avRpRig5NM0bnqMZcYJZR5QmLlNcttNccOwf9WrNg==" 515 | "resolved" "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.12.0.tgz" 516 | "version" "0.12.0" 517 | dependencies: 518 | "apollo-server-env" "^2.4.5" 519 | "apollo-server-plugin-base" "^0.10.2" 520 | 521 | "apollo-utilities@^1.0.1", "apollo-utilities@^1.3.0": 522 | "integrity" "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==" 523 | "resolved" "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz" 524 | "version" "1.3.4" 525 | dependencies: 526 | "@wry/equality" "^0.1.2" 527 | "fast-json-stable-stringify" "^2.0.0" 528 | "ts-invariant" "^0.4.0" 529 | "tslib" "^1.10.0" 530 | 531 | "array-flatten@1.1.1": 532 | "integrity" "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 533 | "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" 534 | "version" "1.1.1" 535 | 536 | "async-limiter@~1.0.0": 537 | "integrity" "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 538 | "resolved" "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" 539 | "version" "1.0.1" 540 | 541 | "async-retry@^1.2.1": 542 | "integrity" "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==" 543 | "resolved" "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz" 544 | "version" "1.3.1" 545 | dependencies: 546 | "retry" "0.12.0" 547 | 548 | "asynckit@^0.4.0": 549 | "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 550 | "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 551 | "version" "0.4.0" 552 | 553 | "backo2@^1.0.2": 554 | "integrity" "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 555 | "resolved" "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz" 556 | "version" "1.0.2" 557 | 558 | "balanced-match@^1.0.0": 559 | "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 560 | "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 561 | "version" "1.0.0" 562 | 563 | "bcryptjs@2.4.3": 564 | "integrity" "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" 565 | "resolved" "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz" 566 | "version" "2.4.3" 567 | 568 | "binary-extensions@^2.0.0": 569 | "integrity" "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" 570 | "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz" 571 | "version" "2.1.0" 572 | 573 | "body-parser@^1.18.3", "body-parser@1.19.0": 574 | "integrity" "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==" 575 | "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" 576 | "version" "1.19.0" 577 | dependencies: 578 | "bytes" "3.1.0" 579 | "content-type" "~1.0.4" 580 | "debug" "2.6.9" 581 | "depd" "~1.1.2" 582 | "http-errors" "1.7.2" 583 | "iconv-lite" "0.4.24" 584 | "on-finished" "~2.3.0" 585 | "qs" "6.7.0" 586 | "raw-body" "2.4.0" 587 | "type-is" "~1.6.17" 588 | 589 | "boxen@^4.2.0": 590 | "integrity" "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==" 591 | "resolved" "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz" 592 | "version" "4.2.0" 593 | dependencies: 594 | "ansi-align" "^3.0.0" 595 | "camelcase" "^5.3.1" 596 | "chalk" "^3.0.0" 597 | "cli-boxes" "^2.2.0" 598 | "string-width" "^4.1.0" 599 | "term-size" "^2.1.0" 600 | "type-fest" "^0.8.1" 601 | "widest-line" "^3.1.0" 602 | 603 | "brace-expansion@^1.1.7": 604 | "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" 605 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 606 | "version" "1.1.11" 607 | dependencies: 608 | "balanced-match" "^1.0.0" 609 | "concat-map" "0.0.1" 610 | 611 | "braces@~3.0.2": 612 | "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" 613 | "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 614 | "version" "3.0.2" 615 | dependencies: 616 | "fill-range" "^7.0.1" 617 | 618 | "buffer-equal-constant-time@1.0.1": 619 | "integrity" "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 620 | "resolved" "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" 621 | "version" "1.0.1" 622 | 623 | "busboy@^0.3.1": 624 | "integrity" "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==" 625 | "resolved" "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz" 626 | "version" "0.3.1" 627 | dependencies: 628 | "dicer" "0.3.0" 629 | 630 | "bytes@3.1.0": 631 | "integrity" "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 632 | "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" 633 | "version" "3.1.0" 634 | 635 | "cacheable-request@^6.0.0": 636 | "integrity" "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==" 637 | "resolved" "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" 638 | "version" "6.1.0" 639 | dependencies: 640 | "clone-response" "^1.0.2" 641 | "get-stream" "^5.1.0" 642 | "http-cache-semantics" "^4.0.0" 643 | "keyv" "^3.0.0" 644 | "lowercase-keys" "^2.0.0" 645 | "normalize-url" "^4.1.0" 646 | "responselike" "^1.0.2" 647 | 648 | "call-bind@^1.0.0": 649 | "integrity" "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==" 650 | "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz" 651 | "version" "1.0.0" 652 | dependencies: 653 | "function-bind" "^1.1.1" 654 | "get-intrinsic" "^1.0.0" 655 | 656 | "camelcase@^5.3.1": 657 | "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 658 | "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" 659 | "version" "5.3.1" 660 | 661 | "chalk@^3.0.0": 662 | "integrity" "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==" 663 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" 664 | "version" "3.0.0" 665 | dependencies: 666 | "ansi-styles" "^4.1.0" 667 | "supports-color" "^7.1.0" 668 | 669 | "chokidar@^3.2.2": 670 | "integrity" "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==" 671 | "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz" 672 | "version" "3.4.3" 673 | dependencies: 674 | "anymatch" "~3.1.1" 675 | "braces" "~3.0.2" 676 | "glob-parent" "~5.1.0" 677 | "is-binary-path" "~2.1.0" 678 | "is-glob" "~4.0.1" 679 | "normalize-path" "~3.0.0" 680 | "readdirp" "~3.5.0" 681 | optionalDependencies: 682 | "fsevents" "~2.1.2" 683 | 684 | "ci-info@^2.0.0": 685 | "integrity" "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" 686 | "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" 687 | "version" "2.0.0" 688 | 689 | "cli-boxes@^2.2.0": 690 | "integrity" "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" 691 | "resolved" "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" 692 | "version" "2.2.1" 693 | 694 | "clone-response@^1.0.2": 695 | "integrity" "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=" 696 | "resolved" "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz" 697 | "version" "1.0.2" 698 | dependencies: 699 | "mimic-response" "^1.0.0" 700 | 701 | "color-convert@^2.0.1": 702 | "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" 703 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 704 | "version" "2.0.1" 705 | dependencies: 706 | "color-name" "~1.1.4" 707 | 708 | "color-name@~1.1.4": 709 | "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 710 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 711 | "version" "1.1.4" 712 | 713 | "combined-stream@^1.0.8": 714 | "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" 715 | "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 716 | "version" "1.0.8" 717 | dependencies: 718 | "delayed-stream" "~1.0.0" 719 | 720 | "commander@^2.20.3": 721 | "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 722 | "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" 723 | "version" "2.20.3" 724 | 725 | "concat-map@0.0.1": 726 | "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 727 | "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 728 | "version" "0.0.1" 729 | 730 | "configstore@^5.0.1": 731 | "integrity" "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==" 732 | "resolved" "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz" 733 | "version" "5.0.1" 734 | dependencies: 735 | "dot-prop" "^5.2.0" 736 | "graceful-fs" "^4.1.2" 737 | "make-dir" "^3.0.0" 738 | "unique-string" "^2.0.0" 739 | "write-file-atomic" "^3.0.0" 740 | "xdg-basedir" "^4.0.0" 741 | 742 | "content-disposition@0.5.3": 743 | "integrity" "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==" 744 | "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" 745 | "version" "0.5.3" 746 | dependencies: 747 | "safe-buffer" "5.1.2" 748 | 749 | "content-type@~1.0.4": 750 | "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 751 | "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" 752 | "version" "1.0.4" 753 | 754 | "cookie-signature@1.0.6": 755 | "integrity" "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 756 | "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" 757 | "version" "1.0.6" 758 | 759 | "cookie@0.4.0": 760 | "integrity" "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 761 | "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" 762 | "version" "0.4.0" 763 | 764 | "core-js@^3.0.1": 765 | "integrity" "sha512-W2VYNB0nwQQE7tKS7HzXd7r2y/y2SVJl4ga6oH/dnaLFzM0o2lB2P3zCkWj5Wc/zyMYjtgd5Hmhk0ObkQFZOIA==" 766 | "resolved" "https://registry.npmjs.org/core-js/-/core-js-3.8.0.tgz" 767 | "version" "3.8.0" 768 | 769 | "cors@^2.8.4": 770 | "integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==" 771 | "resolved" "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" 772 | "version" "2.8.5" 773 | dependencies: 774 | "object-assign" "^4" 775 | "vary" "^1" 776 | 777 | "crypto-random-string@^2.0.0": 778 | "integrity" "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" 779 | "resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" 780 | "version" "2.0.0" 781 | 782 | "cssfilter@0.0.10": 783 | "integrity" "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" 784 | "resolved" "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz" 785 | "version" "0.0.10" 786 | 787 | "debug@^2.2.0", "debug@2.6.9": 788 | "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" 789 | "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 790 | "version" "2.6.9" 791 | dependencies: 792 | "ms" "2.0.0" 793 | 794 | "debug@^3.2.6": 795 | "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" 796 | "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" 797 | "version" "3.2.7" 798 | dependencies: 799 | "ms" "^2.1.1" 800 | 801 | "decompress-response@^3.3.0": 802 | "integrity" "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=" 803 | "resolved" "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" 804 | "version" "3.3.0" 805 | dependencies: 806 | "mimic-response" "^1.0.0" 807 | 808 | "deep-extend@^0.6.0": 809 | "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 810 | "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" 811 | "version" "0.6.0" 812 | 813 | "defer-to-connect@^1.0.1": 814 | "integrity" "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" 815 | "resolved" "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" 816 | "version" "1.1.3" 817 | 818 | "define-properties@^1.1.3": 819 | "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" 820 | "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" 821 | "version" "1.1.3" 822 | dependencies: 823 | "object-keys" "^1.0.12" 824 | 825 | "delayed-stream@~1.0.0": 826 | "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 827 | "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 828 | "version" "1.0.0" 829 | 830 | "depd@~1.1.2": 831 | "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 832 | "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" 833 | "version" "1.1.2" 834 | 835 | "deprecated-decorator@^0.1.6": 836 | "integrity" "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" 837 | "resolved" "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz" 838 | "version" "0.1.6" 839 | 840 | "destroy@~1.0.4": 841 | "integrity" "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 842 | "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" 843 | "version" "1.0.4" 844 | 845 | "dicer@0.3.0": 846 | "integrity" "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==" 847 | "resolved" "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz" 848 | "version" "0.3.0" 849 | dependencies: 850 | "streamsearch" "0.1.2" 851 | 852 | "dot-prop@^5.2.0": 853 | "integrity" "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==" 854 | "resolved" "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" 855 | "version" "5.3.0" 856 | dependencies: 857 | "is-obj" "^2.0.0" 858 | 859 | "duplexer3@^0.1.4": 860 | "integrity" "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 861 | "resolved" "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz" 862 | "version" "0.1.4" 863 | 864 | "ecdsa-sig-formatter@1.0.11": 865 | "integrity" "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==" 866 | "resolved" "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" 867 | "version" "1.0.11" 868 | dependencies: 869 | "safe-buffer" "^5.0.1" 870 | 871 | "ee-first@1.1.1": 872 | "integrity" "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 873 | "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" 874 | "version" "1.1.1" 875 | 876 | "emoji-regex@^7.0.1": 877 | "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 878 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" 879 | "version" "7.0.3" 880 | 881 | "emoji-regex@^8.0.0": 882 | "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 883 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 884 | "version" "8.0.0" 885 | 886 | "encodeurl@~1.0.2": 887 | "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 888 | "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" 889 | "version" "1.0.2" 890 | 891 | "end-of-stream@^1.1.0": 892 | "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" 893 | "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" 894 | "version" "1.4.4" 895 | dependencies: 896 | "once" "^1.4.0" 897 | 898 | "es-abstract@^1.17.2": 899 | "integrity" "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==" 900 | "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz" 901 | "version" "1.17.7" 902 | dependencies: 903 | "es-to-primitive" "^1.2.1" 904 | "function-bind" "^1.1.1" 905 | "has" "^1.0.3" 906 | "has-symbols" "^1.0.1" 907 | "is-callable" "^1.2.2" 908 | "is-regex" "^1.1.1" 909 | "object-inspect" "^1.8.0" 910 | "object-keys" "^1.1.1" 911 | "object.assign" "^4.1.1" 912 | "string.prototype.trimend" "^1.0.1" 913 | "string.prototype.trimstart" "^1.0.1" 914 | 915 | "es-abstract@^1.18.0-next.1": 916 | "integrity" "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==" 917 | "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz" 918 | "version" "1.18.0-next.1" 919 | dependencies: 920 | "es-to-primitive" "^1.2.1" 921 | "function-bind" "^1.1.1" 922 | "has" "^1.0.3" 923 | "has-symbols" "^1.0.1" 924 | "is-callable" "^1.2.2" 925 | "is-negative-zero" "^2.0.0" 926 | "is-regex" "^1.1.1" 927 | "object-inspect" "^1.8.0" 928 | "object-keys" "^1.1.1" 929 | "object.assign" "^4.1.1" 930 | "string.prototype.trimend" "^1.0.1" 931 | "string.prototype.trimstart" "^1.0.1" 932 | 933 | "es-to-primitive@^1.2.1": 934 | "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" 935 | "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" 936 | "version" "1.2.1" 937 | dependencies: 938 | "is-callable" "^1.1.4" 939 | "is-date-object" "^1.0.1" 940 | "is-symbol" "^1.0.2" 941 | 942 | "escape-goat@^2.0.0": 943 | "integrity" "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" 944 | "resolved" "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" 945 | "version" "2.1.1" 946 | 947 | "escape-html@~1.0.3": 948 | "integrity" "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 949 | "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" 950 | "version" "1.0.3" 951 | 952 | "etag@~1.8.1": 953 | "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 954 | "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" 955 | "version" "1.8.1" 956 | 957 | "eventemitter3@^3.1.0": 958 | "integrity" "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" 959 | "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz" 960 | "version" "3.1.2" 961 | 962 | "express@^4.0.0", "express@^4.17.1": 963 | "integrity" "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==" 964 | "resolved" "https://registry.npmjs.org/express/-/express-4.17.1.tgz" 965 | "version" "4.17.1" 966 | dependencies: 967 | "accepts" "~1.3.7" 968 | "array-flatten" "1.1.1" 969 | "body-parser" "1.19.0" 970 | "content-disposition" "0.5.3" 971 | "content-type" "~1.0.4" 972 | "cookie" "0.4.0" 973 | "cookie-signature" "1.0.6" 974 | "debug" "2.6.9" 975 | "depd" "~1.1.2" 976 | "encodeurl" "~1.0.2" 977 | "escape-html" "~1.0.3" 978 | "etag" "~1.8.1" 979 | "finalhandler" "~1.1.2" 980 | "fresh" "0.5.2" 981 | "merge-descriptors" "1.0.1" 982 | "methods" "~1.1.2" 983 | "on-finished" "~2.3.0" 984 | "parseurl" "~1.3.3" 985 | "path-to-regexp" "0.1.7" 986 | "proxy-addr" "~2.0.5" 987 | "qs" "6.7.0" 988 | "range-parser" "~1.2.1" 989 | "safe-buffer" "5.1.2" 990 | "send" "0.17.1" 991 | "serve-static" "1.14.1" 992 | "setprototypeof" "1.1.1" 993 | "statuses" "~1.5.0" 994 | "type-is" "~1.6.18" 995 | "utils-merge" "1.0.1" 996 | "vary" "~1.1.2" 997 | 998 | "fast-json-stable-stringify@^2.0.0": 999 | "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1000 | "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 1001 | "version" "2.1.0" 1002 | 1003 | "fill-range@^7.0.1": 1004 | "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" 1005 | "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 1006 | "version" "7.0.1" 1007 | dependencies: 1008 | "to-regex-range" "^5.0.1" 1009 | 1010 | "finalhandler@~1.1.2": 1011 | "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==" 1012 | "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" 1013 | "version" "1.1.2" 1014 | dependencies: 1015 | "debug" "2.6.9" 1016 | "encodeurl" "~1.0.2" 1017 | "escape-html" "~1.0.3" 1018 | "on-finished" "~2.3.0" 1019 | "parseurl" "~1.3.3" 1020 | "statuses" "~1.5.0" 1021 | "unpipe" "~1.0.0" 1022 | 1023 | "form-data@^3.0.0": 1024 | "integrity" "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==" 1025 | "resolved" "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz" 1026 | "version" "3.0.0" 1027 | dependencies: 1028 | "asynckit" "^0.4.0" 1029 | "combined-stream" "^1.0.8" 1030 | "mime-types" "^2.1.12" 1031 | 1032 | "forwarded@~0.1.2": 1033 | "integrity" "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1034 | "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz" 1035 | "version" "0.1.2" 1036 | 1037 | "fresh@0.5.2": 1038 | "integrity" "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1039 | "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" 1040 | "version" "0.5.2" 1041 | 1042 | "fs-capacitor@^2.0.4": 1043 | "integrity" "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" 1044 | "resolved" "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz" 1045 | "version" "2.0.4" 1046 | 1047 | "function-bind@^1.1.1": 1048 | "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1049 | "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 1050 | "version" "1.1.1" 1051 | 1052 | "get-intrinsic@^1.0.0": 1053 | "integrity" "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==" 1054 | "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz" 1055 | "version" "1.0.1" 1056 | dependencies: 1057 | "function-bind" "^1.1.1" 1058 | "has" "^1.0.3" 1059 | "has-symbols" "^1.0.1" 1060 | 1061 | "get-stream@^4.1.0": 1062 | "integrity" "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==" 1063 | "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" 1064 | "version" "4.1.0" 1065 | dependencies: 1066 | "pump" "^3.0.0" 1067 | 1068 | "get-stream@^5.1.0": 1069 | "integrity" "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==" 1070 | "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" 1071 | "version" "5.2.0" 1072 | dependencies: 1073 | "pump" "^3.0.0" 1074 | 1075 | "glob-parent@~5.1.0": 1076 | "integrity" "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==" 1077 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" 1078 | "version" "5.1.1" 1079 | dependencies: 1080 | "is-glob" "^4.0.1" 1081 | 1082 | "global-dirs@^2.0.1": 1083 | "integrity" "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==" 1084 | "resolved" "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz" 1085 | "version" "2.0.1" 1086 | dependencies: 1087 | "ini" "^1.3.5" 1088 | 1089 | "got@^9.6.0": 1090 | "integrity" "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==" 1091 | "resolved" "https://registry.npmjs.org/got/-/got-9.6.0.tgz" 1092 | "version" "9.6.0" 1093 | dependencies: 1094 | "@sindresorhus/is" "^0.14.0" 1095 | "@szmarczak/http-timer" "^1.1.2" 1096 | "cacheable-request" "^6.0.0" 1097 | "decompress-response" "^3.3.0" 1098 | "duplexer3" "^0.1.4" 1099 | "get-stream" "^4.1.0" 1100 | "lowercase-keys" "^1.0.1" 1101 | "mimic-response" "^1.0.1" 1102 | "p-cancelable" "^1.0.0" 1103 | "to-readable-stream" "^1.0.0" 1104 | "url-parse-lax" "^3.0.0" 1105 | 1106 | "graceful-fs@^4.1.2": 1107 | "integrity" "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 1108 | "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" 1109 | "version" "4.2.4" 1110 | 1111 | "graphql-extensions@^0.12.6": 1112 | "integrity" "sha512-EUNw+OIRXYTPxToSoJjhJvS5aGa94KkdkZnL1I9DCZT64/+rzQNeLeGj+goj2RYuYvoQe1Bmcx0CNZ1GqwBhng==" 1113 | "resolved" "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.6.tgz" 1114 | "version" "0.12.6" 1115 | dependencies: 1116 | "@apollographql/apollo-tools" "^0.4.3" 1117 | "apollo-server-env" "^2.4.5" 1118 | "apollo-server-types" "^0.6.1" 1119 | 1120 | "graphql-subscriptions@^1.0.0": 1121 | "integrity" "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==" 1122 | "resolved" "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz" 1123 | "version" "1.1.0" 1124 | dependencies: 1125 | "iterall" "^1.2.1" 1126 | 1127 | "graphql-tag@^2.9.2": 1128 | "integrity" "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==" 1129 | "resolved" "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz" 1130 | "version" "2.11.0" 1131 | 1132 | "graphql-tools@^4.0.0": 1133 | "integrity" "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==" 1134 | "resolved" "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz" 1135 | "version" "4.0.8" 1136 | dependencies: 1137 | "apollo-link" "^1.2.14" 1138 | "apollo-utilities" "^1.0.1" 1139 | "deprecated-decorator" "^0.1.6" 1140 | "iterall" "^1.1.3" 1141 | "uuid" "^3.1.0" 1142 | 1143 | "graphql-upload@^8.0.2": 1144 | "integrity" "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==" 1145 | "resolved" "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz" 1146 | "version" "8.1.0" 1147 | dependencies: 1148 | "busboy" "^0.3.1" 1149 | "fs-capacitor" "^2.0.4" 1150 | "http-errors" "^1.7.3" 1151 | "object-path" "^0.11.4" 1152 | 1153 | "graphql@^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0", "graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.11.3 || ^0.12.3 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0", "graphql@^14.2.1 || ^15.0.0", "graphql@^15.3.0", "graphql@>=0.10.0", "graphql@0.13.1 - 14": 1154 | "integrity" "sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA==" 1155 | "resolved" "https://registry.npmjs.org/graphql/-/graphql-15.4.0.tgz" 1156 | "version" "15.4.0" 1157 | 1158 | "has-flag@^3.0.0": 1159 | "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1160 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 1161 | "version" "3.0.0" 1162 | 1163 | "has-flag@^4.0.0": 1164 | "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 1165 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 1166 | "version" "4.0.0" 1167 | 1168 | "has-symbols@^1.0.1": 1169 | "integrity" "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 1170 | "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz" 1171 | "version" "1.0.1" 1172 | 1173 | "has-yarn@^2.1.0": 1174 | "integrity" "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" 1175 | "resolved" "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" 1176 | "version" "2.1.0" 1177 | 1178 | "has@^1.0.3": 1179 | "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" 1180 | "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 1181 | "version" "1.0.3" 1182 | dependencies: 1183 | "function-bind" "^1.1.1" 1184 | 1185 | "http-cache-semantics@^4.0.0": 1186 | "integrity" "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" 1187 | "resolved" "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" 1188 | "version" "4.1.0" 1189 | 1190 | "http-errors@^1.7.3": 1191 | "integrity" "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==" 1192 | "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz" 1193 | "version" "1.8.0" 1194 | dependencies: 1195 | "depd" "~1.1.2" 1196 | "inherits" "2.0.4" 1197 | "setprototypeof" "1.2.0" 1198 | "statuses" ">= 1.5.0 < 2" 1199 | "toidentifier" "1.0.0" 1200 | 1201 | "http-errors@~1.7.2": 1202 | "integrity" "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==" 1203 | "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" 1204 | "version" "1.7.3" 1205 | dependencies: 1206 | "depd" "~1.1.2" 1207 | "inherits" "2.0.4" 1208 | "setprototypeof" "1.1.1" 1209 | "statuses" ">= 1.5.0 < 2" 1210 | "toidentifier" "1.0.0" 1211 | 1212 | "http-errors@1.7.2": 1213 | "integrity" "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==" 1214 | "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" 1215 | "version" "1.7.2" 1216 | dependencies: 1217 | "depd" "~1.1.2" 1218 | "inherits" "2.0.3" 1219 | "setprototypeof" "1.1.1" 1220 | "statuses" ">= 1.5.0 < 2" 1221 | "toidentifier" "1.0.0" 1222 | 1223 | "iconv-lite@0.4.24": 1224 | "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" 1225 | "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" 1226 | "version" "0.4.24" 1227 | dependencies: 1228 | "safer-buffer" ">= 2.1.2 < 3" 1229 | 1230 | "ignore-by-default@^1.0.1": 1231 | "integrity" "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" 1232 | "resolved" "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" 1233 | "version" "1.0.1" 1234 | 1235 | "import-lazy@^2.1.0": 1236 | "integrity" "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" 1237 | "resolved" "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" 1238 | "version" "2.1.0" 1239 | 1240 | "imurmurhash@^0.1.4": 1241 | "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 1242 | "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 1243 | "version" "0.1.4" 1244 | 1245 | "inherits@^2.0.1", "inherits@2.0.4": 1246 | "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1247 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 1248 | "version" "2.0.4" 1249 | 1250 | "inherits@2.0.3": 1251 | "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1252 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 1253 | "version" "2.0.3" 1254 | 1255 | "ini@^1.3.5", "ini@~1.3.0": 1256 | "integrity" "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 1257 | "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz" 1258 | "version" "1.3.5" 1259 | 1260 | "ipaddr.js@1.9.1": 1261 | "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1262 | "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" 1263 | "version" "1.9.1" 1264 | 1265 | "is-binary-path@~2.1.0": 1266 | "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" 1267 | "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 1268 | "version" "2.1.0" 1269 | dependencies: 1270 | "binary-extensions" "^2.0.0" 1271 | 1272 | "is-callable@^1.1.4", "is-callable@^1.2.2": 1273 | "integrity" "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" 1274 | "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz" 1275 | "version" "1.2.2" 1276 | 1277 | "is-ci@^2.0.0": 1278 | "integrity" "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==" 1279 | "resolved" "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" 1280 | "version" "2.0.0" 1281 | dependencies: 1282 | "ci-info" "^2.0.0" 1283 | 1284 | "is-date-object@^1.0.1": 1285 | "integrity" "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 1286 | "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz" 1287 | "version" "1.0.2" 1288 | 1289 | "is-extglob@^2.1.1": 1290 | "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1291 | "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 1292 | "version" "2.1.1" 1293 | 1294 | "is-fullwidth-code-point@^2.0.0": 1295 | "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1296 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" 1297 | "version" "2.0.0" 1298 | 1299 | "is-fullwidth-code-point@^3.0.0": 1300 | "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1301 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 1302 | "version" "3.0.0" 1303 | 1304 | "is-glob@^4.0.1", "is-glob@~4.0.1": 1305 | "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" 1306 | "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" 1307 | "version" "4.0.1" 1308 | dependencies: 1309 | "is-extglob" "^2.1.1" 1310 | 1311 | "is-installed-globally@^0.3.1": 1312 | "integrity" "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==" 1313 | "resolved" "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz" 1314 | "version" "0.3.2" 1315 | dependencies: 1316 | "global-dirs" "^2.0.1" 1317 | "is-path-inside" "^3.0.1" 1318 | 1319 | "is-negative-zero@^2.0.0": 1320 | "integrity" "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" 1321 | "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz" 1322 | "version" "2.0.0" 1323 | 1324 | "is-npm@^4.0.0": 1325 | "integrity" "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" 1326 | "resolved" "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz" 1327 | "version" "4.0.0" 1328 | 1329 | "is-number@^7.0.0": 1330 | "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1331 | "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 1332 | "version" "7.0.0" 1333 | 1334 | "is-obj@^2.0.0": 1335 | "integrity" "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" 1336 | "resolved" "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" 1337 | "version" "2.0.0" 1338 | 1339 | "is-path-inside@^3.0.1": 1340 | "integrity" "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" 1341 | "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz" 1342 | "version" "3.0.2" 1343 | 1344 | "is-regex@^1.1.1": 1345 | "integrity" "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==" 1346 | "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz" 1347 | "version" "1.1.1" 1348 | dependencies: 1349 | "has-symbols" "^1.0.1" 1350 | 1351 | "is-symbol@^1.0.2": 1352 | "integrity" "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==" 1353 | "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz" 1354 | "version" "1.0.3" 1355 | dependencies: 1356 | "has-symbols" "^1.0.1" 1357 | 1358 | "is-typedarray@^1.0.0": 1359 | "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1360 | "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" 1361 | "version" "1.0.0" 1362 | 1363 | "is-yarn-global@^0.3.0": 1364 | "integrity" "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" 1365 | "resolved" "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" 1366 | "version" "0.3.0" 1367 | 1368 | "iterall@^1.1.3", "iterall@^1.2.1": 1369 | "integrity" "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" 1370 | "resolved" "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz" 1371 | "version" "1.3.0" 1372 | 1373 | "json-buffer@3.0.0": 1374 | "integrity" "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" 1375 | "resolved" "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" 1376 | "version" "3.0.0" 1377 | 1378 | "jsonwebtoken@8.5.1": 1379 | "integrity" "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==" 1380 | "resolved" "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz" 1381 | "version" "8.5.1" 1382 | dependencies: 1383 | "jws" "^3.2.2" 1384 | "lodash.includes" "^4.3.0" 1385 | "lodash.isboolean" "^3.0.3" 1386 | "lodash.isinteger" "^4.0.4" 1387 | "lodash.isnumber" "^3.0.3" 1388 | "lodash.isplainobject" "^4.0.6" 1389 | "lodash.isstring" "^4.0.1" 1390 | "lodash.once" "^4.0.0" 1391 | "ms" "^2.1.1" 1392 | "semver" "^5.6.0" 1393 | 1394 | "jwa@^1.4.1": 1395 | "integrity" "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==" 1396 | "resolved" "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" 1397 | "version" "1.4.1" 1398 | dependencies: 1399 | "buffer-equal-constant-time" "1.0.1" 1400 | "ecdsa-sig-formatter" "1.0.11" 1401 | "safe-buffer" "^5.0.1" 1402 | 1403 | "jws@^3.2.2": 1404 | "integrity" "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==" 1405 | "resolved" "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" 1406 | "version" "3.2.2" 1407 | dependencies: 1408 | "jwa" "^1.4.1" 1409 | "safe-buffer" "^5.0.1" 1410 | 1411 | "keyv@^3.0.0": 1412 | "integrity" "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==" 1413 | "resolved" "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" 1414 | "version" "3.1.0" 1415 | dependencies: 1416 | "json-buffer" "3.0.0" 1417 | 1418 | "latest-version@^5.0.0": 1419 | "integrity" "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==" 1420 | "resolved" "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" 1421 | "version" "5.1.0" 1422 | dependencies: 1423 | "package-json" "^6.3.0" 1424 | 1425 | "lodash.includes@^4.3.0": 1426 | "integrity" "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1427 | "resolved" "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" 1428 | "version" "4.3.0" 1429 | 1430 | "lodash.isboolean@^3.0.3": 1431 | "integrity" "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1432 | "resolved" "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" 1433 | "version" "3.0.3" 1434 | 1435 | "lodash.isinteger@^4.0.4": 1436 | "integrity" "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1437 | "resolved" "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" 1438 | "version" "4.0.4" 1439 | 1440 | "lodash.isnumber@^3.0.3": 1441 | "integrity" "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1442 | "resolved" "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" 1443 | "version" "3.0.3" 1444 | 1445 | "lodash.isplainobject@^4.0.6": 1446 | "integrity" "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1447 | "resolved" "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" 1448 | "version" "4.0.6" 1449 | 1450 | "lodash.isstring@^4.0.1": 1451 | "integrity" "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1452 | "resolved" "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" 1453 | "version" "4.0.1" 1454 | 1455 | "lodash.once@^4.0.0": 1456 | "integrity" "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1457 | "resolved" "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" 1458 | "version" "4.1.1" 1459 | 1460 | "lodash.sortby@^4.7.0": 1461 | "integrity" "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1462 | "resolved" "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" 1463 | "version" "4.7.0" 1464 | 1465 | "loglevel@^1.6.7": 1466 | "integrity" "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" 1467 | "resolved" "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz" 1468 | "version" "1.7.1" 1469 | 1470 | "long@^4.0.0": 1471 | "integrity" "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1472 | "resolved" "https://registry.npmjs.org/long/-/long-4.0.0.tgz" 1473 | "version" "4.0.0" 1474 | 1475 | "lowercase-keys@^1.0.0", "lowercase-keys@^1.0.1": 1476 | "integrity" "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 1477 | "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" 1478 | "version" "1.0.1" 1479 | 1480 | "lowercase-keys@^2.0.0": 1481 | "integrity" "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" 1482 | "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" 1483 | "version" "2.0.0" 1484 | 1485 | "lru-cache@^5.0.0": 1486 | "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" 1487 | "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" 1488 | "version" "5.1.1" 1489 | dependencies: 1490 | "yallist" "^3.0.2" 1491 | 1492 | "make-dir@^3.0.0": 1493 | "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" 1494 | "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" 1495 | "version" "3.1.0" 1496 | dependencies: 1497 | "semver" "^6.0.0" 1498 | 1499 | "media-typer@0.3.0": 1500 | "integrity" "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1501 | "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" 1502 | "version" "0.3.0" 1503 | 1504 | "merge-descriptors@1.0.1": 1505 | "integrity" "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1506 | "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" 1507 | "version" "1.0.1" 1508 | 1509 | "methods@~1.1.2": 1510 | "integrity" "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1511 | "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" 1512 | "version" "1.1.2" 1513 | 1514 | "mime-db@1.44.0": 1515 | "integrity" "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 1516 | "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz" 1517 | "version" "1.44.0" 1518 | 1519 | "mime-types@^2.1.12", "mime-types@~2.1.24": 1520 | "integrity" "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==" 1521 | "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz" 1522 | "version" "2.1.27" 1523 | dependencies: 1524 | "mime-db" "1.44.0" 1525 | 1526 | "mime@1.6.0": 1527 | "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1528 | "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" 1529 | "version" "1.6.0" 1530 | 1531 | "mimic-response@^1.0.0", "mimic-response@^1.0.1": 1532 | "integrity" "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 1533 | "resolved" "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" 1534 | "version" "1.0.1" 1535 | 1536 | "minimatch@^3.0.4": 1537 | "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" 1538 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 1539 | "version" "3.0.4" 1540 | dependencies: 1541 | "brace-expansion" "^1.1.7" 1542 | 1543 | "minimist@^1.2.0": 1544 | "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1545 | "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" 1546 | "version" "1.2.5" 1547 | 1548 | "ms@^2.1.1": 1549 | "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1550 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1551 | "version" "2.1.2" 1552 | 1553 | "ms@2.0.0": 1554 | "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1555 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 1556 | "version" "2.0.0" 1557 | 1558 | "ms@2.1.1": 1559 | "integrity" "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1560 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" 1561 | "version" "2.1.1" 1562 | 1563 | "negotiator@0.6.2": 1564 | "integrity" "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1565 | "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" 1566 | "version" "0.6.2" 1567 | 1568 | "node-fetch@^2.1.2", "node-fetch@^2.2.0": 1569 | "integrity" "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1570 | "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz" 1571 | "version" "2.6.1" 1572 | 1573 | "nodemon@^2.0.6": 1574 | "integrity" "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==" 1575 | "resolved" "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz" 1576 | "version" "2.0.6" 1577 | dependencies: 1578 | "chokidar" "^3.2.2" 1579 | "debug" "^3.2.6" 1580 | "ignore-by-default" "^1.0.1" 1581 | "minimatch" "^3.0.4" 1582 | "pstree.remy" "^1.1.7" 1583 | "semver" "^5.7.1" 1584 | "supports-color" "^5.5.0" 1585 | "touch" "^3.1.0" 1586 | "undefsafe" "^2.0.3" 1587 | "update-notifier" "^4.1.0" 1588 | 1589 | "nopt@~1.0.10": 1590 | "integrity" "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=" 1591 | "resolved" "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" 1592 | "version" "1.0.10" 1593 | dependencies: 1594 | "abbrev" "1" 1595 | 1596 | "normalize-path@^3.0.0", "normalize-path@~3.0.0": 1597 | "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1598 | "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 1599 | "version" "3.0.0" 1600 | 1601 | "normalize-url@^4.1.0": 1602 | "integrity" "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" 1603 | "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz" 1604 | "version" "4.5.0" 1605 | 1606 | "object-assign@^4": 1607 | "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1608 | "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" 1609 | "version" "4.1.1" 1610 | 1611 | "object-inspect@^1.8.0": 1612 | "integrity" "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" 1613 | "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz" 1614 | "version" "1.8.0" 1615 | 1616 | "object-keys@^1.0.12", "object-keys@^1.1.1": 1617 | "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1618 | "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" 1619 | "version" "1.1.1" 1620 | 1621 | "object-path@^0.11.4": 1622 | "integrity" "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==" 1623 | "resolved" "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz" 1624 | "version" "0.11.5" 1625 | 1626 | "object.assign@^4.1.1": 1627 | "integrity" "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==" 1628 | "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" 1629 | "version" "4.1.2" 1630 | dependencies: 1631 | "call-bind" "^1.0.0" 1632 | "define-properties" "^1.1.3" 1633 | "has-symbols" "^1.0.1" 1634 | "object-keys" "^1.1.1" 1635 | 1636 | "object.getownpropertydescriptors@^2.1.0": 1637 | "integrity" "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==" 1638 | "resolved" "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz" 1639 | "version" "2.1.1" 1640 | dependencies: 1641 | "call-bind" "^1.0.0" 1642 | "define-properties" "^1.1.3" 1643 | "es-abstract" "^1.18.0-next.1" 1644 | 1645 | "on-finished@~2.3.0": 1646 | "integrity" "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" 1647 | "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" 1648 | "version" "2.3.0" 1649 | dependencies: 1650 | "ee-first" "1.1.1" 1651 | 1652 | "once@^1.3.1", "once@^1.4.0": 1653 | "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 1654 | "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1655 | "version" "1.4.0" 1656 | dependencies: 1657 | "wrappy" "1" 1658 | 1659 | "p-cancelable@^1.0.0": 1660 | "integrity" "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" 1661 | "resolved" "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" 1662 | "version" "1.1.0" 1663 | 1664 | "package-json@^6.3.0": 1665 | "integrity" "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==" 1666 | "resolved" "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" 1667 | "version" "6.5.0" 1668 | dependencies: 1669 | "got" "^9.6.0" 1670 | "registry-auth-token" "^4.0.0" 1671 | "registry-url" "^5.0.0" 1672 | "semver" "^6.2.0" 1673 | 1674 | "parseurl@^1.3.2", "parseurl@~1.3.3": 1675 | "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1676 | "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" 1677 | "version" "1.3.3" 1678 | 1679 | "path-to-regexp@0.1.7": 1680 | "integrity" "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1681 | "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" 1682 | "version" "0.1.7" 1683 | 1684 | "picomatch@^2.0.4", "picomatch@^2.2.1": 1685 | "integrity" "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" 1686 | "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" 1687 | "version" "2.2.2" 1688 | 1689 | "prepend-http@^2.0.0": 1690 | "integrity" "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" 1691 | "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" 1692 | "version" "2.0.0" 1693 | 1694 | "prisma@*", "prisma@^3.7.0": 1695 | "integrity" "sha512-Q8zHwS9m70TaD7qI8u+8hTAmiTpK+IpvRYF3Rgb/OeWGQJOMgZCFFvNCiSfoLEQ95wilK7ctW3KOpc9AuYnRUA==" 1696 | "resolved" "https://registry.npmjs.org/prisma/-/prisma-3.8.1.tgz" 1697 | "version" "3.8.1" 1698 | dependencies: 1699 | "@prisma/engines" "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" 1700 | 1701 | "proxy-addr@~2.0.5": 1702 | "integrity" "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==" 1703 | "resolved" "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz" 1704 | "version" "2.0.6" 1705 | dependencies: 1706 | "forwarded" "~0.1.2" 1707 | "ipaddr.js" "1.9.1" 1708 | 1709 | "pstree.remy@^1.1.7": 1710 | "integrity" "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" 1711 | "resolved" "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" 1712 | "version" "1.1.8" 1713 | 1714 | "pump@^3.0.0": 1715 | "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==" 1716 | "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" 1717 | "version" "3.0.0" 1718 | dependencies: 1719 | "end-of-stream" "^1.1.0" 1720 | "once" "^1.3.1" 1721 | 1722 | "pupa@^2.0.1": 1723 | "integrity" "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==" 1724 | "resolved" "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" 1725 | "version" "2.1.1" 1726 | dependencies: 1727 | "escape-goat" "^2.0.0" 1728 | 1729 | "qs@6.7.0": 1730 | "integrity" "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1731 | "resolved" "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" 1732 | "version" "6.7.0" 1733 | 1734 | "range-parser@~1.2.1": 1735 | "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1736 | "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" 1737 | "version" "1.2.1" 1738 | 1739 | "raw-body@2.4.0": 1740 | "integrity" "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==" 1741 | "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" 1742 | "version" "2.4.0" 1743 | dependencies: 1744 | "bytes" "3.1.0" 1745 | "http-errors" "1.7.2" 1746 | "iconv-lite" "0.4.24" 1747 | "unpipe" "1.0.0" 1748 | 1749 | "rc@^1.2.8": 1750 | "integrity" "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==" 1751 | "resolved" "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" 1752 | "version" "1.2.8" 1753 | dependencies: 1754 | "deep-extend" "^0.6.0" 1755 | "ini" "~1.3.0" 1756 | "minimist" "^1.2.0" 1757 | "strip-json-comments" "~2.0.1" 1758 | 1759 | "readdirp@~3.5.0": 1760 | "integrity" "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==" 1761 | "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" 1762 | "version" "3.5.0" 1763 | dependencies: 1764 | "picomatch" "^2.2.1" 1765 | 1766 | "registry-auth-token@^4.0.0": 1767 | "integrity" "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==" 1768 | "resolved" "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz" 1769 | "version" "4.2.1" 1770 | dependencies: 1771 | "rc" "^1.2.8" 1772 | 1773 | "registry-url@^5.0.0": 1774 | "integrity" "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==" 1775 | "resolved" "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" 1776 | "version" "5.1.0" 1777 | dependencies: 1778 | "rc" "^1.2.8" 1779 | 1780 | "responselike@^1.0.2": 1781 | "integrity" "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=" 1782 | "resolved" "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" 1783 | "version" "1.0.2" 1784 | dependencies: 1785 | "lowercase-keys" "^1.0.0" 1786 | 1787 | "retry@0.12.0": 1788 | "integrity" "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" 1789 | "resolved" "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" 1790 | "version" "0.12.0" 1791 | 1792 | "safe-buffer@^5.0.1": 1793 | "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1794 | "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 1795 | "version" "5.2.1" 1796 | 1797 | "safe-buffer@5.1.2": 1798 | "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1799 | "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" 1800 | "version" "5.1.2" 1801 | 1802 | "safer-buffer@>= 2.1.2 < 3": 1803 | "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1804 | "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 1805 | "version" "2.1.2" 1806 | 1807 | "semver-diff@^3.1.1": 1808 | "integrity" "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==" 1809 | "resolved" "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" 1810 | "version" "3.1.1" 1811 | dependencies: 1812 | "semver" "^6.3.0" 1813 | 1814 | "semver@^5.6.0": 1815 | "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1816 | "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" 1817 | "version" "5.7.1" 1818 | 1819 | "semver@^5.7.1": 1820 | "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1821 | "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" 1822 | "version" "5.7.1" 1823 | 1824 | "semver@^6.0.0", "semver@^6.2.0", "semver@^6.3.0": 1825 | "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1826 | "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" 1827 | "version" "6.3.0" 1828 | 1829 | "send@0.17.1": 1830 | "integrity" "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==" 1831 | "resolved" "https://registry.npmjs.org/send/-/send-0.17.1.tgz" 1832 | "version" "0.17.1" 1833 | dependencies: 1834 | "debug" "2.6.9" 1835 | "depd" "~1.1.2" 1836 | "destroy" "~1.0.4" 1837 | "encodeurl" "~1.0.2" 1838 | "escape-html" "~1.0.3" 1839 | "etag" "~1.8.1" 1840 | "fresh" "0.5.2" 1841 | "http-errors" "~1.7.2" 1842 | "mime" "1.6.0" 1843 | "ms" "2.1.1" 1844 | "on-finished" "~2.3.0" 1845 | "range-parser" "~1.2.1" 1846 | "statuses" "~1.5.0" 1847 | 1848 | "serve-static@1.14.1": 1849 | "integrity" "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==" 1850 | "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" 1851 | "version" "1.14.1" 1852 | dependencies: 1853 | "encodeurl" "~1.0.2" 1854 | "escape-html" "~1.0.3" 1855 | "parseurl" "~1.3.3" 1856 | "send" "0.17.1" 1857 | 1858 | "setprototypeof@1.1.1": 1859 | "integrity" "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1860 | "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" 1861 | "version" "1.1.1" 1862 | 1863 | "setprototypeof@1.2.0": 1864 | "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1865 | "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" 1866 | "version" "1.2.0" 1867 | 1868 | "sha.js@^2.4.11": 1869 | "integrity" "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==" 1870 | "resolved" "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" 1871 | "version" "2.4.11" 1872 | dependencies: 1873 | "inherits" "^2.0.1" 1874 | "safe-buffer" "^5.0.1" 1875 | 1876 | "signal-exit@^3.0.2": 1877 | "integrity" "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1878 | "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" 1879 | "version" "3.0.3" 1880 | 1881 | "statuses@>= 1.5.0 < 2", "statuses@~1.5.0": 1882 | "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1883 | "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" 1884 | "version" "1.5.0" 1885 | 1886 | "streamsearch@0.1.2": 1887 | "integrity" "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 1888 | "resolved" "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" 1889 | "version" "0.1.2" 1890 | 1891 | "string-width@^3.0.0": 1892 | "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" 1893 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" 1894 | "version" "3.1.0" 1895 | dependencies: 1896 | "emoji-regex" "^7.0.1" 1897 | "is-fullwidth-code-point" "^2.0.0" 1898 | "strip-ansi" "^5.1.0" 1899 | 1900 | "string-width@^4.0.0", "string-width@^4.1.0": 1901 | "integrity" "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==" 1902 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" 1903 | "version" "4.2.0" 1904 | dependencies: 1905 | "emoji-regex" "^8.0.0" 1906 | "is-fullwidth-code-point" "^3.0.0" 1907 | "strip-ansi" "^6.0.0" 1908 | 1909 | "string.prototype.trimend@^1.0.1": 1910 | "integrity" "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==" 1911 | "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz" 1912 | "version" "1.0.3" 1913 | dependencies: 1914 | "call-bind" "^1.0.0" 1915 | "define-properties" "^1.1.3" 1916 | 1917 | "string.prototype.trimstart@^1.0.1": 1918 | "integrity" "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==" 1919 | "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz" 1920 | "version" "1.0.3" 1921 | dependencies: 1922 | "call-bind" "^1.0.0" 1923 | "define-properties" "^1.1.3" 1924 | 1925 | "strip-ansi@^5.1.0": 1926 | "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" 1927 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" 1928 | "version" "5.2.0" 1929 | dependencies: 1930 | "ansi-regex" "^4.1.0" 1931 | 1932 | "strip-ansi@^6.0.0": 1933 | "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" 1934 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" 1935 | "version" "6.0.0" 1936 | dependencies: 1937 | "ansi-regex" "^5.0.0" 1938 | 1939 | "strip-json-comments@~2.0.1": 1940 | "integrity" "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1941 | "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" 1942 | "version" "2.0.1" 1943 | 1944 | "subscriptions-transport-ws@^0.9.11", "subscriptions-transport-ws@^0.9.16": 1945 | "integrity" "sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA==" 1946 | "resolved" "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz" 1947 | "version" "0.9.18" 1948 | dependencies: 1949 | "backo2" "^1.0.2" 1950 | "eventemitter3" "^3.1.0" 1951 | "iterall" "^1.2.1" 1952 | "symbol-observable" "^1.0.4" 1953 | "ws" "^5.2.0" 1954 | 1955 | "supports-color@^5.5.0": 1956 | "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" 1957 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1958 | "version" "5.5.0" 1959 | dependencies: 1960 | "has-flag" "^3.0.0" 1961 | 1962 | "supports-color@^7.1.0": 1963 | "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" 1964 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" 1965 | "version" "7.2.0" 1966 | dependencies: 1967 | "has-flag" "^4.0.0" 1968 | 1969 | "symbol-observable@^1.0.4": 1970 | "integrity" "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 1971 | "resolved" "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz" 1972 | "version" "1.2.0" 1973 | 1974 | "term-size@^2.1.0": 1975 | "integrity" "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" 1976 | "resolved" "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz" 1977 | "version" "2.2.1" 1978 | 1979 | "to-readable-stream@^1.0.0": 1980 | "integrity" "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" 1981 | "resolved" "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" 1982 | "version" "1.0.0" 1983 | 1984 | "to-regex-range@^5.0.1": 1985 | "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" 1986 | "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 1987 | "version" "5.0.1" 1988 | dependencies: 1989 | "is-number" "^7.0.0" 1990 | 1991 | "toidentifier@1.0.0": 1992 | "integrity" "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1993 | "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" 1994 | "version" "1.0.0" 1995 | 1996 | "touch@^3.1.0": 1997 | "integrity" "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==" 1998 | "resolved" "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz" 1999 | "version" "3.1.0" 2000 | dependencies: 2001 | "nopt" "~1.0.10" 2002 | 2003 | "ts-invariant@^0.4.0": 2004 | "integrity" "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==" 2005 | "resolved" "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz" 2006 | "version" "0.4.4" 2007 | dependencies: 2008 | "tslib" "^1.9.3" 2009 | 2010 | "tslib@^1.10.0", "tslib@^1.9.3": 2011 | "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 2012 | "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" 2013 | "version" "1.14.1" 2014 | 2015 | "type-fest@^0.8.1": 2016 | "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" 2017 | "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" 2018 | "version" "0.8.1" 2019 | 2020 | "type-is@^1.6.16", "type-is@~1.6.17", "type-is@~1.6.18": 2021 | "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" 2022 | "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" 2023 | "version" "1.6.18" 2024 | dependencies: 2025 | "media-typer" "0.3.0" 2026 | "mime-types" "~2.1.24" 2027 | 2028 | "typedarray-to-buffer@^3.1.5": 2029 | "integrity" "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==" 2030 | "resolved" "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" 2031 | "version" "3.1.5" 2032 | dependencies: 2033 | "is-typedarray" "^1.0.0" 2034 | 2035 | "undefsafe@^2.0.3": 2036 | "integrity" "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==" 2037 | "resolved" "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz" 2038 | "version" "2.0.3" 2039 | dependencies: 2040 | "debug" "^2.2.0" 2041 | 2042 | "unique-string@^2.0.0": 2043 | "integrity" "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==" 2044 | "resolved" "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" 2045 | "version" "2.0.0" 2046 | dependencies: 2047 | "crypto-random-string" "^2.0.0" 2048 | 2049 | "unpipe@~1.0.0", "unpipe@1.0.0": 2050 | "integrity" "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2051 | "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" 2052 | "version" "1.0.0" 2053 | 2054 | "update-notifier@^4.1.0": 2055 | "integrity" "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==" 2056 | "resolved" "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz" 2057 | "version" "4.1.3" 2058 | dependencies: 2059 | "boxen" "^4.2.0" 2060 | "chalk" "^3.0.0" 2061 | "configstore" "^5.0.1" 2062 | "has-yarn" "^2.1.0" 2063 | "import-lazy" "^2.1.0" 2064 | "is-ci" "^2.0.0" 2065 | "is-installed-globally" "^0.3.1" 2066 | "is-npm" "^4.0.0" 2067 | "is-yarn-global" "^0.3.0" 2068 | "latest-version" "^5.0.0" 2069 | "pupa" "^2.0.1" 2070 | "semver-diff" "^3.1.1" 2071 | "xdg-basedir" "^4.0.0" 2072 | 2073 | "url-parse-lax@^3.0.0": 2074 | "integrity" "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=" 2075 | "resolved" "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" 2076 | "version" "3.0.0" 2077 | dependencies: 2078 | "prepend-http" "^2.0.0" 2079 | 2080 | "util.promisify@^1.0.0": 2081 | "integrity" "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==" 2082 | "resolved" "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" 2083 | "version" "1.0.1" 2084 | dependencies: 2085 | "define-properties" "^1.1.3" 2086 | "es-abstract" "^1.17.2" 2087 | "has-symbols" "^1.0.1" 2088 | "object.getownpropertydescriptors" "^2.1.0" 2089 | 2090 | "utils-merge@1.0.1": 2091 | "integrity" "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2092 | "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" 2093 | "version" "1.0.1" 2094 | 2095 | "uuid@^3.1.0": 2096 | "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 2097 | "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" 2098 | "version" "3.4.0" 2099 | 2100 | "uuid@^8.0.0": 2101 | "integrity" "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" 2102 | "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz" 2103 | "version" "8.3.1" 2104 | 2105 | "vary@^1", "vary@~1.1.2": 2106 | "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2107 | "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" 2108 | "version" "1.1.2" 2109 | 2110 | "widest-line@^3.1.0": 2111 | "integrity" "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==" 2112 | "resolved" "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" 2113 | "version" "3.1.0" 2114 | dependencies: 2115 | "string-width" "^4.0.0" 2116 | 2117 | "wrappy@1": 2118 | "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2119 | "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 2120 | "version" "1.0.2" 2121 | 2122 | "write-file-atomic@^3.0.0": 2123 | "integrity" "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==" 2124 | "resolved" "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" 2125 | "version" "3.0.3" 2126 | dependencies: 2127 | "imurmurhash" "^0.1.4" 2128 | "is-typedarray" "^1.0.0" 2129 | "signal-exit" "^3.0.2" 2130 | "typedarray-to-buffer" "^3.1.5" 2131 | 2132 | "ws@^5.2.0": 2133 | "integrity" "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==" 2134 | "resolved" "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz" 2135 | "version" "5.2.2" 2136 | dependencies: 2137 | "async-limiter" "~1.0.0" 2138 | 2139 | "ws@^6.0.0": 2140 | "integrity" "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==" 2141 | "resolved" "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz" 2142 | "version" "6.2.1" 2143 | dependencies: 2144 | "async-limiter" "~1.0.0" 2145 | 2146 | "xdg-basedir@^4.0.0": 2147 | "integrity" "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" 2148 | "resolved" "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" 2149 | "version" "4.0.0" 2150 | 2151 | "xss@^1.0.6": 2152 | "integrity" "sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw==" 2153 | "resolved" "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz" 2154 | "version" "1.0.8" 2155 | dependencies: 2156 | "commander" "^2.20.3" 2157 | "cssfilter" "0.0.10" 2158 | 2159 | "yallist@^3.0.2": 2160 | "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 2161 | "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" 2162 | "version" "3.1.1" 2163 | 2164 | "zen-observable-ts@^0.8.21": 2165 | "integrity" "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==" 2166 | "resolved" "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz" 2167 | "version" "0.8.21" 2168 | dependencies: 2169 | "tslib" "^1.9.3" 2170 | "zen-observable" "^0.8.0" 2171 | 2172 | "zen-observable@^0.8.0": 2173 | "integrity" "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" 2174 | "resolved" "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" 2175 | "version" "0.8.15" 2176 | -------------------------------------------------------------------------------- /src/components/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import CreateLink from './CreateLink'; 3 | import Header from './Header'; 4 | import LinkList from './LinkList'; 5 | import {Navigate, Route, Routes} from 'react-router-dom'; 6 | import Login from './Login'; 7 | import Search from './Search'; 8 | 9 | const App = () => ( 10 |
11 |
12 |
13 | 14 | } 17 | /> 18 | } 21 | /> 22 | }/> 23 | }/> 24 | } /> 25 | } 28 | /> 29 | 30 |
31 |
32 | ); 33 | 34 | export default App; 35 | -------------------------------------------------------------------------------- /src/components/CreateLink.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react'; 2 | import {useMutation, gql} from '@apollo/client'; 3 | import {useNavigate} from 'react-router-dom'; 4 | import {FEED_QUERY} from "./LinkList"; 5 | import {LINKS_PER_PAGE} from "../constants"; 6 | 7 | const CREATE_LINK_MUTATION = gql` 8 | mutation PostMutation( 9 | $description: String! 10 | $url: String! 11 | ) { 12 | post(description: $description, url: $url) { 13 | id 14 | createdAt 15 | url 16 | description 17 | } 18 | } 19 | `; 20 | 21 | const CreateLink = () => { 22 | const navigate = useNavigate(); 23 | 24 | const [formState, setFormState] = useState({ 25 | description: '', 26 | url: '' 27 | }); 28 | 29 | const [createLink] = useMutation(CREATE_LINK_MUTATION, { 30 | variables: { 31 | description: formState.description, 32 | url: formState.url 33 | }, 34 | update: (cache, {data: {post}}) => { 35 | const take = LINKS_PER_PAGE; 36 | const skip = 0; 37 | const orderBy = {createdAt: 'desc'}; 38 | 39 | const data = cache.readQuery({ 40 | query: FEED_QUERY, 41 | variables: { 42 | take, 43 | skip, 44 | orderBy 45 | } 46 | }); 47 | 48 | cache.writeQuery({ 49 | query: FEED_QUERY, 50 | data: { 51 | feed: { 52 | links: [post, ...data.feed.links] 53 | } 54 | }, 55 | 56 | variables: { 57 | take, 58 | skip, 59 | orderBy 60 | } 61 | }); 62 | }, 63 | onCompleted: () => { 64 | navigate("/") 65 | } 66 | }); 67 | 68 | return ( 69 |
70 |
{ 72 | e.preventDefault(); 73 | createLink(); 74 | }} 75 | > 76 |
77 | 81 | setFormState({ 82 | ...formState, 83 | description: e.target.value 84 | }) 85 | } 86 | type="text" 87 | placeholder="A description for the link" 88 | /> 89 | 93 | setFormState({ 94 | ...formState, 95 | url: e.target.value 96 | }) 97 | } 98 | type="text" 99 | placeholder="The URL for the link" 100 | /> 101 |
102 | 103 |
104 |
105 | ); 106 | }; 107 | 108 | export default CreateLink; -------------------------------------------------------------------------------- /src/components/Header.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {Link, useNavigate} from 'react-router-dom'; 3 | import {AUTH_TOKEN} from '../constants'; 4 | 5 | const Header = () => { 6 | const navigate = useNavigate(); 7 | const authToken = localStorage.getItem(AUTH_TOKEN); 8 | return ( 9 |
10 |
11 | 12 |
Hacker News
13 | 14 | 15 | new 16 | 17 |
|
18 | 19 | top 20 | 21 |
|
22 | 26 | search 27 | 28 | {authToken && ( 29 |
30 |
|
31 | 35 | submit 36 | 37 |
38 | )} 39 |
40 |
41 | {authToken ? ( 42 |
{ 45 | localStorage.removeItem(AUTH_TOKEN); 46 | navigate(`/`); 47 | }} 48 | > 49 | logout 50 |
51 | ) : ( 52 | 56 | login 57 | 58 | )} 59 |
60 |
61 | ); 62 | }; 63 | 64 | export default Header; -------------------------------------------------------------------------------- /src/components/Link.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {AUTH_TOKEN, LINKS_PER_PAGE} from '../constants'; 3 | import {timeDifferenceForDate} from '../utils'; 4 | import {useMutation, gql} from '@apollo/client'; 5 | import {FEED_QUERY} from "./LinkList"; 6 | 7 | const VOTE_MUTATION = gql` 8 | mutation VoteMutation($linkId: ID!) { 9 | vote(linkId: $linkId) { 10 | id 11 | link { 12 | id 13 | votes { 14 | id 15 | user { 16 | id 17 | } 18 | } 19 | } 20 | user { 21 | id 22 | } 23 | } 24 | } 25 | `; 26 | 27 | 28 | const Link = (props) => { 29 | const {link} = props; 30 | const authToken = localStorage.getItem(AUTH_TOKEN); 31 | 32 | const take = LINKS_PER_PAGE; 33 | const skip = 0; 34 | const orderBy = {createdAt: 'desc'}; 35 | 36 | 37 | 38 | const [vote] = useMutation(VOTE_MUTATION, { 39 | variables: { 40 | linkId: link.id 41 | }, 42 | update: (cache, {data: {vote}}) => { 43 | const { feed } = cache.readQuery({ 44 | query: FEED_QUERY, 45 | variables: { 46 | take, 47 | skip, 48 | orderBy 49 | } 50 | }); 51 | 52 | const updatedLinks = feed.links.map((feedLink) => { 53 | if (feedLink.id === link.id) { 54 | return { 55 | ...feedLink, 56 | votes: [...feedLink.votes, vote] 57 | }; 58 | } 59 | return feedLink; 60 | }); 61 | 62 | cache.writeQuery({ 63 | query: FEED_QUERY, 64 | data: { 65 | feed: { 66 | links: updatedLinks 67 | } 68 | }, 69 | variables: { 70 | take, 71 | skip, 72 | orderBy 73 | } 74 | }); 75 | } 76 | }); 77 | 78 | return ( 79 |
80 |
81 | {props.index + 1}. 82 | {authToken && ( 83 |
88 | ▲ 89 |
90 | )} 91 |
92 |
93 |
94 | {link.description} ({link.url}) 95 |
96 | {( 97 |
98 | {link.votes.length} votes | by{' '} 99 | {link.postedBy ? link.postedBy.name : 'Unknown'}{' '} 100 | {timeDifferenceForDate(link.createdAt)} 101 |
102 | )} 103 |
104 |
105 | ); 106 | }; 107 | 108 | export default Link; -------------------------------------------------------------------------------- /src/components/LinkList.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Link from './Link'; 3 | import { LINKS_PER_PAGE } from '../constants'; 4 | 5 | import {useQuery, gql} from '@apollo/client'; 6 | import {useLocation, useNavigate} from 'react-router-dom'; 7 | 8 | const NEW_LINKS_SUBSCRIPTION = gql` 9 | subscription { 10 | newLink { 11 | id 12 | url 13 | description 14 | createdAt 15 | postedBy { 16 | id 17 | name 18 | } 19 | votes { 20 | id 21 | user { 22 | id 23 | } 24 | } 25 | } 26 | } 27 | `; 28 | 29 | const NEW_VOTES_SUBSCRIPTION = gql` 30 | subscription { 31 | newVote { 32 | id 33 | link { 34 | id 35 | url 36 | description 37 | createdAt 38 | postedBy { 39 | id 40 | name 41 | } 42 | votes { 43 | id 44 | user { 45 | id 46 | } 47 | } 48 | } 49 | user { 50 | id 51 | } 52 | } 53 | } 54 | `; 55 | 56 | 57 | export const FEED_QUERY = gql` 58 | query FeedQuery( 59 | $take: Int 60 | $skip: Int 61 | $orderBy: LinkOrderByInput 62 | ) { 63 | feed(take: $take, skip: $skip, orderBy: $orderBy) { 64 | id 65 | links { 66 | id 67 | createdAt 68 | url 69 | description 70 | postedBy { 71 | id 72 | name 73 | } 74 | votes { 75 | id 76 | user { 77 | id 78 | } 79 | } 80 | } 81 | count 82 | } 83 | } 84 | `; 85 | 86 | 87 | const getQueryVariables = (isNewPage, page) => { 88 | const skip = isNewPage ? (page - 1) * LINKS_PER_PAGE : 0; 89 | const take = isNewPage ? LINKS_PER_PAGE : 100; 90 | const orderBy = { createdAt: 'desc' }; 91 | return { take, skip, orderBy }; 92 | }; 93 | 94 | const getLinksToRender = (isNewPage, data) => { 95 | if (isNewPage) { 96 | return data.feed.links; 97 | } 98 | const rankedLinks = data.feed.links.slice(); 99 | rankedLinks.sort( 100 | (l1, l2) => l2.votes.length - l1.votes.length 101 | ); 102 | return rankedLinks; 103 | }; 104 | 105 | 106 | const LinkList = ({client}) => { 107 | const navigate = useNavigate(); 108 | const location = useLocation(); 109 | const isNewPage = location.pathname.includes( 110 | 'new' 111 | ); 112 | const pageIndexParams = location.pathname.split( 113 | '/' 114 | ); 115 | const page = parseInt( 116 | pageIndexParams[pageIndexParams.length - 1] 117 | ); 118 | const pageIndex = page ? (page - 1) * LINKS_PER_PAGE : 0; 119 | 120 | 121 | 122 | 123 | const { 124 | data, 125 | loading, 126 | error, 127 | subscribeToMore 128 | } = useQuery(FEED_QUERY, { 129 | variables: getQueryVariables(isNewPage, page), 130 | }); 131 | 132 | 133 | subscribeToMore({ 134 | document: NEW_LINKS_SUBSCRIPTION, 135 | updateQuery: (prev, {subscriptionData}) => { 136 | if (!subscriptionData.data) return prev; 137 | const newLink = subscriptionData.data.newLink; 138 | const exists = prev.feed.links.find( 139 | ({id}) => id === newLink.id 140 | ); 141 | if (exists) return prev; 142 | 143 | return Object.assign({}, prev, { 144 | feed: { 145 | links: [newLink, ...prev.feed.links], 146 | count: prev.feed.links.length + 1, 147 | __typename: prev.feed.__typename 148 | } 149 | }); 150 | } 151 | }); 152 | 153 | subscribeToMore({ 154 | document: NEW_VOTES_SUBSCRIPTION 155 | }); 156 | 157 | 158 | return ( 159 | <> 160 | {loading &&

Loading...

} 161 | {error &&
{JSON.stringify(error, null, 2)}
} 162 | {data && ( 163 | <> 164 | {getLinksToRender(isNewPage, data).map( 165 | (link, index) => ( 166 | 171 | ) 172 | )} 173 | {isNewPage && ( 174 |
175 |
{ 178 | if (page > 1) { 179 | navigate(`/new/${page - 1}`); 180 | } 181 | }} 182 | > 183 | Previous 184 |
185 |
{ 188 | if ( 189 | page <= 190 | data.feed.count / LINKS_PER_PAGE 191 | ) { 192 | const nextPage = page + 1; 193 | navigate(`/new/${nextPage}`); 194 | } 195 | }} 196 | > 197 | Next 198 |
199 |
200 | )} 201 | 202 | )} 203 | 204 | ); 205 | }; 206 | 207 | export default LinkList; -------------------------------------------------------------------------------- /src/components/Login.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react'; 2 | import {useNavigate} from 'react-router-dom'; 3 | import {gql, useMutation} from "@apollo/client"; 4 | import {AUTH_TOKEN} from "../constants"; 5 | 6 | const SIGNUP_MUTATION = gql` 7 | mutation SignupMutation( 8 | $email: String! 9 | $password: String! 10 | $name: String! 11 | ) { 12 | signup( 13 | email: $email 14 | password: $password 15 | name: $name 16 | ) { 17 | token 18 | } 19 | } 20 | `; 21 | 22 | const LOGIN_MUTATION = gql` 23 | mutation LoginMutation( 24 | $email: String! 25 | $password: String! 26 | ) { 27 | login(email: $email, password: $password) { 28 | token 29 | } 30 | } 31 | `; 32 | 33 | const Login = () => { 34 | 35 | const navigate = useNavigate(); 36 | const [formState, setFormState] = useState({ 37 | login: true, 38 | email: '', 39 | password: '', 40 | name: '' 41 | }); 42 | 43 | const [login] = useMutation(LOGIN_MUTATION, { 44 | variables: { 45 | email: formState.email, 46 | password: formState.password 47 | }, 48 | onCompleted: ({login}) => { 49 | localStorage.setItem(AUTH_TOKEN, login.token); 50 | navigate('/'); 51 | } 52 | }); 53 | 54 | const [signup] = useMutation(SIGNUP_MUTATION, { 55 | variables: { 56 | name: formState.name, 57 | email: formState.email, 58 | password: formState.password 59 | }, 60 | onCompleted: ({signup}) => { 61 | localStorage.setItem(AUTH_TOKEN, signup.token); 62 | navigate('/'); 63 | } 64 | }); 65 | 66 | return ( 67 |
68 |

69 | {formState.login ? 'Login' : 'Sign Up'} 70 |

71 |
72 | {!formState.login && ( 73 | 76 | setFormState({ 77 | ...formState, 78 | name: e.target.value 79 | }) 80 | } 81 | type="text" 82 | placeholder="Your name" 83 | /> 84 | )} 85 | 88 | setFormState({ 89 | ...formState, 90 | email: e.target.value 91 | }) 92 | } 93 | type="text" 94 | placeholder="Your email address" 95 | /> 96 | 99 | setFormState({ 100 | ...formState, 101 | password: e.target.value 102 | }) 103 | } 104 | type="password" 105 | placeholder="Choose a safe password" 106 | /> 107 |
108 |
109 | 115 | 128 |
129 |
130 | ); 131 | }; 132 | 133 | export default Login; -------------------------------------------------------------------------------- /src/components/Search.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react'; 2 | import {useLazyQuery, gql} from '@apollo/client'; 3 | import Link from './Link'; 4 | 5 | const FEED_SEARCH_QUERY = gql` 6 | query FeedSearchQuery($filter: String!) { 7 | feed(filter: $filter) { 8 | id 9 | links { 10 | id 11 | url 12 | description 13 | createdAt 14 | postedBy { 15 | id 16 | name 17 | } 18 | votes { 19 | id 20 | user { 21 | id 22 | } 23 | } 24 | } 25 | } 26 | } 27 | `; 28 | 29 | const Search = () => { 30 | const [searchFilter, setSearchFilter] = useState(''); 31 | const [executeSearch, {data}] = useLazyQuery( 32 | FEED_SEARCH_QUERY 33 | ); 34 | 35 | return ( 36 | <> 37 |
38 | Search 39 | setSearchFilter(e.target.value)} 42 | /> 43 | 47 |
48 | {data && 49 | data.feed.links.map((link, index) => ( 50 | 51 | ))} 52 | 53 | ); 54 | }; 55 | 56 | export default Search; -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | export const AUTH_TOKEN = 'auth-token'; 2 | export const LINKS_PER_PAGE = 5; 3 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './styles/index.css'; 4 | import App from './components/App'; 5 | import {BrowserRouter} from 'react-router-dom'; 6 | import {setContext} from '@apollo/client/link/context'; 7 | import { split } from '@apollo/client'; 8 | import { WebSocketLink } from '@apollo/client/link/ws'; 9 | import { getMainDefinition } from '@apollo/client/utilities'; 10 | 11 | import { 12 | ApolloProvider, 13 | ApolloClient, 14 | createHttpLink, 15 | InMemoryCache 16 | } from '@apollo/client'; 17 | import {AUTH_TOKEN} from "./constants"; 18 | 19 | const httpLink = createHttpLink({ 20 | uri: 'http://localhost:4000' 21 | }); 22 | 23 | const authLink = setContext((_, {headers}) => { 24 | const token = localStorage.getItem(AUTH_TOKEN); 25 | return { 26 | headers: { 27 | ...headers, 28 | authorization: token ? `Bearer ${token}` : '' 29 | } 30 | }; 31 | }); 32 | 33 | const wsLink = new WebSocketLink({ 34 | uri: `ws://localhost:4000/graphql`, 35 | options: { 36 | reconnect: true, 37 | connectionParams: { 38 | authToken: localStorage.getItem(AUTH_TOKEN) 39 | } 40 | } 41 | }); 42 | 43 | const link = split( 44 | ({ query }) => { 45 | const { kind, operation } = getMainDefinition(query); 46 | return ( 47 | kind === 'OperationDefinition' && 48 | operation === 'subscription' 49 | ); 50 | }, 51 | wsLink, 52 | authLink.concat(httpLink) 53 | ); 54 | 55 | const client = new ApolloClient({ 56 | link, 57 | cache: new InMemoryCache({ 58 | typePolicies: { 59 | Link: { 60 | keyFields: ["id"] 61 | } 62 | } 63 | }) 64 | }); 65 | 66 | ReactDOM.render( 67 | 68 | 69 | 70 | 71 | , 72 | document.getElementById('root') 73 | ); 74 | -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({getCLS, getFID, getFCP, getLCP, getTTFB}) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /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'; 6 | -------------------------------------------------------------------------------- /src/styles/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/styles/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: Verdana, Geneva, sans-serif; 5 | } 6 | 7 | input { 8 | max-width: 500px; 9 | } 10 | 11 | .gray { 12 | color: #828282; 13 | } 14 | 15 | .orange { 16 | background-color: #ff6600; 17 | } 18 | 19 | .background-gray { 20 | background-color: rgb(246, 246, 239); 21 | } 22 | 23 | .f11 { 24 | font-size: 11px; 25 | } 26 | 27 | .w85 { 28 | width: 85%; 29 | } 30 | 31 | .button { 32 | font-family: monospace; 33 | font-size: 10pt; 34 | color: black; 35 | background-color: buttonface; 36 | text-align: center; 37 | padding: 2px 6px 3px; 38 | border-width: 2px; 39 | border-style: outset; 40 | border-color: buttonface; 41 | cursor: pointer; 42 | max-width: 250px; 43 | } -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | function timeDifference(current, previous) { 2 | const milliSecondsPerMinute = 60 * 1000; 3 | const milliSecondsPerHour = milliSecondsPerMinute * 60; 4 | const milliSecondsPerDay = milliSecondsPerHour * 24; 5 | const milliSecondsPerMonth = milliSecondsPerDay * 30; 6 | const milliSecondsPerYear = milliSecondsPerDay * 365; 7 | 8 | const elapsed = current - previous; 9 | 10 | if (elapsed < milliSecondsPerMinute / 3) { 11 | return 'just now'; 12 | } 13 | 14 | if (elapsed < milliSecondsPerMinute) { 15 | return 'less than 1 min ago'; 16 | } else if (elapsed < milliSecondsPerHour) { 17 | return ( 18 | Math.round(elapsed / milliSecondsPerMinute) + 19 | ' min ago' 20 | ); 21 | } else if (elapsed < milliSecondsPerDay) { 22 | return ( 23 | Math.round(elapsed / milliSecondsPerHour) + ' h ago' 24 | ); 25 | } else if (elapsed < milliSecondsPerMonth) { 26 | return ( 27 | Math.round(elapsed / milliSecondsPerDay) + ' days ago' 28 | ); 29 | } else if (elapsed < milliSecondsPerYear) { 30 | return ( 31 | Math.round(elapsed / milliSecondsPerMonth) + ' mo ago' 32 | ); 33 | } else { 34 | return ( 35 | Math.round(elapsed / milliSecondsPerYear) + 36 | ' years ago' 37 | ); 38 | } 39 | } 40 | 41 | export function timeDifferenceForDate(date) { 42 | const now = new Date().getTime(); 43 | const updated = new Date(date).getTime(); 44 | return timeDifference(now, updated); 45 | } --------------------------------------------------------------------------------