├── .gitignore ├── README.adoc ├── bloom └── twitter.bloom-perspective ├── code ├── csharp │ └── Example.cs ├── go │ └── example.go ├── graphql │ └── example.js ├── java │ └── Example.java ├── javascript │ └── example.js └── python │ └── example.py ├── data ├── twitter-40.dump ├── twitter-v2-40.dump ├── twitter-v2-43.dump └── twitter-v2-50.dump ├── documentation ├── img │ ├── example.png │ ├── model.png │ └── twitter.svg ├── twitter.adoc └── twitter.neo4j-browser-guide ├── graphql ├── .env ├── README.md ├── img │ └── playground1.png ├── index.js ├── lambda │ └── graphql │ │ └── graphql.js ├── package-lock.json ├── package.json └── schema.graphql ├── netlify.toml └── relate.project-install.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | *.class 4 | package-lock.json 5 | code/csharp/bin 6 | code/csharp/debug 7 | code/csharp/obj 8 | code/javascript/node_modules 9 | code/java/target 10 | pythonenv3.8 -------------------------------------------------------------------------------- /README.adoc: -------------------------------------------------------------------------------- 1 | :name: twitter 2 | :long-name: Twitter 3 | :description: Explore a social network with Neo4j's Twitter data 4 | :icon: documentation/img/twitter.svg 5 | :tags: example-data,dataset,twitter-data,social-network,social-media,user-data 6 | :author: Jennifer Reif 7 | :demodb: true 8 | :data: false 9 | :use-load-script: false 10 | :use-dump-file: data/twitter-40.dump 11 | :zip-file: false 12 | :use-plugin: false 13 | :target-db-version: 4.0 14 | :bloom-perspective: bloom/twitter.bloom-perspective 15 | :guide: documentation/twitter.neo4j-browser-guide 16 | :rendered-guide: https://guides.neo4j.com/sandbox/{name}/index.html 17 | :model: documentation/img/model.png 18 | :example: documentation/img/example.png 19 | 20 | :todo: false 21 | image::{icon}[width=100] 22 | 23 | == {long-name} Graph Example 24 | 25 | Description: _{description}_ 26 | 27 | ifeval::[{todo} != false] 28 | To Do: {todo} 29 | endif::[] 30 | 31 | .Model 32 | image::{model}[] 33 | 34 | .Example 35 | image::{example}[width=600] 36 | 37 | .Example Query: 38 | [source,cypher,role=query-example,param-name=screenName,param-value=NASA,result-column=hashtag,expected-result=earthlings] 39 | ---- 40 | MATCH (u:User {screen_name: $screenName})<-[r:MENTIONS]-(t:Tweet)-[r2:TAGS]->(h:Hashtag) 41 | RETURN h.name as hashtag 42 | ---- 43 | 44 | === Setup 45 | 46 | This is for Neo4j version: {target-db-version} 47 | 48 | ifeval::[{use-plugin} != false] 49 | Required plugins: {use-plugin} 50 | endif::[] 51 | 52 | ifeval::[{demodb} != false] 53 | The database is also available on https://demo.neo4jlabs.com:7473 54 | 55 | Username "{name}", password: "{name}", database: "{name}" 56 | endif::[] 57 | 58 | Rendered guide available via: `:play {rendered-guide}` 59 | 60 | Unrendered guide: link:{guide}[] 61 | 62 | Load graph data via the following: 63 | 64 | ifeval::[{data} != false] 65 | ==== Data files: `{data}` 66 | 67 | Import flat files (csv, json, etc) using Cypher's https://neo4j.com/docs/cypher-manual/current/clauses/load-csv/[`LOAD CSV`], https://neo4j.com/labs/apoc/[APOC library], or https://neo4j.com/developer/data-import/[other methods]. 68 | endif::[] 69 | 70 | ifeval::[{use-dump-file} != false] 71 | ==== Dump file: `{use-dump-file}` 72 | 73 | * Drop the file into the `Files` section of a project in Neo4j Desktop. Then choose the option to `Create new DBMS from dump` option from the file options. 74 | 75 | * Use the neo4j-admin tool to load data from the command line with the command below. 76 | 77 | [source,shell,subs=attributes] 78 | ---- 79 | bin/neo4j-admin load --from {use-dump-file} [--database "database"] 80 | ---- 81 | 82 | * Upload the dump file to Neo4j Aura via https://console.neo4j.io/#import-instructions 83 | endif::[] 84 | 85 | ifeval::[{use-load-script} != false] 86 | ==== Data load script: `{use-load-script}` 87 | 88 | [source,shell,subs=attributes] 89 | ---- 90 | bin/cypher-shell -u neo4j -p "password" -f {use-load-script} [-d "database"] 91 | ---- 92 | 93 | Or import in Neo4j Browser by dragging or pasting the content of {use-load-script}. 94 | endif::[] 95 | 96 | ifeval::[{zip-file} != false] 97 | ==== Zip file 98 | 99 | Download the zip file link:{repo}/raw/master/{name}.zip[{name}.zip] and add it as "project from file" to https://neo4j.com/developer/neo4j-desktop[Neo4j Desktop^]. 100 | endif::[] 101 | 102 | === Code Examples 103 | 104 | * link:code/javascript/example.js[JavaScript] 105 | * link:code/java/Example.java[Java] 106 | * link:code/csharp/Example.cs[C#] 107 | * link:code/python/example.py[Python] 108 | * link:code/go/example.go[Go] 109 | 110 | === GraphQL API 111 | 112 | See link:graphql[`/graphql` directory] for Node.js GraphQL API server example using link:https://www.npmjs.com/package/@neo4j/graphql[`@neo4j/graphql`] 113 | 114 | === Feedback 115 | 116 | Feel free to submit issues or pull requests for improvement on this repository. -------------------------------------------------------------------------------- /bloom/twitter.bloom-perspective: -------------------------------------------------------------------------------- 1 | {"name":"Twitter_sandbox_dump Perspective 1","id":"e1f78a70-8108-11eb-8f85-f185444ee3db","categories":[{"id":0,"name":"Other","color":"#6B6B6B","size":1,"icon":"no-icon","labels":[],"properties":[],"caption":[""]},{"id":1,"name":"Me","color":"#FFE081","size":1,"icon":"no-icon","labels":["Me"],"properties":[{"name":"screen_name","exclude":false,"isCaption":false,"dataType":"string"},{"name":"name","exclude":false,"isCaption":true,"dataType":"string"},{"name":"location","exclude":false,"isCaption":false,"dataType":"string"},{"name":"followers","exclude":false,"isCaption":false,"dataType":"bigint"},{"name":"following","exclude":false,"isCaption":false,"dataType":"bigint"},{"name":"url","exclude":false,"isCaption":false,"dataType":"string"},{"name":"profile_image_url","exclude":false,"isCaption":false,"dataType":"string"}],"caption":[""],"createdAt":1615316071604,"lastEditedAt":1615316071604},{"id":2,"name":"Tweet","color":"#C990C0","size":1,"icon":"no-icon","labels":["Tweet"],"properties":[{"name":"id","exclude":false,"isCaption":true,"dataType":"bigint"},{"name":"id_str","exclude":false,"isCaption":false,"dataType":"string"},{"name":"import_method","exclude":false,"isCaption":false,"dataType":"string"},{"name":"text","exclude":false,"isCaption":false,"dataType":"string"},{"name":"favorites","exclude":false,"isCaption":false,"dataType":"bigint"},{"name":"created_at","exclude":false,"isCaption":false,"dataType":"DateTime"}],"caption":[""],"createdAt":1615316071604,"lastEditedAt":1615316071604},{"id":3,"name":"Hashtag","color":"#F79767","size":1,"icon":"no-icon","labels":["Hashtag"],"properties":[{"name":"name","exclude":false,"isCaption":true,"dataType":"string"}],"caption":[""],"createdAt":1615316071604,"lastEditedAt":1615316071604},{"id":4,"name":"Link","color":"#57C7E3","size":1,"icon":"no-icon","labels":["Link"],"properties":[{"name":"url","exclude":false,"isCaption":true,"dataType":"string"}],"caption":[""],"createdAt":1615316071604,"lastEditedAt":1615316071604},{"id":5,"name":"Source","color":"#F16667","size":1,"icon":"no-icon","labels":["Source"],"properties":[{"name":"name","exclude":false,"isCaption":true,"dataType":"string"}],"caption":[""],"createdAt":1615316071604,"lastEditedAt":1615316071604}],"labels":{"Tweet":[{"propertyKey":"id","type":"Tweet","dataType":"bigint"},{"propertyKey":"id_str","type":"Tweet","dataType":"string"},{"propertyKey":"import_method","type":"Tweet","dataType":"string"},{"propertyKey":"text","type":"Tweet","dataType":"string"},{"propertyKey":"favorites","type":"Tweet","dataType":"bigint"},{"propertyKey":"created_at","type":"Tweet","dataType":"DateTime"}],"Me":[{"propertyKey":"screen_name","type":"Me","dataType":"string"},{"propertyKey":"name","type":"Me","dataType":"string"},{"propertyKey":"location","type":"Me","dataType":"string"},{"propertyKey":"followers","type":"Me","dataType":"bigint"},{"propertyKey":"following","type":"Me","dataType":"bigint"},{"propertyKey":"url","type":"Me","dataType":"string"},{"propertyKey":"profile_image_url","type":"Me","dataType":"string"}],"User":[{"propertyKey":"screen_name","type":"User","dataType":"string"},{"propertyKey":"name","type":"User","dataType":"string"},{"propertyKey":"location","type":"User","dataType":"string"},{"propertyKey":"followers","type":"User","dataType":"bigint"},{"propertyKey":"following","type":"User","dataType":"bigint"},{"propertyKey":"url","type":"User","dataType":"string"},{"propertyKey":"profile_image_url","type":"User","dataType":"string"},{"propertyKey":"statuses","type":"User","dataType":"bigint"}],"Hashtag":[{"propertyKey":"name","type":"Hashtag","dataType":"string"}],"Link":[{"propertyKey":"url","type":"Link","dataType":"string"}],"Source":[{"propertyKey":"name","type":"Source","dataType":"string"}]},"relationshipTypes":[{"properties":[],"name":"FOLLOWS","id":"FOLLOWS"},{"properties":[],"name":"POSTS","id":"POSTS"},{"properties":[],"name":"USING","id":"USING"},{"properties":[],"name":"TAGS","id":"TAGS"},{"properties":[],"name":"CONTAINS","id":"CONTAINS"},{"properties":[],"name":"MENTIONS","id":"MENTIONS"},{"properties":[],"name":"RETWEETS","id":"RETWEETS"},{"properties":[],"name":"REPLY_TO","id":"REPLY_TO"}],"palette":{"colors":["#FFE081","#C990C0","#F79767","#57C7E3","#F16667","#D9C8AE","#8DCC93","#ECB5C9","#4C8EDA","#FFC454","#DA7194","#569480","#848484","#D9D9D9"],"currentIndex":5},"createdAt":1615316071575,"lastEditedAt":1615316071575,"templates":[],"hiddenRelationshipTypes":[],"hiddenCategories":[],"hideUncategorisedData":false,"parentPerspectiveId":null,"metadata":{"pathSegments":[{"source":"Tweet","relationshipType":"USING","target":"Source"},{"source":"Me","relationshipType":"FOLLOWS","target":"User"},{"source":"User","relationshipType":"FOLLOWS","target":"Me"},{"source":"User","relationshipType":"FOLLOWS","target":"User"},{"source":"Me","relationshipType":"FOLLOWS","target":"Me"},{"source":"Tweet","relationshipType":"RETWEETS","target":"Tweet"},{"source":"Tweet","relationshipType":"REPLY_TO","target":"Tweet"},{"source":"Tweet","relationshipType":"CONTAINS","target":"Link"},{"source":"Tweet","relationshipType":"MENTIONS","target":"User"},{"source":"Tweet","relationshipType":"MENTIONS","target":"Me"},{"source":"Tweet","relationshipType":"TAGS","target":"Hashtag"},{"source":"Me","relationshipType":"POSTS","target":"Tweet"},{"source":"User","relationshipType":"POSTS","target":"Tweet"}],"indexes":[{"label":"Source","type":"native","propertyKeys":["name"]},{"label":"Tweet","type":"native","propertyKeys":["id"]},{"label":"Hashtag","type":"native","propertyKeys":["name"]},{"label":"User","type":"native","propertyKeys":["screen_name"]},{"label":"Link","type":"native","propertyKeys":["url"]},{"label":"Me","type":"native","isMetadataPropIndex":true,"propertyKeys":["screen_name","name","location","followers","following","url","profile_image_url"]}],"stats":{"labels":{},"relationshipTypes":{"FOLLOWS":44609,"POSTS":6398,"USING":6398,"TAGS":5724,"CONTAINS":5409,"MENTIONS":8027,"RETWEETS":1110,"REPLY_TO":846}}},"version":"1.5.1"} -------------------------------------------------------------------------------- /code/csharp/Example.cs: -------------------------------------------------------------------------------- 1 | // install dotnet core on your system 2 | // dotnet new console -o . 3 | // dotnet add package Neo4j.Driver 4 | // paste in this code into Program.cs 5 | // dotnet run 6 | 7 | using System; 8 | using System.Collections.Generic; 9 | using System.Text; 10 | using System.Threading.Tasks; 11 | using Neo4j.Driver; 12 | 13 | namespace dotnet { 14 | class Example { 15 | static async Task Main() { 16 | var driver = GraphDatabase.Driver("bolt://:", 17 | AuthTokens.Basic("", "")); 18 | 19 | var cypherQuery = 20 | @" 21 | MATCH (u:User {screen_name: $screenName})<-[r:MENTIONS]-(t:Tweet)-[r2:TAGS]->(h:Hashtag) 22 | RETURN h.name as hashtag 23 | "; 24 | 25 | var session = driver.AsyncSession(o => o.WithDatabase("neo4j")); 26 | var result = await session.ReadTransactionAsync(async tx => { 27 | var r = await tx.RunAsync(cypherQuery, 28 | new { screenName="NASA"}); 29 | return await r.ToListAsync(); 30 | }); 31 | 32 | await session?.CloseAsync(); 33 | foreach (var row in result) 34 | Console.WriteLine(row["hashtag"].As()); 35 | 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /code/go/example.go: -------------------------------------------------------------------------------- 1 | // go mod init main 2 | // go run example.go 3 | package main 4 | 5 | import ( 6 | "fmt" 7 | "github.com/neo4j/neo4j-go-driver/v4/neo4j" 8 | "io" 9 | "reflect" 10 | ) 11 | 12 | func main() { 13 | results, err := runQuery("bolt://:", "neo4j", "", "") 14 | if err != nil { 15 | panic(err) 16 | } 17 | for _, result := range results { 18 | fmt.Println(result) 19 | } 20 | } 21 | 22 | func runQuery(uri, database, username, password string) (result []string, err error) { 23 | driver, err := neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, "")) 24 | if err != nil { 25 | return nil, err 26 | } 27 | defer func() {err = handleClose(driver, err)}() 28 | session := driver.NewSession(neo4j.SessionConfig{AccessMode: neo4j.AccessModeRead, DatabaseName: database}) 29 | defer func() {err = handleClose(session, err)}() 30 | results, err := session.ReadTransaction(func(transaction neo4j.Transaction) (interface{}, error) { 31 | result, err := transaction.Run( 32 | ` 33 | MATCH (u:User {screen_name: $screenName})<-[r:MENTIONS]-(t:Tweet)-[r2:TAGS]->(h:Hashtag) 34 | RETURN h.name as hashtag 35 | `, map[string]interface{}{ 36 | "screenName": "NASA", 37 | }) 38 | if err != nil { 39 | return nil, err 40 | } 41 | var arr []string 42 | for result.Next() { 43 | value, found := result.Record().Get("hashtag") 44 | if found { 45 | arr = append(arr, value.(string)) 46 | } 47 | } 48 | if err = result.Err(); err != nil { 49 | return nil, err 50 | } 51 | return arr, nil 52 | }) 53 | if err != nil { 54 | return nil, err 55 | } 56 | result = results.([]string) 57 | return result, err 58 | } 59 | 60 | func handleClose(closer io.Closer, previousError error) error { 61 | err := closer.Close() 62 | if err == nil { 63 | return previousError 64 | } 65 | if previousError == nil { 66 | return err 67 | } 68 | return fmt.Errorf("%v closure error occurred:\n%s\ninitial error was:\n%w", reflect.TypeOf(closer), err.Error(), previousError) 69 | } 70 | -------------------------------------------------------------------------------- /code/graphql/example.js: -------------------------------------------------------------------------------- 1 | const { Neo4jGraphQL } = require("@neo4j/graphql"); 2 | const { ApolloServer } = require("apollo-server"); 3 | const neo4j = require("neo4j-driver"); 4 | 5 | const driver = neo4j.driver( 6 | "bolt://:", 7 | neo4j.auth.basic("", "") 8 | ); 9 | 10 | const typeDefs = /* GraphQL */ ` 11 | type Tweet { 12 | created_at: DateTime 13 | favorites: Int 14 | id: ID! 15 | id_str: String 16 | import_method: String 17 | text: String 18 | using: [Source] @relationship(type: "USING", direction: OUT) 19 | tags: [Hashtag] @relationship(type: "TAGS", direction: OUT) 20 | retweets: [Tweet] @relationship(type: "RETWEETS", direction: OUT) 21 | reply_to: [Tweet] @relationship(type: "REPLY_TO", direction: OUT) 22 | contains: [Link] @relationship(type: "CONTAINS", direction: OUT) 23 | posted_by: User @relationship(type: "POSTS", direction: IN) 24 | } 25 | 26 | type Me { 27 | followers: Int! 28 | following: Int! 29 | location: String! 30 | name: String! 31 | profile_image_url: String! 32 | screen_name: ID! 33 | posts: [Tweet] @relationship(type: "POSTS", direction: OUT) 34 | users: [User] @relationship(type: "FOLLOWS", direction: IN) 35 | tweets: [Tweet] @relationship(type: "MENTIONS", direction: IN) 36 | } 37 | 38 | type Hashtag { 39 | name: String! 40 | tweets: [Tweet] @relationship(type: "TAGS", direction: IN) 41 | num_tweets: Int 42 | @cypher(statement: "RETURN SIZE( (this)<-[:TAGS]-(:Tweet) )") 43 | } 44 | 45 | type Link { 46 | url: String! 47 | tweets: [Tweet] @relationship(type: "CONTAINS", direction: IN) 48 | } 49 | 50 | type Source { 51 | name: String! 52 | tweets: [Tweet] @relationship(type: "USING", direction: IN) 53 | } 54 | 55 | type User { 56 | followers: Int 57 | following: Int 58 | location: String 59 | name: String! 60 | profile_image_url: String 61 | screen_name: String! 62 | statuses: Int 63 | url: String 64 | posts: [Tweet] @relationship(type: "POSTS", direction: OUT) 65 | tweets: [Tweet] @relationship(type: "MENTIONS", direction: IN) 66 | } 67 | 68 | type UserCount { 69 | count: Int 70 | user: User 71 | } 72 | 73 | extend type User { 74 | topMentions: UserCount 75 | @cypher( 76 | statement: """ 77 | MATCH (this)-[:POSTS]->(t:Tweet)-[:MENTIONS]->(m:User) 78 | WITH m, COUNT(m.screen_name) AS count 79 | ORDER BY count DESC 80 | LIMIT 1 81 | RETURN { 82 | user: m {.*}, 83 | count: count 84 | } 85 | """ 86 | ) 87 | } 88 | 89 | extend type Tweet { 90 | mentions: [User] @relationship(type: "MENTIONS", direction: OUT) 91 | } 92 | `; 93 | 94 | // Create executable GraphQL schema from GraphQL type definitions, 95 | // using @neo4j/graphql to autogenerate resolvers 96 | const neoSchema = new Neo4jGraphQL({ 97 | typeDefs, 98 | debug: true, 99 | }); 100 | 101 | // Create ApolloServer instance that will serve GraphQL schema created above 102 | // Inject Neo4j driver instance into the context object, which will be passed 103 | // into each (autogenerated) resolver 104 | const server = new ApolloServer({ 105 | context: { driver }, 106 | schema: neoSchema.schema, 107 | introspection: true, 108 | playground: true, 109 | }); 110 | 111 | // Start ApolloServer 112 | server.listen().then(({ url }) => { 113 | console.log(`GraphQL server ready at ${url}`); 114 | }); 115 | -------------------------------------------------------------------------------- /code/java/Example.java: -------------------------------------------------------------------------------- 1 | // Add your the driver dependency to your pom.xml build.gradle etc. 2 | // Java Driver Dependency: http://search.maven.org/#artifactdetails|org.neo4j.driver|neo4j-java-driver|4.0.1|jar 3 | // Reactive Streams http://search.maven.org/#artifactdetails|org.reactivestreams|reactive-streams|1.0.3|jar 4 | // download jars into current directory 5 | // java -cp "*" Example.java 6 | 7 | import org.neo4j.driver.*; 8 | import static org.neo4j.driver.Values.parameters; 9 | 10 | public class Example { 11 | 12 | public static void main(String...args) { 13 | 14 | Driver driver = GraphDatabase.driver("bolt://:", 15 | AuthTokens.basic("","")); 16 | 17 | try (Session session = driver.session(SessionConfig.forDatabase("neo4j"))) { 18 | 19 | String cypherQuery = 20 | "MATCH (u:User {screen_name: $screenName})<-[r:MENTIONS]-(t:Tweet)-[r2:TAGS]->(h:Hashtag)\n" + 21 | "RETURN h.name as hashtag"; 22 | 23 | var result = session.readTransaction( 24 | tx -> tx.run(cypherQuery, 25 | parameters("screenName","NASA")) 26 | .list()); 27 | 28 | for (Record record : result) { 29 | System.out.println(record.get("hashtag").asString()); 30 | } 31 | } 32 | driver.close(); 33 | } 34 | } 35 | 36 | 37 | -------------------------------------------------------------------------------- /code/javascript/example.js: -------------------------------------------------------------------------------- 1 | // npm install --save neo4j-driver 2 | // node example.js 3 | const neo4j = require('neo4j-driver'); 4 | const driver = neo4j.driver('bolt://:', 5 | neo4j.auth.basic('', ''), 6 | {/* encrypted: 'ENCRYPTION_OFF' */}); 7 | 8 | const query = 9 | ` 10 | MATCH (u:User {screen_name: $screenName})<-[r:MENTIONS]-(t:Tweet)-[r2:TAGS]->(h:Hashtag) 11 | RETURN h.name as hashtag 12 | `; 13 | 14 | const params = {"screenName": "NASA"}; 15 | 16 | const session = driver.session({database:"neo4j"}); 17 | 18 | session.run(query, params) 19 | .then((result) => { 20 | result.records.forEach((record) => { 21 | console.log(record.get('hashtag')); 22 | }); 23 | session.close(); 24 | driver.close(); 25 | }) 26 | .catch((error) => { 27 | console.error(error); 28 | }); 29 | -------------------------------------------------------------------------------- /code/python/example.py: -------------------------------------------------------------------------------- 1 | # pip3 install neo4j-driver 2 | # python3 example.py 3 | 4 | from neo4j import GraphDatabase, basic_auth 5 | 6 | driver = GraphDatabase.driver( 7 | "bolt://:", 8 | auth=basic_auth("", "")) 9 | 10 | cypher_query = ''' 11 | MATCH (u:User {screen_name: $screenName})<-[r:MENTIONS]-(t:Tweet)-[r2:TAGS]->(h:Hashtag) 12 | RETURN h.name as hashtag 13 | ''' 14 | 15 | with driver.session(database="neo4j") as session: 16 | results = session.read_transaction( 17 | lambda tx: tx.run(cypher_query, 18 | screenName="NASA").data()) 19 | for record in results: 20 | print(record['hashtag']) 21 | 22 | driver.close() 23 | -------------------------------------------------------------------------------- /data/twitter-40.dump: -------------------------------------------------------------------------------- 1 | twitter-v2-40.dump -------------------------------------------------------------------------------- /data/twitter-v2-40.dump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neo4j-graph-examples/twitter-v2/43b2b8551a2ec98f27915f1f97bc64b76347ffa4/data/twitter-v2-40.dump -------------------------------------------------------------------------------- /data/twitter-v2-43.dump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neo4j-graph-examples/twitter-v2/43b2b8551a2ec98f27915f1f97bc64b76347ffa4/data/twitter-v2-43.dump -------------------------------------------------------------------------------- /data/twitter-v2-50.dump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neo4j-graph-examples/twitter-v2/43b2b8551a2ec98f27915f1f97bc64b76347ffa4/data/twitter-v2-50.dump -------------------------------------------------------------------------------- /documentation/img/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neo4j-graph-examples/twitter-v2/43b2b8551a2ec98f27915f1f97bc64b76347ffa4/documentation/img/example.png -------------------------------------------------------------------------------- /documentation/img/model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neo4j-graph-examples/twitter-v2/43b2b8551a2ec98f27915f1f97bc64b76347ffa4/documentation/img/model.png -------------------------------------------------------------------------------- /documentation/img/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /documentation/twitter.adoc: -------------------------------------------------------------------------------- 1 | == Twitter Graph 2 | 3 | Show data from your personal Twitter account 4 | 5 | _The Graph Your Network_ application inserts your Twitter activity into 6 | Neo4j. 7 | 8 | Here is a data model of the 9 | graph:image://neo4jsandbox.com/guides/twitter/img/twitter-data-model.svg[image] 10 | 11 | image:https://guides.neo4j.com/sandbox/twitter/images/click-next.png[image] 12 | 13 | == Twitter Graph 14 | 15 | Show data from your personal Twitter account 16 | 17 | _The Graph Your Network_ application inserts your Twitter activity into 18 | Neo4j. 19 | 20 | This application allows you to query things like: 21 | 22 | . Who's mentioning you on Twitter 23 | . Who are your most influential followers? 24 | . What tags you use frequently 25 | . How many people you follow also follow you back 26 | . People tweeting about you, but you don't follow 27 | . Links from intresting retweets 28 | . Other people tweeting with some of your top hashtags 29 | 30 | == Twitter Graph 31 | 32 | == Your mentions 33 | 34 | To the right is a giant code block containing a single Cypher query 35 | statement to determine who's mentioning you on Twitter. 36 | 37 | . Click on the code blocks 38 | . Notice they get copied to the editor above ↑ 39 | . Click the editor's play button to execute 40 | . Wait for the query to finish 41 | 42 | == Graph of some of your mentions 43 | 44 | [source,cypher] 45 | ---- 46 | // Graph of some of your mentions 47 | MATCH 48 | (u:Me:User)-[p:POSTS]->(t:Tweet)-[:MENTIONS]->(m:User) 49 | WITH 50 | u,p,t,m, COUNT(m.screen_name) AS count 51 | ORDER BY 52 | count DESC 53 | RETURN 54 | u,p,t,m 55 | LIMIT 10 56 | ---- 57 | 58 | == Details as a table 59 | 60 | [source,cypher] 61 | ---- 62 | // Detailed table of some of your mentions 63 | MATCH 64 | (u:User:Me)-[:POSTS]->(t:Tweet)-[:MENTIONS]->(m:User) 65 | RETURN 66 | m.screen_name AS screen_name, COUNT(m.screen_name) AS count 67 | ORDER BY 68 | count DESC 69 | LIMIT 10 70 | ---- 71 | 72 | == Twitter Graph 73 | 74 | == Most Influential Followers 75 | 76 | Who are your most influential followers? 77 | 78 | . Click on the code block 79 | . Notice it gets copied to the editor above ↑ 80 | . Click the editor's play button to execute 81 | . Wait for the query to finish 82 | 83 | [source,cypher] 84 | ---- 85 | // Most influential followers 86 | MATCH 87 | (follower:User)-[:FOLLOWS]->(u:User:Me) 88 | RETURN 89 | follower.screen_name AS user, follower.followers AS followers 90 | ORDER BY 91 | followers DESC 92 | LIMIT 10 93 | ---- 94 | 95 | == Twitter Graph 96 | 97 | == Most Tagged 98 | 99 | What hashtags have you used most often? 100 | 101 | . Click on the code block 102 | . Notice it gets copied to the editor above ↑ 103 | . Click the editor's play button to execute 104 | . Wait for the query to finish 105 | 106 | [source,cypher] 107 | ---- 108 | // The hashtags you have used most often 109 | MATCH 110 | (h:Hashtag)<-[:TAGS]-(t:Tweet)<-[:POSTS]-(u:User:Me) 111 | WITH 112 | h, COUNT(h) AS Hashtags 113 | ORDER BY 114 | Hashtags DESC 115 | LIMIT 10 116 | RETURN 117 | h.name, Hashtags 118 | ---- 119 | 120 | == Twitter Graph 121 | 122 | == Followback Rate 123 | 124 | At what rate do people you follow also follow you back? 125 | 126 | . Click on the code block 127 | . Notice it gets copied to the editor above ↑ 128 | . Click the editor's play button to execute 129 | . Wait for the query to finish 130 | 131 | [source,cypher] 132 | ---- 133 | // Followback rate 134 | MATCH 135 | (me:User:Me)-[:FOLLOWS]->(f) 136 | WITH 137 | me, f, size((f)-[:FOLLOWS]->(me)) as doesFollowBack 138 | RETURN 139 | SUM(doesFollowBack) / toFloat(COUNT(f)) AS followBackRate 140 | ---- 141 | 142 | == Twitter Graph 143 | 144 | == Follower Recommendations 145 | 146 | Who tweets about you, but you do not follow? 147 | 148 | . Click on the code block 149 | . Notice it gets copied to the editor above ↑ 150 | . Click the editor's play button to execute 151 | . Wait for the query to finish 152 | 153 | [source,cypher] 154 | ---- 155 | // Follower Recommendations - tweeting about you, but you don't follow 156 | MATCH 157 | (ou:User)-[:POSTS]->(t:Tweet)-[mt:MENTIONS]->(me:User:Me) 158 | WITH 159 | DISTINCT ou, me 160 | WHERE 161 | (ou)-[:FOLLOWS]->(me) 162 | AND NOT 163 | (me)-[:FOLLOWS]->(ou) 164 | RETURN 165 | ou.screen_name 166 | ---- 167 | 168 | == Twitter Graph 169 | 170 | == Links from interesting retweets 171 | 172 | What links do you retweet, and how often are they favorited? 173 | 174 | . Click on the code block 175 | . Notice it gets copied to the editor above ↑ 176 | . Click the editor's play button to execute 177 | . Wait for the query to finish 178 | 179 | [source,cypher] 180 | ---- 181 | // Links from interesting retweets 182 | MATCH 183 | (:User:Me)-[:POSTS]-> 184 | (t:Tweet)-[:RETWEETS]->(rt)-[:CONTAINS]->(link:Link) 185 | RETURN 186 | t.id_str AS tweet, link.url AS url, rt.favorites AS favorites 187 | ORDER BY 188 | favorites DESC 189 | LIMIT 10 190 | ---- 191 | 192 | == Twitter Graph 193 | 194 | == Common Hashtags 195 | 196 | What users tweet with some of your top hashtags? 197 | 198 | . Click on the code block 199 | . Notice it gets copied to the editor above ↑ 200 | . Click the editor's play button to execute 201 | . Wait for the query to finish 202 | 203 | [source,cypher] 204 | ---- 205 | // Users tweeting with your top hashtags 206 | MATCH 207 | (me:User:Me)-[:POSTS]->(tweet:Tweet)-[:TAGS]->(ht) 208 | MATCH 209 | (ht)<-[:TAGS]-(tweet2:Tweet)<-[:POSTS]-(sugg:User) 210 | WHERE 211 | sugg <> me 212 | AND NOT 213 | (tweet2)-[:RETWEETS]->(tweet) 214 | WITH 215 | sugg, collect(distinct(ht)) as tags 216 | RETURN 217 | sugg.screen_name as friend, size(tags) as common 218 | ORDER BY 219 | common DESC 220 | LIMIT 20 221 | ---- 222 | 223 | == Next steps 224 | 225 | * Getting Started with Neo4j 226 | * http://neo4j.com/download[Download Neo4j] 227 | 228 | == More code 229 | 230 | * Movie Graph - Movies and actors 231 | * Northwind Graph - from RDBMS to graph 232 | * Query Templates - common ad-hoc queries 233 | * Cypher - query language fundamentals 234 | 235 | == Reference 236 | 237 | * http://neo4j.com/developer[Developer resources] 238 | * http://neo4j.com/docs/%7B%7Bneo4j.version%20%7C%20neo4jdoc%20%7D%7D/[Neo4j 239 | Manual] 240 | -------------------------------------------------------------------------------- /documentation/twitter.neo4j-browser-guide: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 |

Twitter Graph

6 |

Show data from your personal Twitter account

7 |
8 |
9 |

The Graph Your Network application inserts your Twitter activity into Neo4j.

10 |

Here is a data model of the graph:

11 |
12 |
13 |
14 | 15 |
16 |

Twitter Graph

17 |

Show data from your personal Twitter account

18 |
19 |
20 |

The Graph Your Network application inserts your Twitter activity into Neo4j.

21 |

This application allows you to query things like:

22 |
    23 |
  1. Who's mentioning you on Twitter
  2. 24 |
  3. Who are your most influential followers?
  4. 25 |
  5. What tags you use frequently
  6. 26 |
  7. How many people you follow also follow you back
  8. 27 |
  9. People tweeting about you, but you don't follow
  10. 28 |
  11. Links from intresting retweets
  12. 29 |
  13. Other people tweeting with some of your top hashtags
  14. 30 |
31 |
32 |
33 | 34 |
35 |
Twitter Graph

36 |

Your mentions

37 |

38 | To the right is a giant code block containing a single Cypher query statement 39 | to determine who's mentioning you on Twitter. 40 |

41 |
    42 |
  1. Click on the code blocks
  2. 43 |
  3. Notice they get copied to the editor above ↑
  4. 44 |
  5. Click the editor's play button to execute
  6. 45 |
  7. Wait for the query to finish
  8. 46 |
47 |
48 |
49 |
Graph of some of your mentions
50 |
51 |
// Graph of some of your mentions
 52 | MATCH
 53 |   (u:Me:User)-[p:POSTS]->(t:Tweet)-[:MENTIONS]->(m:User)
 54 | WITH
 55 |   u,p,t,m, COUNT(m.screen_name) AS count
 56 | ORDER BY 
 57 |   count DESC
 58 | RETURN
 59 |   u,p,t,m
 60 | LIMIT 10
61 |
62 |
Details as a table
63 |
64 |
// Detailed table of some of your mentions
 65 | MATCH
 66 |   (u:User:Me)-[:POSTS]->(t:Tweet)-[:MENTIONS]->(m:User)
 67 | RETURN
 68 |   m.screen_name AS screen_name, COUNT(m.screen_name) AS count 
 69 | ORDER BY 
 70 |   count DESC
 71 | LIMIT 10
72 |
73 |
74 |
75 | 76 |
77 |
Twitter Graph

78 |

Most Influential Followers

79 |

Who are your most influential followers?

80 |
    81 |
  1. Click on the code block
  2. 82 |
  3. Notice it gets copied to the editor above ↑
  4. 83 |
  5. Click the editor's play button to execute
  6. 84 |
  7. Wait for the query to finish
  8. 85 |
86 |
87 |
88 |
89 |
// Most influential followers
 90 | MATCH 
 91 |   (follower:User)-[:FOLLOWS]->(u:User:Me)
 92 | RETURN 
 93 |   follower.screen_name AS user, follower.followers AS followers
 94 | ORDER BY
 95 |   followers DESC
 96 | LIMIT 10
97 |
98 |
99 |
100 | 101 |
102 |
Twitter Graph

103 |

Most Tagged

104 |

What hashtags have you used most often?

105 |
    106 |
  1. Click on the code block
  2. 107 |
  3. Notice it gets copied to the editor above ↑
  4. 108 |
  5. Click the editor's play button to execute
  6. 109 |
  7. Wait for the query to finish
  8. 110 |
111 |
112 |
113 |
114 |
// The hashtags you have used most often
115 | MATCH
116 |   (h:Hashtag)<-[:TAGS]-(t:Tweet)<-[:POSTS]-(u:User:Me)
117 | WITH 
118 |   h, COUNT(h) AS Hashtags
119 | ORDER BY 
120 |   Hashtags DESC
121 | LIMIT 10
122 | RETURN 
123 |   h.name, Hashtags
124 |
125 |
126 |
127 | 128 |
129 |
Twitter Graph

130 |

Followback Rate

131 |

At what rate do people you follow also follow you back?

132 |
    133 |
  1. Click on the code block
  2. 134 |
  3. Notice it gets copied to the editor above ↑
  4. 135 |
  5. Click the editor's play button to execute
  6. 136 |
  7. Wait for the query to finish
  8. 137 |
138 |
139 |
140 |
141 |
// Followback rate
142 | MATCH 
143 |   (me:User:Me)-[:FOLLOWS]->(f)
144 | WITH 
145 |   me, f, size((f)-[:FOLLOWS]->(me)) as doesFollowBack
146 | RETURN
147 |   SUM(doesFollowBack) / toFloat(COUNT(f))  AS followBackRate
148 |
149 |
150 |
151 | 152 |
153 |
Twitter Graph

154 |

Follower Recommendations

155 |

Who tweets about you, but you do not follow?

156 |
    157 |
  1. Click on the code block
  2. 158 |
  3. Notice it gets copied to the editor above ↑
  4. 159 |
  5. Click the editor's play button to execute
  6. 160 |
  7. Wait for the query to finish
  8. 161 |
162 |
163 |
164 |
165 |
// Follower Recommendations - tweeting about you, but you don't follow
166 | MATCH 
167 |   (ou:User)-[:POSTS]->(t:Tweet)-[mt:MENTIONS]->(me:User:Me)
168 | WITH 
169 |   DISTINCT ou, me
170 | WHERE
171 |   (ou)-[:FOLLOWS]->(me)
172 |   AND NOT 
173 |     (me)-[:FOLLOWS]->(ou)
174 | RETURN 
175 |   ou.screen_name
176 |
177 |
178 |
179 | 180 |
181 |
Twitter Graph

182 |

Links from interesting retweets

183 |

What links do you retweet, and how often are they favorited?

184 |
    185 |
  1. Click on the code block
  2. 186 |
  3. Notice it gets copied to the editor above ↑
  4. 187 |
  5. Click the editor's play button to execute
  6. 188 |
  7. Wait for the query to finish
  8. 189 |
190 |
191 |
192 |
193 |
// Links from interesting retweets
194 | MATCH
195 |   (:User:Me)-[:POSTS]->
196 |   (t:Tweet)-[:RETWEETS]->(rt)-[:CONTAINS]->(link:Link)
197 | RETURN
198 |   t.id_str AS tweet, link.url AS url, rt.favorites AS favorites
199 | ORDER BY
200 |   favorites DESC
201 | LIMIT 10
202 |
203 |
204 |
205 | 206 |
207 |
Twitter Graph

208 |

Common Hashtags

209 |

What users tweet with some of your top hashtags?

210 |
    211 |
  1. Click on the code block
  2. 212 |
  3. Notice it gets copied to the editor above ↑
  4. 213 |
  5. Click the editor's play button to execute
  6. 214 |
  7. Wait for the query to finish
  8. 215 |
216 |
217 |
218 |
219 |
// Users tweeting with your top hashtags
220 | MATCH
221 |   (me:User:Me)-[:POSTS]->(tweet:Tweet)-[:TAGS]->(ht)
222 | MATCH
223 |   (ht)<-[:TAGS]-(tweet2:Tweet)<-[:POSTS]-(sugg:User)
224 | WHERE
225 |   sugg <> me
226 |   AND NOT
227 |   (tweet2)-[:RETWEETS]->(tweet)
228 | WITH
229 |   sugg, collect(distinct(ht)) as tags
230 | RETURN
231 |   sugg.screen_name as friend, size(tags) as common
232 | ORDER BY
233 |   common DESC
234 | LIMIT 20
235 |
236 |
237 |
238 | 239 |
240 |

Next steps

241 | 245 |
246 |
247 |

More code

248 | 254 |
255 |
256 |

Reference

257 | 261 |
262 |
263 |
264 |
265 | -------------------------------------------------------------------------------- /graphql/.env: -------------------------------------------------------------------------------- 1 | NEO4J_URI=neo4j+s://demo.neo4jlabs.com:7687 2 | NEO4J_USER=twitter 3 | NEO4J_PASSWORD=twitter 4 | NEO4J_DATABASE=twitter -------------------------------------------------------------------------------- /graphql/README.md: -------------------------------------------------------------------------------- 1 | [![Open in CodeSandbox](https://img.shields.io/badge/Open%20in-CodeSandbox-blue?style=flat-square&logo=codesandbox)](https://codesandbox.io/s/github/neo4j-graph-examples/twitter-v2/tree/main/graphql?file=/schema.graphql) 2 | 3 | # GraphQL API 4 | 5 | This directory contains a Node.js GraphQL API application using [`@neo4j/graphql`](https://www.npmjs.com/package/@neo4j/graphql). 6 | 7 | Try it live on CodeSandbox [here](https://codesandbox.io/s/github/neo4j-graph-examples/twitter-v2/tree/main/graphql?file=/schema.graphql) 8 | 9 | ## Setup 10 | 11 | First, edit `.env`, replacing the defaults with your database connection string, user, and database (optional): 12 | 13 | ``` 14 | NEO4J_URI= 15 | NEO4J_USER= 16 | NEO4J_PASSWORD= 17 | NEO4J_DATABASE= 18 | ``` 19 | 20 | The `NEO4J_DATABASE` environment variable is optional and can be omitted. When omitted the default database will be used. 21 | 22 | Next, install dependencies. 23 | 24 | ``` 25 | npm install 26 | ``` 27 | 28 | Then start the API application, 29 | 30 | ``` 31 | npm run start 32 | ``` 33 | 34 | This will start a local GraphQL API server at `localhost:4000`. 35 | 36 | ## Example GraphQL Queries 37 | 38 | ```GraphQL 39 | { 40 | hashtags( 41 | where: { 42 | name_IN: ["nodes2020", "twin4j", "neo4j", "grandstack", "graphql"] 43 | } 44 | options: { sort: name_DESC } 45 | ) { 46 | name 47 | tweets(options: { limit: 1 }) { 48 | text 49 | created_at 50 | posted_by { 51 | name 52 | } 53 | tags { 54 | name 55 | num_tweets 56 | } 57 | } 58 | } 59 | } 60 | ``` 61 | 62 | ![](img/playground1.png) 63 | -------------------------------------------------------------------------------- /graphql/img/playground1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neo4j-graph-examples/twitter-v2/43b2b8551a2ec98f27915f1f97bc64b76347ffa4/graphql/img/playground1.png -------------------------------------------------------------------------------- /graphql/index.js: -------------------------------------------------------------------------------- 1 | const { Neo4jGraphQL } = require("@neo4j/graphql"); 2 | const { ApolloServer } = require("apollo-server"); 3 | const neo4j = require("neo4j-driver"); 4 | const fs = require("fs"); 5 | const dotenv = require("dotenv"); 6 | const path = require("path"); 7 | 8 | // Load contents of .env as environment variables 9 | dotenv.config(); 10 | 11 | // Load GraphQL type definitions from schema.graphql file 12 | const typeDefs = fs 13 | .readFileSync(path.join(__dirname, "schema.graphql")) 14 | .toString("utf-8"); 15 | 16 | // Create executable GraphQL schema from GraphQL type definitions, 17 | // using @neo4j/graphql to autogenerate resolvers 18 | const neoSchema = new Neo4jGraphQL({ 19 | typeDefs, 20 | debug: true, 21 | }); 22 | 23 | // Create Neo4j driver instance 24 | const driver = neo4j.driver( 25 | process.env.NEO4J_URI, 26 | neo4j.auth.basic(process.env.NEO4J_USER, process.env.NEO4J_PASSWORD) 27 | ); 28 | 29 | // Create ApolloServer instance that will serve GraphQL schema created above 30 | // Inject Neo4j driver instance into the context object, which will be passed 31 | // into each (autogenerated) resolver 32 | const server = new ApolloServer({ 33 | context: { driver, driverConfig: { database: process.env.NEO4J_DATABASE } }, 34 | schema: neoSchema.schema, 35 | introspection: true, 36 | playground: true, 37 | }); 38 | 39 | // Start ApolloServer 40 | server.listen().then(({ url }) => { 41 | console.log(`GraphQL server ready at ${url}`); 42 | }); -------------------------------------------------------------------------------- /graphql/lambda/graphql/graphql.js: -------------------------------------------------------------------------------- 1 | const { ApolloServer } = require("apollo-server-lambda"); 2 | const neo4j = require("neo4j-driver"); 3 | const { Neo4jGraphQL } = require("@neo4j/graphql"); 4 | const fs = require("fs"); 5 | 6 | // The schema.graphql file is copied to this directory as part of the Netlify build process 7 | // see netlify.toml at project root 8 | const typeDefs = fs 9 | .readFileSync(require.resolve("./schema.graphql")) 10 | .toString("utf-8"); 11 | 12 | const neoSchema = new Neo4jGraphQL({ 13 | typeDefs, 14 | }); 15 | 16 | const driver = neo4j.driver( 17 | process.env.NEO4J_URI, 18 | neo4j.auth.basic(process.env.NEO4J_USER, process.env.NEO4J_PASSWORD) 19 | ); 20 | 21 | const server = new ApolloServer({ 22 | schema: neoSchema.schema, 23 | context: ({ event }) => { 24 | return { 25 | driver, 26 | driverConfig: { database: process.env.NEO4J_DATABASE }, 27 | }; 28 | }, 29 | introspection: true, 30 | playground: true, 31 | }); 32 | 33 | exports.handler = server.createHandler({ 34 | cors: { 35 | origin: "*", 36 | credentials: true, 37 | }, 38 | }); 39 | -------------------------------------------------------------------------------- /graphql/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-twitter", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@apollo/protobufjs": { 8 | "version": "1.2.0", 9 | "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.0.tgz", 10 | "integrity": "sha512-TBgsADig/K4Hx71uQO6KPLxgoE/ORhPGh/HgouHru+cum8RLDfAfEY5Dde+cNala+luGI2X4Rs42pLWRud7/WA==", 11 | "requires": { 12 | "@protobufjs/aspromise": "^1.1.2", 13 | "@protobufjs/base64": "^1.1.2", 14 | "@protobufjs/codegen": "^2.0.4", 15 | "@protobufjs/eventemitter": "^1.1.0", 16 | "@protobufjs/fetch": "^1.1.0", 17 | "@protobufjs/float": "^1.0.2", 18 | "@protobufjs/inquire": "^1.1.0", 19 | "@protobufjs/path": "^1.1.2", 20 | "@protobufjs/pool": "^1.1.0", 21 | "@protobufjs/utf8": "^1.1.0", 22 | "@types/long": "^4.0.0", 23 | "@types/node": "^10.1.0", 24 | "long": "^4.0.0" 25 | }, 26 | "dependencies": { 27 | "@types/node": { 28 | "version": "10.17.58", 29 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.58.tgz", 30 | "integrity": "sha512-Dn5RBxLohjdHFj17dVVw3rtrZAeXeWg+LQfvxDIW/fdPkSiuQk7h3frKMYtsQhtIW42wkErDcy9UMVxhGW4O7w==" 31 | } 32 | } 33 | }, 34 | "@apollographql/apollo-tools": { 35 | "version": "0.4.14", 36 | "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.14.tgz", 37 | "integrity": "sha512-oTTq9G3rC47H/xd6MEtLgpbXNUbsu0WpclJ5RjSARJvUd7jKwmwUABr9g1EG68tK7pCdCRU93QL3WQT0XWhDcw==", 38 | "requires": { 39 | "apollo-env": "^0.9.2" 40 | } 41 | }, 42 | "@apollographql/graphql-playground-html": { 43 | "version": "1.6.27", 44 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz", 45 | "integrity": "sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw==", 46 | "requires": { 47 | "xss": "^1.0.8" 48 | } 49 | }, 50 | "@apollographql/graphql-upload-8-fork": { 51 | "version": "8.1.3", 52 | "resolved": "https://registry.npmjs.org/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz", 53 | "integrity": "sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==", 54 | "requires": { 55 | "@types/express": "*", 56 | "@types/fs-capacitor": "*", 57 | "@types/koa": "*", 58 | "busboy": "^0.3.1", 59 | "fs-capacitor": "^2.0.4", 60 | "http-errors": "^1.7.3", 61 | "object-path": "^0.11.4" 62 | } 63 | }, 64 | "@ardatan/aggregate-error": { 65 | "version": "0.0.6", 66 | "resolved": "https://registry.npmjs.org/@ardatan/aggregate-error/-/aggregate-error-0.0.6.tgz", 67 | "integrity": "sha512-vyrkEHG1jrukmzTPtyWB4NLPauUw5bQeg4uhn8f+1SSynmrOcyvlb1GKQjjgoBzElLdfXCRYX8UnBlhklOHYRQ==", 68 | "requires": { 69 | "tslib": "~2.0.1" 70 | }, 71 | "dependencies": { 72 | "tslib": { 73 | "version": "2.0.3", 74 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", 75 | "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" 76 | } 77 | } 78 | }, 79 | "@babel/runtime": { 80 | "version": "7.13.17", 81 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.17.tgz", 82 | "integrity": "sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA==", 83 | "requires": { 84 | "regenerator-runtime": "^0.13.4" 85 | } 86 | }, 87 | "@graphql-tools/merge": { 88 | "version": "6.2.13", 89 | "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-6.2.13.tgz", 90 | "integrity": "sha512-Qjlki0fp+bBQPinhdv7rv24eurvThZ5oIFvGMpLxMZplbw/ovJ2c6llwXr5PCuWAk9HGZsyM9NxxDgtTRfq3dQ==", 91 | "requires": { 92 | "@graphql-tools/schema": "^7.0.0", 93 | "@graphql-tools/utils": "^7.7.0", 94 | "tslib": "~2.2.0" 95 | } 96 | }, 97 | "@graphql-tools/schema": { 98 | "version": "7.1.3", 99 | "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-7.1.3.tgz", 100 | "integrity": "sha512-ZY76hmcJlF1iyg3Im0sQ3ASRkiShjgv102vLTVcH22lEGJeCaCyyS/GF1eUHom418S60bS8Th6+autRUxfBiBg==", 101 | "requires": { 102 | "@graphql-tools/utils": "^7.1.2", 103 | "tslib": "~2.1.0" 104 | }, 105 | "dependencies": { 106 | "tslib": { 107 | "version": "2.1.0", 108 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", 109 | "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" 110 | } 111 | } 112 | }, 113 | "@graphql-tools/utils": { 114 | "version": "7.8.0", 115 | "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-7.8.0.tgz", 116 | "integrity": "sha512-nORIltDwBdsc3Ew+vuXISTZw6gpRd3UkK+6HNY3knNca6apTDj7ygcJmgsFKjSyUf7xtukddTcF6Js9kPuJr6g==", 117 | "requires": { 118 | "@ardatan/aggregate-error": "0.0.6", 119 | "camel-case": "4.1.2", 120 | "tslib": "~2.2.0" 121 | } 122 | }, 123 | "@josephg/resolvable": { 124 | "version": "1.0.0", 125 | "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.0.tgz", 126 | "integrity": "sha512-OfTtjoqB2doov5aTJxkyAMK8dXoo7CjCUQSYUEtiY34jbWduOGV7+168tmCT8COMsUEd5DMSFg/0iAOPCBTNAQ==" 127 | }, 128 | "@neo4j/graphql": { 129 | "version": "1.0.0-beta.3", 130 | "resolved": "https://registry.npmjs.org/@neo4j/graphql/-/graphql-1.0.0-beta.3.tgz", 131 | "integrity": "sha512-/TldtGnkqCUERQp6RTPhG9AK3bxFhBOxEBhRR+3RZL3v2LfiHnK9abZuaVctgnyDxyuLm3MtCbT03+z5/Cme6Q==", 132 | "requires": { 133 | "@graphql-tools/merge": "^6.2.13", 134 | "@graphql-tools/schema": "^7.1.3", 135 | "camelcase": "^6.2.0", 136 | "debug": "^4.3.1", 137 | "deep-equal": "^2.0.5", 138 | "dot-prop": "^6.0.1", 139 | "graphql-compose": "^7.25.1", 140 | "graphql-parse-resolve-info": "^4.11.0", 141 | "jsonwebtoken": "^8.5.1", 142 | "pluralize": "^8.0.0", 143 | "upper-case-first": "^2.0.2" 144 | } 145 | }, 146 | "@protobufjs/aspromise": { 147 | "version": "1.1.2", 148 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 149 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 150 | }, 151 | "@protobufjs/base64": { 152 | "version": "1.1.2", 153 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 154 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 155 | }, 156 | "@protobufjs/codegen": { 157 | "version": "2.0.4", 158 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 159 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 160 | }, 161 | "@protobufjs/eventemitter": { 162 | "version": "1.1.0", 163 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 164 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 165 | }, 166 | "@protobufjs/fetch": { 167 | "version": "1.1.0", 168 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 169 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 170 | "requires": { 171 | "@protobufjs/aspromise": "^1.1.1", 172 | "@protobufjs/inquire": "^1.1.0" 173 | } 174 | }, 175 | "@protobufjs/float": { 176 | "version": "1.0.2", 177 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 178 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 179 | }, 180 | "@protobufjs/inquire": { 181 | "version": "1.1.0", 182 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 183 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 184 | }, 185 | "@protobufjs/path": { 186 | "version": "1.1.2", 187 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 188 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 189 | }, 190 | "@protobufjs/pool": { 191 | "version": "1.1.0", 192 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 193 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 194 | }, 195 | "@protobufjs/utf8": { 196 | "version": "1.1.0", 197 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 198 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 199 | }, 200 | "@types/accepts": { 201 | "version": "1.3.5", 202 | "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", 203 | "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", 204 | "requires": { 205 | "@types/node": "*" 206 | } 207 | }, 208 | "@types/aws-lambda": { 209 | "version": "8.10.76", 210 | "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.76.tgz", 211 | "integrity": "sha512-lCTyeRm3NWqSwDnoji0z82Pl0tsOpr1p+33AiNeidgarloWXh3wdiVRUuxEa+sY9S5YLOYGz5X3N3Zvpibvm5w==" 212 | }, 213 | "@types/body-parser": { 214 | "version": "1.19.0", 215 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 216 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 217 | "requires": { 218 | "@types/connect": "*", 219 | "@types/node": "*" 220 | } 221 | }, 222 | "@types/connect": { 223 | "version": "3.4.34", 224 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", 225 | "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", 226 | "requires": { 227 | "@types/node": "*" 228 | } 229 | }, 230 | "@types/content-disposition": { 231 | "version": "0.5.3", 232 | "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz", 233 | "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==" 234 | }, 235 | "@types/cookies": { 236 | "version": "0.7.6", 237 | "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.6.tgz", 238 | "integrity": "sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w==", 239 | "requires": { 240 | "@types/connect": "*", 241 | "@types/express": "*", 242 | "@types/keygrip": "*", 243 | "@types/node": "*" 244 | } 245 | }, 246 | "@types/cors": { 247 | "version": "2.8.10", 248 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", 249 | "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==" 250 | }, 251 | "@types/express": { 252 | "version": "4.17.11", 253 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz", 254 | "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==", 255 | "requires": { 256 | "@types/body-parser": "*", 257 | "@types/express-serve-static-core": "^4.17.18", 258 | "@types/qs": "*", 259 | "@types/serve-static": "*" 260 | } 261 | }, 262 | "@types/express-serve-static-core": { 263 | "version": "4.17.19", 264 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz", 265 | "integrity": "sha512-DJOSHzX7pCiSElWaGR8kCprwibCB/3yW6vcT8VG3P0SJjnv19gnWG/AZMfM60Xj/YJIp/YCaDHyvzsFVeniARA==", 266 | "requires": { 267 | "@types/node": "*", 268 | "@types/qs": "*", 269 | "@types/range-parser": "*" 270 | } 271 | }, 272 | "@types/fs-capacitor": { 273 | "version": "2.0.0", 274 | "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", 275 | "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==", 276 | "requires": { 277 | "@types/node": "*" 278 | } 279 | }, 280 | "@types/http-assert": { 281 | "version": "1.5.1", 282 | "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", 283 | "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==" 284 | }, 285 | "@types/http-errors": { 286 | "version": "1.8.0", 287 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", 288 | "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==" 289 | }, 290 | "@types/keygrip": { 291 | "version": "1.0.2", 292 | "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", 293 | "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" 294 | }, 295 | "@types/koa": { 296 | "version": "2.13.1", 297 | "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.1.tgz", 298 | "integrity": "sha512-Qbno7FWom9nNqu0yHZ6A0+RWt4mrYBhw3wpBAQ3+IuzGcLlfeYkzZrnMq5wsxulN2np8M4KKeUpTodsOsSad5Q==", 299 | "requires": { 300 | "@types/accepts": "*", 301 | "@types/content-disposition": "*", 302 | "@types/cookies": "*", 303 | "@types/http-assert": "*", 304 | "@types/http-errors": "*", 305 | "@types/keygrip": "*", 306 | "@types/koa-compose": "*", 307 | "@types/node": "*" 308 | } 309 | }, 310 | "@types/koa-compose": { 311 | "version": "3.2.5", 312 | "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", 313 | "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", 314 | "requires": { 315 | "@types/koa": "*" 316 | } 317 | }, 318 | "@types/long": { 319 | "version": "4.0.1", 320 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 321 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 322 | }, 323 | "@types/mime": { 324 | "version": "1.3.2", 325 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", 326 | "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" 327 | }, 328 | "@types/node": { 329 | "version": "15.0.0", 330 | "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.0.tgz", 331 | "integrity": "sha512-YN1d+ae2MCb4U0mMa+Zlb5lWTdpFShbAj5nmte6lel27waMMBfivrm0prC16p/Di3DyTrmerrYUT8/145HXxVw==" 332 | }, 333 | "@types/node-fetch": { 334 | "version": "2.5.10", 335 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz", 336 | "integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==", 337 | "requires": { 338 | "@types/node": "*", 339 | "form-data": "^3.0.0" 340 | } 341 | }, 342 | "@types/qs": { 343 | "version": "6.9.6", 344 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", 345 | "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" 346 | }, 347 | "@types/range-parser": { 348 | "version": "1.2.3", 349 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 350 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 351 | }, 352 | "@types/serve-static": { 353 | "version": "1.13.9", 354 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", 355 | "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", 356 | "requires": { 357 | "@types/mime": "^1", 358 | "@types/node": "*" 359 | } 360 | }, 361 | "@types/ws": { 362 | "version": "7.4.2", 363 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.2.tgz", 364 | "integrity": "sha512-PbeN0Eydl7LQl4OIav29YmkO2LxbVuz3nZD/kb19lOS+wLgIkRbWMNmU/QQR7ABpOJ7D7xDOU8co7iohObewrw==", 365 | "requires": { 366 | "@types/node": "*" 367 | } 368 | }, 369 | "@wry/equality": { 370 | "version": "0.1.11", 371 | "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", 372 | "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", 373 | "requires": { 374 | "tslib": "^1.9.3" 375 | }, 376 | "dependencies": { 377 | "tslib": { 378 | "version": "1.14.1", 379 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 380 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 381 | } 382 | } 383 | }, 384 | "accepts": { 385 | "version": "1.3.7", 386 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 387 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 388 | "requires": { 389 | "mime-types": "~2.1.24", 390 | "negotiator": "0.6.2" 391 | } 392 | }, 393 | "apollo-cache-control": { 394 | "version": "0.12.0", 395 | "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.12.0.tgz", 396 | "integrity": "sha512-kClF5rfAm159Nboul1LxA+l58Tjz0M8L1GUknEMpZt0UHhILLAn3BfcG3ToX4TbNoR9M57kKMUcbPWLdy3Up7w==", 397 | "requires": { 398 | "apollo-server-env": "^3.0.0", 399 | "apollo-server-plugin-base": "^0.11.0" 400 | } 401 | }, 402 | "apollo-datasource": { 403 | "version": "0.8.0", 404 | "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.8.0.tgz", 405 | "integrity": "sha512-gXgsGVLuejLc138z/2jUjPAzadDQxWbcLJyBgaQsg5BaXJNkv5uW/NjiSPk00cK51hyZrb0Xx8a+L+wPk2qIBA==", 406 | "requires": { 407 | "apollo-server-caching": "^0.6.0", 408 | "apollo-server-env": "^3.0.0" 409 | } 410 | }, 411 | "apollo-env": { 412 | "version": "0.9.2", 413 | "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.9.2.tgz", 414 | "integrity": "sha512-YUai2qCVenzOr3v1K1Ad/cUqLqvIQxIWjjAWDU0Q00VjegHxjIOyamdpcYkACCIkrb0Kthj4Slql4+d5ZXyeXQ==", 415 | "requires": { 416 | "@types/node-fetch": "2.5.10", 417 | "core-js": "^3.0.1", 418 | "node-fetch": "^2.2.0", 419 | "sha.js": "^2.4.11" 420 | } 421 | }, 422 | "apollo-graphql": { 423 | "version": "0.6.1", 424 | "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.6.1.tgz", 425 | "integrity": "sha512-ZRXAV+k+hboCVS+FW86FW/QgnDR7gm/xMUwJPGXEbV53OLGuQQdIT0NCYK7AzzVkCfsbb7NJ3mmEclkZY9uuxQ==", 426 | "requires": { 427 | "apollo-env": "^0.6.6", 428 | "lodash.sortby": "^4.7.0" 429 | }, 430 | "dependencies": { 431 | "@types/node-fetch": { 432 | "version": "2.5.7", 433 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", 434 | "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", 435 | "requires": { 436 | "@types/node": "*", 437 | "form-data": "^3.0.0" 438 | } 439 | }, 440 | "apollo-env": { 441 | "version": "0.6.6", 442 | "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.6.tgz", 443 | "integrity": "sha512-hXI9PjJtzmD34XviBU+4sPMOxnifYrHVmxpjykqI/dUD2G3yTiuRaiQqwRwB2RCdwC1Ug/jBfoQ/NHDTnnjndQ==", 444 | "requires": { 445 | "@types/node-fetch": "2.5.7", 446 | "core-js": "^3.0.1", 447 | "node-fetch": "^2.2.0", 448 | "sha.js": "^2.4.11" 449 | } 450 | } 451 | } 452 | }, 453 | "apollo-link": { 454 | "version": "1.2.14", 455 | "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", 456 | "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", 457 | "requires": { 458 | "apollo-utilities": "^1.3.0", 459 | "ts-invariant": "^0.4.0", 460 | "tslib": "^1.9.3", 461 | "zen-observable-ts": "^0.8.21" 462 | }, 463 | "dependencies": { 464 | "tslib": { 465 | "version": "1.14.1", 466 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 467 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 468 | } 469 | } 470 | }, 471 | "apollo-reporting-protobuf": { 472 | "version": "0.6.2", 473 | "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.2.tgz", 474 | "integrity": "sha512-WJTJxLM+MRHNUxt1RTl4zD0HrLdH44F2mDzMweBj1yHL0kSt8I1WwoiF/wiGVSpnG48LZrBegCaOJeuVbJTbtw==", 475 | "requires": { 476 | "@apollo/protobufjs": "^1.0.3" 477 | } 478 | }, 479 | "apollo-server": { 480 | "version": "2.23.0", 481 | "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-2.23.0.tgz", 482 | "integrity": "sha512-BS+8uAJV2qYLqu+y+KIQyfR3yN2muBtql6lvfwJh4fRgUo6HU5Cc3nTA9jHbgEWE/uiyEn4eqOv1kieHIQmH6w==", 483 | "requires": { 484 | "apollo-server-core": "^2.23.0", 485 | "apollo-server-express": "^2.23.0", 486 | "express": "^4.0.0", 487 | "graphql-subscriptions": "^1.0.0", 488 | "graphql-tools": "^4.0.8", 489 | "stoppable": "^1.1.0" 490 | } 491 | }, 492 | "apollo-server-caching": { 493 | "version": "0.6.0", 494 | "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.6.0.tgz", 495 | "integrity": "sha512-SfjKaccrhRzUQ8TAke9FrYppp4pZV3Rp8KCs+4Ox3kGtbco68acRPJkiYYtSVc4idR8XNAUOOVfAEZVNHdZQKQ==", 496 | "requires": { 497 | "lru-cache": "^6.0.0" 498 | } 499 | }, 500 | "apollo-server-core": { 501 | "version": "2.23.0", 502 | "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.23.0.tgz", 503 | "integrity": "sha512-3/a4LPgRADc8CdT/nRh7W0CAqQv3Q4DJvakWQgKqGSqDEb/0u4IBynYjlQKuPBi4wwKdeK2Hb1wiQLl+zu4StQ==", 504 | "requires": { 505 | "@apollographql/apollo-tools": "^0.4.3", 506 | "@apollographql/graphql-playground-html": "1.6.27", 507 | "@apollographql/graphql-upload-8-fork": "^8.1.3", 508 | "@josephg/resolvable": "^1.0.0", 509 | "@types/ws": "^7.0.0", 510 | "apollo-cache-control": "^0.12.0", 511 | "apollo-datasource": "^0.8.0", 512 | "apollo-graphql": "^0.6.0", 513 | "apollo-reporting-protobuf": "^0.6.2", 514 | "apollo-server-caching": "^0.6.0", 515 | "apollo-server-env": "^3.0.0", 516 | "apollo-server-errors": "^2.5.0", 517 | "apollo-server-plugin-base": "^0.11.0", 518 | "apollo-server-types": "^0.7.0", 519 | "apollo-tracing": "^0.13.0", 520 | "async-retry": "^1.2.1", 521 | "fast-json-stable-stringify": "^2.0.0", 522 | "graphql-extensions": "^0.13.0", 523 | "graphql-tag": "^2.11.0", 524 | "graphql-tools": "^4.0.8", 525 | "loglevel": "^1.6.7", 526 | "lru-cache": "^6.0.0", 527 | "sha.js": "^2.4.11", 528 | "subscriptions-transport-ws": "^0.9.11", 529 | "uuid": "^8.0.0", 530 | "ws": "^6.0.0" 531 | } 532 | }, 533 | "apollo-server-env": { 534 | "version": "3.0.0", 535 | "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.0.0.tgz", 536 | "integrity": "sha512-tPSN+VttnPsoQAl/SBVUpGbLA97MXG990XIwq6YUnJyAixrrsjW1xYG7RlaOqetxm80y5mBZKLrRDiiSsW/vog==", 537 | "requires": { 538 | "node-fetch": "^2.1.2", 539 | "util.promisify": "^1.0.0" 540 | } 541 | }, 542 | "apollo-server-errors": { 543 | "version": "2.5.0", 544 | "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz", 545 | "integrity": "sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA==" 546 | }, 547 | "apollo-server-express": { 548 | "version": "2.23.0", 549 | "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.23.0.tgz", 550 | "integrity": "sha512-tzil7c51ODH0rT1Bc5VMksdWzHrYGavdLtnDz4M0ePiTm18Gc81HD7X/4DPczorerEpfwwkf2YlADtPQfRSxlw==", 551 | "requires": { 552 | "@apollographql/graphql-playground-html": "1.6.27", 553 | "@types/accepts": "^1.3.5", 554 | "@types/body-parser": "1.19.0", 555 | "@types/cors": "2.8.10", 556 | "@types/express": "4.17.11", 557 | "@types/express-serve-static-core": "4.17.19", 558 | "accepts": "^1.3.5", 559 | "apollo-server-core": "^2.23.0", 560 | "apollo-server-types": "^0.7.0", 561 | "body-parser": "^1.18.3", 562 | "cors": "^2.8.5", 563 | "express": "^4.17.1", 564 | "graphql-subscriptions": "^1.0.0", 565 | "graphql-tools": "^4.0.8", 566 | "parseurl": "^1.3.2", 567 | "subscriptions-transport-ws": "^0.9.16", 568 | "type-is": "^1.6.16" 569 | } 570 | }, 571 | "apollo-server-lambda": { 572 | "version": "2.23.0", 573 | "resolved": "https://registry.npmjs.org/apollo-server-lambda/-/apollo-server-lambda-2.23.0.tgz", 574 | "integrity": "sha512-6Ov/q7jO0t6XUjpvHi5rwGFwiOZsviEdfsC+KC9hFIch8Na0dq2nUpFhMD4FBiTZVtlKEKrKCJx4hJ9qv7DYYA==", 575 | "requires": { 576 | "@apollographql/graphql-playground-html": "1.6.27", 577 | "@types/aws-lambda": "^8.10.31", 578 | "apollo-server-core": "^2.23.0", 579 | "apollo-server-env": "^3.0.0", 580 | "apollo-server-types": "^0.7.0", 581 | "graphql-tools": "^4.0.8" 582 | } 583 | }, 584 | "apollo-server-plugin-base": { 585 | "version": "0.11.0", 586 | "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.11.0.tgz", 587 | "integrity": "sha512-Du68x0XCyQ6EWlgoL9Z+1s8fJfXgY131QbKP7ao617StQPzwB0aGCwxBDfcMt1A75VXf4TkvV1rdUH5YeJFlhQ==", 588 | "requires": { 589 | "apollo-server-types": "^0.7.0" 590 | } 591 | }, 592 | "apollo-server-types": { 593 | "version": "0.7.0", 594 | "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.7.0.tgz", 595 | "integrity": "sha512-pJ6ri2N4xJ+e2PUUPHeCNpMDzHUagJyn0DDZGQmXDz6aoMlSd4B2KUvK81hHyHkw3wHk9clgcpfM9hKqbfZweA==", 596 | "requires": { 597 | "apollo-reporting-protobuf": "^0.6.2", 598 | "apollo-server-caching": "^0.6.0", 599 | "apollo-server-env": "^3.0.0" 600 | } 601 | }, 602 | "apollo-tracing": { 603 | "version": "0.13.0", 604 | "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.13.0.tgz", 605 | "integrity": "sha512-28z4T+XfLQ6t696usU0nTFDxVN8BfF3o74d2p/zsT4eu1OuoyoDOEmVJqdInmVRpyTJK0tDEOjkIuDJJHZftog==", 606 | "requires": { 607 | "apollo-server-env": "^3.0.0", 608 | "apollo-server-plugin-base": "^0.11.0" 609 | } 610 | }, 611 | "apollo-utilities": { 612 | "version": "1.3.4", 613 | "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", 614 | "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", 615 | "requires": { 616 | "@wry/equality": "^0.1.2", 617 | "fast-json-stable-stringify": "^2.0.0", 618 | "ts-invariant": "^0.4.0", 619 | "tslib": "^1.10.0" 620 | }, 621 | "dependencies": { 622 | "tslib": { 623 | "version": "1.14.1", 624 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 625 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 626 | } 627 | } 628 | }, 629 | "array-filter": { 630 | "version": "1.0.0", 631 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", 632 | "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" 633 | }, 634 | "array-flatten": { 635 | "version": "1.1.1", 636 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 637 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 638 | }, 639 | "async-limiter": { 640 | "version": "1.0.1", 641 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 642 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 643 | }, 644 | "async-retry": { 645 | "version": "1.3.1", 646 | "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", 647 | "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", 648 | "requires": { 649 | "retry": "0.12.0" 650 | } 651 | }, 652 | "asynckit": { 653 | "version": "0.4.0", 654 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 655 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 656 | }, 657 | "available-typed-arrays": { 658 | "version": "1.0.2", 659 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", 660 | "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", 661 | "requires": { 662 | "array-filter": "^1.0.0" 663 | } 664 | }, 665 | "backo2": { 666 | "version": "1.0.2", 667 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 668 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 669 | }, 670 | "body-parser": { 671 | "version": "1.19.0", 672 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 673 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 674 | "requires": { 675 | "bytes": "3.1.0", 676 | "content-type": "~1.0.4", 677 | "debug": "2.6.9", 678 | "depd": "~1.1.2", 679 | "http-errors": "1.7.2", 680 | "iconv-lite": "0.4.24", 681 | "on-finished": "~2.3.0", 682 | "qs": "6.7.0", 683 | "raw-body": "2.4.0", 684 | "type-is": "~1.6.17" 685 | }, 686 | "dependencies": { 687 | "debug": { 688 | "version": "2.6.9", 689 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 690 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 691 | "requires": { 692 | "ms": "2.0.0" 693 | } 694 | }, 695 | "http-errors": { 696 | "version": "1.7.2", 697 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 698 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 699 | "requires": { 700 | "depd": "~1.1.2", 701 | "inherits": "2.0.3", 702 | "setprototypeof": "1.1.1", 703 | "statuses": ">= 1.5.0 < 2", 704 | "toidentifier": "1.0.0" 705 | } 706 | }, 707 | "inherits": { 708 | "version": "2.0.3", 709 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 710 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 711 | }, 712 | "ms": { 713 | "version": "2.0.0", 714 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 715 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 716 | }, 717 | "setprototypeof": { 718 | "version": "1.1.1", 719 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 720 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 721 | } 722 | } 723 | }, 724 | "buffer-equal-constant-time": { 725 | "version": "1.0.1", 726 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 727 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 728 | }, 729 | "busboy": { 730 | "version": "0.3.1", 731 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", 732 | "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", 733 | "requires": { 734 | "dicer": "0.3.0" 735 | } 736 | }, 737 | "bytes": { 738 | "version": "3.1.0", 739 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 740 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 741 | }, 742 | "call-bind": { 743 | "version": "1.0.2", 744 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 745 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 746 | "requires": { 747 | "function-bind": "^1.1.1", 748 | "get-intrinsic": "^1.0.2" 749 | } 750 | }, 751 | "camel-case": { 752 | "version": "4.1.2", 753 | "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", 754 | "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", 755 | "requires": { 756 | "pascal-case": "^3.1.2", 757 | "tslib": "^2.0.3" 758 | } 759 | }, 760 | "camelcase": { 761 | "version": "6.2.0", 762 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", 763 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" 764 | }, 765 | "combined-stream": { 766 | "version": "1.0.8", 767 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 768 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 769 | "requires": { 770 | "delayed-stream": "~1.0.0" 771 | } 772 | }, 773 | "commander": { 774 | "version": "2.20.3", 775 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 776 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 777 | }, 778 | "content-disposition": { 779 | "version": "0.5.3", 780 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 781 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 782 | "requires": { 783 | "safe-buffer": "5.1.2" 784 | }, 785 | "dependencies": { 786 | "safe-buffer": { 787 | "version": "5.1.2", 788 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 789 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 790 | } 791 | } 792 | }, 793 | "content-type": { 794 | "version": "1.0.4", 795 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 796 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 797 | }, 798 | "cookie": { 799 | "version": "0.4.0", 800 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 801 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 802 | }, 803 | "cookie-signature": { 804 | "version": "1.0.6", 805 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 806 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 807 | }, 808 | "core-js": { 809 | "version": "3.11.0", 810 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.11.0.tgz", 811 | "integrity": "sha512-bd79DPpx+1Ilh9+30aT5O1sgpQd4Ttg8oqkqi51ZzhedMM1omD2e6IOF48Z/DzDCZ2svp49tN/3vneTK6ZBkXw==" 812 | }, 813 | "cors": { 814 | "version": "2.8.5", 815 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 816 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 817 | "requires": { 818 | "object-assign": "^4", 819 | "vary": "^1" 820 | } 821 | }, 822 | "cssfilter": { 823 | "version": "0.0.10", 824 | "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", 825 | "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" 826 | }, 827 | "debug": { 828 | "version": "4.3.1", 829 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 830 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 831 | "requires": { 832 | "ms": "2.1.2" 833 | } 834 | }, 835 | "deep-equal": { 836 | "version": "2.0.5", 837 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", 838 | "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", 839 | "requires": { 840 | "call-bind": "^1.0.0", 841 | "es-get-iterator": "^1.1.1", 842 | "get-intrinsic": "^1.0.1", 843 | "is-arguments": "^1.0.4", 844 | "is-date-object": "^1.0.2", 845 | "is-regex": "^1.1.1", 846 | "isarray": "^2.0.5", 847 | "object-is": "^1.1.4", 848 | "object-keys": "^1.1.1", 849 | "object.assign": "^4.1.2", 850 | "regexp.prototype.flags": "^1.3.0", 851 | "side-channel": "^1.0.3", 852 | "which-boxed-primitive": "^1.0.1", 853 | "which-collection": "^1.0.1", 854 | "which-typed-array": "^1.1.2" 855 | } 856 | }, 857 | "define-properties": { 858 | "version": "1.1.3", 859 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 860 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 861 | "requires": { 862 | "object-keys": "^1.0.12" 863 | } 864 | }, 865 | "delayed-stream": { 866 | "version": "1.0.0", 867 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 868 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 869 | }, 870 | "depd": { 871 | "version": "1.1.2", 872 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 873 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 874 | }, 875 | "deprecated-decorator": { 876 | "version": "0.1.6", 877 | "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", 878 | "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" 879 | }, 880 | "destroy": { 881 | "version": "1.0.4", 882 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 883 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 884 | }, 885 | "dicer": { 886 | "version": "0.3.0", 887 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 888 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 889 | "requires": { 890 | "streamsearch": "0.1.2" 891 | } 892 | }, 893 | "dot-prop": { 894 | "version": "6.0.1", 895 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", 896 | "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", 897 | "requires": { 898 | "is-obj": "^2.0.0" 899 | } 900 | }, 901 | "dotenv": { 902 | "version": "8.2.0", 903 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 904 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 905 | }, 906 | "ecdsa-sig-formatter": { 907 | "version": "1.0.11", 908 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 909 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 910 | "requires": { 911 | "safe-buffer": "^5.0.1" 912 | } 913 | }, 914 | "ee-first": { 915 | "version": "1.1.1", 916 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 917 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 918 | }, 919 | "encodeurl": { 920 | "version": "1.0.2", 921 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 922 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 923 | }, 924 | "es-abstract": { 925 | "version": "1.18.0", 926 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", 927 | "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", 928 | "requires": { 929 | "call-bind": "^1.0.2", 930 | "es-to-primitive": "^1.2.1", 931 | "function-bind": "^1.1.1", 932 | "get-intrinsic": "^1.1.1", 933 | "has": "^1.0.3", 934 | "has-symbols": "^1.0.2", 935 | "is-callable": "^1.2.3", 936 | "is-negative-zero": "^2.0.1", 937 | "is-regex": "^1.1.2", 938 | "is-string": "^1.0.5", 939 | "object-inspect": "^1.9.0", 940 | "object-keys": "^1.1.1", 941 | "object.assign": "^4.1.2", 942 | "string.prototype.trimend": "^1.0.4", 943 | "string.prototype.trimstart": "^1.0.4", 944 | "unbox-primitive": "^1.0.0" 945 | } 946 | }, 947 | "es-get-iterator": { 948 | "version": "1.1.2", 949 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", 950 | "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", 951 | "requires": { 952 | "call-bind": "^1.0.2", 953 | "get-intrinsic": "^1.1.0", 954 | "has-symbols": "^1.0.1", 955 | "is-arguments": "^1.1.0", 956 | "is-map": "^2.0.2", 957 | "is-set": "^2.0.2", 958 | "is-string": "^1.0.5", 959 | "isarray": "^2.0.5" 960 | } 961 | }, 962 | "es-to-primitive": { 963 | "version": "1.2.1", 964 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 965 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 966 | "requires": { 967 | "is-callable": "^1.1.4", 968 | "is-date-object": "^1.0.1", 969 | "is-symbol": "^1.0.2" 970 | } 971 | }, 972 | "escape-html": { 973 | "version": "1.0.3", 974 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 975 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 976 | }, 977 | "etag": { 978 | "version": "1.8.1", 979 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 980 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 981 | }, 982 | "eventemitter3": { 983 | "version": "3.1.2", 984 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", 985 | "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" 986 | }, 987 | "express": { 988 | "version": "4.17.1", 989 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 990 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 991 | "requires": { 992 | "accepts": "~1.3.7", 993 | "array-flatten": "1.1.1", 994 | "body-parser": "1.19.0", 995 | "content-disposition": "0.5.3", 996 | "content-type": "~1.0.4", 997 | "cookie": "0.4.0", 998 | "cookie-signature": "1.0.6", 999 | "debug": "2.6.9", 1000 | "depd": "~1.1.2", 1001 | "encodeurl": "~1.0.2", 1002 | "escape-html": "~1.0.3", 1003 | "etag": "~1.8.1", 1004 | "finalhandler": "~1.1.2", 1005 | "fresh": "0.5.2", 1006 | "merge-descriptors": "1.0.1", 1007 | "methods": "~1.1.2", 1008 | "on-finished": "~2.3.0", 1009 | "parseurl": "~1.3.3", 1010 | "path-to-regexp": "0.1.7", 1011 | "proxy-addr": "~2.0.5", 1012 | "qs": "6.7.0", 1013 | "range-parser": "~1.2.1", 1014 | "safe-buffer": "5.1.2", 1015 | "send": "0.17.1", 1016 | "serve-static": "1.14.1", 1017 | "setprototypeof": "1.1.1", 1018 | "statuses": "~1.5.0", 1019 | "type-is": "~1.6.18", 1020 | "utils-merge": "1.0.1", 1021 | "vary": "~1.1.2" 1022 | }, 1023 | "dependencies": { 1024 | "debug": { 1025 | "version": "2.6.9", 1026 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1027 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1028 | "requires": { 1029 | "ms": "2.0.0" 1030 | } 1031 | }, 1032 | "ms": { 1033 | "version": "2.0.0", 1034 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1035 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1036 | }, 1037 | "safe-buffer": { 1038 | "version": "5.1.2", 1039 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1040 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1041 | }, 1042 | "setprototypeof": { 1043 | "version": "1.1.1", 1044 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1045 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1046 | } 1047 | } 1048 | }, 1049 | "fast-json-stable-stringify": { 1050 | "version": "2.1.0", 1051 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1052 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1053 | }, 1054 | "finalhandler": { 1055 | "version": "1.1.2", 1056 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 1057 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 1058 | "requires": { 1059 | "debug": "2.6.9", 1060 | "encodeurl": "~1.0.2", 1061 | "escape-html": "~1.0.3", 1062 | "on-finished": "~2.3.0", 1063 | "parseurl": "~1.3.3", 1064 | "statuses": "~1.5.0", 1065 | "unpipe": "~1.0.0" 1066 | }, 1067 | "dependencies": { 1068 | "debug": { 1069 | "version": "2.6.9", 1070 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1071 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1072 | "requires": { 1073 | "ms": "2.0.0" 1074 | } 1075 | }, 1076 | "ms": { 1077 | "version": "2.0.0", 1078 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1079 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1080 | } 1081 | } 1082 | }, 1083 | "for-each": { 1084 | "version": "0.3.3", 1085 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1086 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1087 | "requires": { 1088 | "is-callable": "^1.1.3" 1089 | } 1090 | }, 1091 | "foreach": { 1092 | "version": "2.0.5", 1093 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 1094 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" 1095 | }, 1096 | "form-data": { 1097 | "version": "3.0.1", 1098 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 1099 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 1100 | "requires": { 1101 | "asynckit": "^0.4.0", 1102 | "combined-stream": "^1.0.8", 1103 | "mime-types": "^2.1.12" 1104 | } 1105 | }, 1106 | "forwarded": { 1107 | "version": "0.1.2", 1108 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1109 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1110 | }, 1111 | "fresh": { 1112 | "version": "0.5.2", 1113 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1114 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1115 | }, 1116 | "fs-capacitor": { 1117 | "version": "2.0.4", 1118 | "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", 1119 | "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" 1120 | }, 1121 | "function-bind": { 1122 | "version": "1.1.1", 1123 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1124 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1125 | }, 1126 | "get-intrinsic": { 1127 | "version": "1.1.1", 1128 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 1129 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 1130 | "requires": { 1131 | "function-bind": "^1.1.1", 1132 | "has": "^1.0.3", 1133 | "has-symbols": "^1.0.1" 1134 | } 1135 | }, 1136 | "graphql": { 1137 | "version": "15.5.0", 1138 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.0.tgz", 1139 | "integrity": "sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA==" 1140 | }, 1141 | "graphql-compose": { 1142 | "version": "7.25.1", 1143 | "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-7.25.1.tgz", 1144 | "integrity": "sha512-TPXTe1BoQkMjp/MH93yA0SQo8PiXxJAv6Eo6K/+kpJELM9l2jZnd5PCduweuXFcKv+nH973wn/VYzYKDMQ9YoQ==", 1145 | "requires": { 1146 | "graphql-type-json": "0.3.2", 1147 | "object-path": "0.11.5" 1148 | } 1149 | }, 1150 | "graphql-extensions": { 1151 | "version": "0.13.0", 1152 | "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.13.0.tgz", 1153 | "integrity": "sha512-Bb7E97nvfX4gtrIdZ/i5YFlqOd6MGzrw8ED+t4wQVraYje6NQ+8P8MHMOV2WZLfbW8zsNTx8NdnnlbsdH5siag==", 1154 | "requires": { 1155 | "@apollographql/apollo-tools": "^0.4.3", 1156 | "apollo-server-env": "^3.0.0", 1157 | "apollo-server-types": "^0.7.0" 1158 | } 1159 | }, 1160 | "graphql-parse-resolve-info": { 1161 | "version": "4.11.0", 1162 | "resolved": "https://registry.npmjs.org/graphql-parse-resolve-info/-/graphql-parse-resolve-info-4.11.0.tgz", 1163 | "integrity": "sha512-vIylHwlhtUz7y4UkXlwGRNIf1O2GhONRsZPYcz8SP+zI5Klp0aiulM4sQ7aEVJNbrqvzGj6cxthJLm+sys0dog==", 1164 | "requires": { 1165 | "debug": "^4.1.1", 1166 | "tslib": "^2.0.1" 1167 | } 1168 | }, 1169 | "graphql-subscriptions": { 1170 | "version": "1.2.1", 1171 | "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", 1172 | "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", 1173 | "requires": { 1174 | "iterall": "^1.3.0" 1175 | } 1176 | }, 1177 | "graphql-tag": { 1178 | "version": "2.11.0", 1179 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz", 1180 | "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==" 1181 | }, 1182 | "graphql-tools": { 1183 | "version": "4.0.8", 1184 | "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", 1185 | "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", 1186 | "requires": { 1187 | "apollo-link": "^1.2.14", 1188 | "apollo-utilities": "^1.0.1", 1189 | "deprecated-decorator": "^0.1.6", 1190 | "iterall": "^1.1.3", 1191 | "uuid": "^3.1.0" 1192 | }, 1193 | "dependencies": { 1194 | "uuid": { 1195 | "version": "3.4.0", 1196 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1197 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1198 | } 1199 | } 1200 | }, 1201 | "graphql-type-json": { 1202 | "version": "0.3.2", 1203 | "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz", 1204 | "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==" 1205 | }, 1206 | "has": { 1207 | "version": "1.0.3", 1208 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1209 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1210 | "requires": { 1211 | "function-bind": "^1.1.1" 1212 | } 1213 | }, 1214 | "has-bigints": { 1215 | "version": "1.0.1", 1216 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", 1217 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" 1218 | }, 1219 | "has-symbols": { 1220 | "version": "1.0.2", 1221 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 1222 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" 1223 | }, 1224 | "http-errors": { 1225 | "version": "1.8.0", 1226 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", 1227 | "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", 1228 | "requires": { 1229 | "depd": "~1.1.2", 1230 | "inherits": "2.0.4", 1231 | "setprototypeof": "1.2.0", 1232 | "statuses": ">= 1.5.0 < 2", 1233 | "toidentifier": "1.0.0" 1234 | } 1235 | }, 1236 | "iconv-lite": { 1237 | "version": "0.4.24", 1238 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1239 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1240 | "requires": { 1241 | "safer-buffer": ">= 2.1.2 < 3" 1242 | } 1243 | }, 1244 | "inherits": { 1245 | "version": "2.0.4", 1246 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1247 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1248 | }, 1249 | "ipaddr.js": { 1250 | "version": "1.9.1", 1251 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1252 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1253 | }, 1254 | "is-arguments": { 1255 | "version": "1.1.0", 1256 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", 1257 | "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", 1258 | "requires": { 1259 | "call-bind": "^1.0.0" 1260 | } 1261 | }, 1262 | "is-bigint": { 1263 | "version": "1.0.1", 1264 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", 1265 | "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" 1266 | }, 1267 | "is-boolean-object": { 1268 | "version": "1.1.0", 1269 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", 1270 | "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", 1271 | "requires": { 1272 | "call-bind": "^1.0.0" 1273 | } 1274 | }, 1275 | "is-callable": { 1276 | "version": "1.2.3", 1277 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", 1278 | "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" 1279 | }, 1280 | "is-date-object": { 1281 | "version": "1.0.2", 1282 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1283 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 1284 | }, 1285 | "is-map": { 1286 | "version": "2.0.2", 1287 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 1288 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" 1289 | }, 1290 | "is-negative-zero": { 1291 | "version": "2.0.1", 1292 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 1293 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" 1294 | }, 1295 | "is-number-object": { 1296 | "version": "1.0.4", 1297 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", 1298 | "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" 1299 | }, 1300 | "is-obj": { 1301 | "version": "2.0.0", 1302 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 1303 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" 1304 | }, 1305 | "is-regex": { 1306 | "version": "1.1.2", 1307 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", 1308 | "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", 1309 | "requires": { 1310 | "call-bind": "^1.0.2", 1311 | "has-symbols": "^1.0.1" 1312 | } 1313 | }, 1314 | "is-set": { 1315 | "version": "2.0.2", 1316 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 1317 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" 1318 | }, 1319 | "is-string": { 1320 | "version": "1.0.5", 1321 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 1322 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" 1323 | }, 1324 | "is-symbol": { 1325 | "version": "1.0.3", 1326 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1327 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1328 | "requires": { 1329 | "has-symbols": "^1.0.1" 1330 | } 1331 | }, 1332 | "is-typed-array": { 1333 | "version": "1.1.5", 1334 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", 1335 | "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", 1336 | "requires": { 1337 | "available-typed-arrays": "^1.0.2", 1338 | "call-bind": "^1.0.2", 1339 | "es-abstract": "^1.18.0-next.2", 1340 | "foreach": "^2.0.5", 1341 | "has-symbols": "^1.0.1" 1342 | } 1343 | }, 1344 | "is-weakmap": { 1345 | "version": "2.0.1", 1346 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 1347 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" 1348 | }, 1349 | "is-weakset": { 1350 | "version": "2.0.1", 1351 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", 1352 | "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==" 1353 | }, 1354 | "isarray": { 1355 | "version": "2.0.5", 1356 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1357 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" 1358 | }, 1359 | "iterall": { 1360 | "version": "1.3.0", 1361 | "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", 1362 | "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" 1363 | }, 1364 | "jsonwebtoken": { 1365 | "version": "8.5.1", 1366 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 1367 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 1368 | "requires": { 1369 | "jws": "^3.2.2", 1370 | "lodash.includes": "^4.3.0", 1371 | "lodash.isboolean": "^3.0.3", 1372 | "lodash.isinteger": "^4.0.4", 1373 | "lodash.isnumber": "^3.0.3", 1374 | "lodash.isplainobject": "^4.0.6", 1375 | "lodash.isstring": "^4.0.1", 1376 | "lodash.once": "^4.0.0", 1377 | "ms": "^2.1.1", 1378 | "semver": "^5.6.0" 1379 | } 1380 | }, 1381 | "jwa": { 1382 | "version": "1.4.1", 1383 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1384 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1385 | "requires": { 1386 | "buffer-equal-constant-time": "1.0.1", 1387 | "ecdsa-sig-formatter": "1.0.11", 1388 | "safe-buffer": "^5.0.1" 1389 | } 1390 | }, 1391 | "jws": { 1392 | "version": "3.2.2", 1393 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1394 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1395 | "requires": { 1396 | "jwa": "^1.4.1", 1397 | "safe-buffer": "^5.0.1" 1398 | } 1399 | }, 1400 | "lodash.includes": { 1401 | "version": "4.3.0", 1402 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1403 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1404 | }, 1405 | "lodash.isboolean": { 1406 | "version": "3.0.3", 1407 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1408 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1409 | }, 1410 | "lodash.isinteger": { 1411 | "version": "4.0.4", 1412 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1413 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1414 | }, 1415 | "lodash.isnumber": { 1416 | "version": "3.0.3", 1417 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1418 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1419 | }, 1420 | "lodash.isplainobject": { 1421 | "version": "4.0.6", 1422 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1423 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1424 | }, 1425 | "lodash.isstring": { 1426 | "version": "4.0.1", 1427 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1428 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1429 | }, 1430 | "lodash.once": { 1431 | "version": "4.1.1", 1432 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1433 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1434 | }, 1435 | "lodash.sortby": { 1436 | "version": "4.7.0", 1437 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1438 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1439 | }, 1440 | "loglevel": { 1441 | "version": "1.7.1", 1442 | "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", 1443 | "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" 1444 | }, 1445 | "long": { 1446 | "version": "4.0.0", 1447 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1448 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1449 | }, 1450 | "lower-case": { 1451 | "version": "2.0.2", 1452 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1453 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1454 | "requires": { 1455 | "tslib": "^2.0.3" 1456 | } 1457 | }, 1458 | "lru-cache": { 1459 | "version": "6.0.0", 1460 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1461 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1462 | "requires": { 1463 | "yallist": "^4.0.0" 1464 | } 1465 | }, 1466 | "media-typer": { 1467 | "version": "0.3.0", 1468 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1469 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1470 | }, 1471 | "merge-descriptors": { 1472 | "version": "1.0.1", 1473 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1474 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1475 | }, 1476 | "methods": { 1477 | "version": "1.1.2", 1478 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1479 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1480 | }, 1481 | "mime": { 1482 | "version": "1.6.0", 1483 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1484 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1485 | }, 1486 | "mime-db": { 1487 | "version": "1.47.0", 1488 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", 1489 | "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" 1490 | }, 1491 | "mime-types": { 1492 | "version": "2.1.30", 1493 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", 1494 | "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", 1495 | "requires": { 1496 | "mime-db": "1.47.0" 1497 | } 1498 | }, 1499 | "ms": { 1500 | "version": "2.1.2", 1501 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1502 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1503 | }, 1504 | "negotiator": { 1505 | "version": "0.6.2", 1506 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1507 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1508 | }, 1509 | "neo4j-driver": { 1510 | "version": "4.2.3", 1511 | "resolved": "https://registry.npmjs.org/neo4j-driver/-/neo4j-driver-4.2.3.tgz", 1512 | "integrity": "sha512-HCJ7+J5V/5yhP+b6G2zTb7SKlAN/oLYaMkD8Bo8L9veScDtgDHBlbkbYEHf1YSAd67OfjZKeF9l84J8Kjdw91g==", 1513 | "requires": { 1514 | "@babel/runtime": "^7.5.5", 1515 | "rxjs": "^6.6.3", 1516 | "text-encoding-utf-8": "^1.0.2", 1517 | "uri-js": "^4.4.0" 1518 | } 1519 | }, 1520 | "no-case": { 1521 | "version": "3.0.4", 1522 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1523 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1524 | "requires": { 1525 | "lower-case": "^2.0.2", 1526 | "tslib": "^2.0.3" 1527 | } 1528 | }, 1529 | "node-fetch": { 1530 | "version": "2.6.1", 1531 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1532 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1533 | }, 1534 | "object-assign": { 1535 | "version": "4.1.1", 1536 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1537 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1538 | }, 1539 | "object-inspect": { 1540 | "version": "1.10.2", 1541 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", 1542 | "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" 1543 | }, 1544 | "object-is": { 1545 | "version": "1.1.5", 1546 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 1547 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 1548 | "requires": { 1549 | "call-bind": "^1.0.2", 1550 | "define-properties": "^1.1.3" 1551 | } 1552 | }, 1553 | "object-keys": { 1554 | "version": "1.1.1", 1555 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1556 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1557 | }, 1558 | "object-path": { 1559 | "version": "0.11.5", 1560 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz", 1561 | "integrity": "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==" 1562 | }, 1563 | "object.assign": { 1564 | "version": "4.1.2", 1565 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1566 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1567 | "requires": { 1568 | "call-bind": "^1.0.0", 1569 | "define-properties": "^1.1.3", 1570 | "has-symbols": "^1.0.1", 1571 | "object-keys": "^1.1.1" 1572 | } 1573 | }, 1574 | "object.getownpropertydescriptors": { 1575 | "version": "2.1.2", 1576 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", 1577 | "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", 1578 | "requires": { 1579 | "call-bind": "^1.0.2", 1580 | "define-properties": "^1.1.3", 1581 | "es-abstract": "^1.18.0-next.2" 1582 | } 1583 | }, 1584 | "on-finished": { 1585 | "version": "2.3.0", 1586 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1587 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1588 | "requires": { 1589 | "ee-first": "1.1.1" 1590 | } 1591 | }, 1592 | "parseurl": { 1593 | "version": "1.3.3", 1594 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1595 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1596 | }, 1597 | "pascal-case": { 1598 | "version": "3.1.2", 1599 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", 1600 | "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", 1601 | "requires": { 1602 | "no-case": "^3.0.4", 1603 | "tslib": "^2.0.3" 1604 | } 1605 | }, 1606 | "path-to-regexp": { 1607 | "version": "0.1.7", 1608 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1609 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1610 | }, 1611 | "pluralize": { 1612 | "version": "8.0.0", 1613 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", 1614 | "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" 1615 | }, 1616 | "proxy-addr": { 1617 | "version": "2.0.6", 1618 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1619 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1620 | "requires": { 1621 | "forwarded": "~0.1.2", 1622 | "ipaddr.js": "1.9.1" 1623 | } 1624 | }, 1625 | "punycode": { 1626 | "version": "2.1.1", 1627 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1628 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1629 | }, 1630 | "qs": { 1631 | "version": "6.7.0", 1632 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1633 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1634 | }, 1635 | "range-parser": { 1636 | "version": "1.2.1", 1637 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1638 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1639 | }, 1640 | "raw-body": { 1641 | "version": "2.4.0", 1642 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1643 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1644 | "requires": { 1645 | "bytes": "3.1.0", 1646 | "http-errors": "1.7.2", 1647 | "iconv-lite": "0.4.24", 1648 | "unpipe": "1.0.0" 1649 | }, 1650 | "dependencies": { 1651 | "http-errors": { 1652 | "version": "1.7.2", 1653 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1654 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1655 | "requires": { 1656 | "depd": "~1.1.2", 1657 | "inherits": "2.0.3", 1658 | "setprototypeof": "1.1.1", 1659 | "statuses": ">= 1.5.0 < 2", 1660 | "toidentifier": "1.0.0" 1661 | } 1662 | }, 1663 | "inherits": { 1664 | "version": "2.0.3", 1665 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1666 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1667 | }, 1668 | "setprototypeof": { 1669 | "version": "1.1.1", 1670 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1671 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1672 | } 1673 | } 1674 | }, 1675 | "regenerator-runtime": { 1676 | "version": "0.13.7", 1677 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1678 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" 1679 | }, 1680 | "regexp.prototype.flags": { 1681 | "version": "1.3.1", 1682 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", 1683 | "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", 1684 | "requires": { 1685 | "call-bind": "^1.0.2", 1686 | "define-properties": "^1.1.3" 1687 | } 1688 | }, 1689 | "retry": { 1690 | "version": "0.12.0", 1691 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1692 | "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" 1693 | }, 1694 | "rxjs": { 1695 | "version": "6.6.7", 1696 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 1697 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 1698 | "requires": { 1699 | "tslib": "^1.9.0" 1700 | }, 1701 | "dependencies": { 1702 | "tslib": { 1703 | "version": "1.14.1", 1704 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1705 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1706 | } 1707 | } 1708 | }, 1709 | "safe-buffer": { 1710 | "version": "5.2.1", 1711 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1712 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1713 | }, 1714 | "safer-buffer": { 1715 | "version": "2.1.2", 1716 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1717 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1718 | }, 1719 | "semver": { 1720 | "version": "5.7.1", 1721 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1722 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1723 | }, 1724 | "send": { 1725 | "version": "0.17.1", 1726 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1727 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1728 | "requires": { 1729 | "debug": "2.6.9", 1730 | "depd": "~1.1.2", 1731 | "destroy": "~1.0.4", 1732 | "encodeurl": "~1.0.2", 1733 | "escape-html": "~1.0.3", 1734 | "etag": "~1.8.1", 1735 | "fresh": "0.5.2", 1736 | "http-errors": "~1.7.2", 1737 | "mime": "1.6.0", 1738 | "ms": "2.1.1", 1739 | "on-finished": "~2.3.0", 1740 | "range-parser": "~1.2.1", 1741 | "statuses": "~1.5.0" 1742 | }, 1743 | "dependencies": { 1744 | "debug": { 1745 | "version": "2.6.9", 1746 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1747 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1748 | "requires": { 1749 | "ms": "2.0.0" 1750 | }, 1751 | "dependencies": { 1752 | "ms": { 1753 | "version": "2.0.0", 1754 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1755 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1756 | } 1757 | } 1758 | }, 1759 | "http-errors": { 1760 | "version": "1.7.3", 1761 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 1762 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 1763 | "requires": { 1764 | "depd": "~1.1.2", 1765 | "inherits": "2.0.4", 1766 | "setprototypeof": "1.1.1", 1767 | "statuses": ">= 1.5.0 < 2", 1768 | "toidentifier": "1.0.0" 1769 | } 1770 | }, 1771 | "ms": { 1772 | "version": "2.1.1", 1773 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1774 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1775 | }, 1776 | "setprototypeof": { 1777 | "version": "1.1.1", 1778 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1779 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1780 | } 1781 | } 1782 | }, 1783 | "serve-static": { 1784 | "version": "1.14.1", 1785 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1786 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1787 | "requires": { 1788 | "encodeurl": "~1.0.2", 1789 | "escape-html": "~1.0.3", 1790 | "parseurl": "~1.3.3", 1791 | "send": "0.17.1" 1792 | } 1793 | }, 1794 | "setprototypeof": { 1795 | "version": "1.2.0", 1796 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1797 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1798 | }, 1799 | "sha.js": { 1800 | "version": "2.4.11", 1801 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1802 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1803 | "requires": { 1804 | "inherits": "^2.0.1", 1805 | "safe-buffer": "^5.0.1" 1806 | } 1807 | }, 1808 | "side-channel": { 1809 | "version": "1.0.4", 1810 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1811 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1812 | "requires": { 1813 | "call-bind": "^1.0.0", 1814 | "get-intrinsic": "^1.0.2", 1815 | "object-inspect": "^1.9.0" 1816 | } 1817 | }, 1818 | "statuses": { 1819 | "version": "1.5.0", 1820 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1821 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1822 | }, 1823 | "stoppable": { 1824 | "version": "1.1.0", 1825 | "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", 1826 | "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" 1827 | }, 1828 | "streamsearch": { 1829 | "version": "0.1.2", 1830 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 1831 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 1832 | }, 1833 | "string.prototype.trimend": { 1834 | "version": "1.0.4", 1835 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", 1836 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", 1837 | "requires": { 1838 | "call-bind": "^1.0.2", 1839 | "define-properties": "^1.1.3" 1840 | } 1841 | }, 1842 | "string.prototype.trimstart": { 1843 | "version": "1.0.4", 1844 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", 1845 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", 1846 | "requires": { 1847 | "call-bind": "^1.0.2", 1848 | "define-properties": "^1.1.3" 1849 | } 1850 | }, 1851 | "subscriptions-transport-ws": { 1852 | "version": "0.9.18", 1853 | "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.18.tgz", 1854 | "integrity": "sha512-tztzcBTNoEbuErsVQpTN2xUNN/efAZXyCyL5m3x4t6SKrEiTL2N8SaKWBFWM4u56pL79ULif3zjyeq+oV+nOaA==", 1855 | "requires": { 1856 | "backo2": "^1.0.2", 1857 | "eventemitter3": "^3.1.0", 1858 | "iterall": "^1.2.1", 1859 | "symbol-observable": "^1.0.4", 1860 | "ws": "^5.2.0" 1861 | }, 1862 | "dependencies": { 1863 | "ws": { 1864 | "version": "5.2.2", 1865 | "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", 1866 | "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", 1867 | "requires": { 1868 | "async-limiter": "~1.0.0" 1869 | } 1870 | } 1871 | } 1872 | }, 1873 | "symbol-observable": { 1874 | "version": "1.2.0", 1875 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", 1876 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 1877 | }, 1878 | "text-encoding-utf-8": { 1879 | "version": "1.0.2", 1880 | "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", 1881 | "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" 1882 | }, 1883 | "toidentifier": { 1884 | "version": "1.0.0", 1885 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1886 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1887 | }, 1888 | "ts-invariant": { 1889 | "version": "0.4.4", 1890 | "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", 1891 | "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", 1892 | "requires": { 1893 | "tslib": "^1.9.3" 1894 | }, 1895 | "dependencies": { 1896 | "tslib": { 1897 | "version": "1.14.1", 1898 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1899 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1900 | } 1901 | } 1902 | }, 1903 | "tslib": { 1904 | "version": "2.2.0", 1905 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", 1906 | "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" 1907 | }, 1908 | "type-is": { 1909 | "version": "1.6.18", 1910 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1911 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1912 | "requires": { 1913 | "media-typer": "0.3.0", 1914 | "mime-types": "~2.1.24" 1915 | } 1916 | }, 1917 | "unbox-primitive": { 1918 | "version": "1.0.1", 1919 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", 1920 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", 1921 | "requires": { 1922 | "function-bind": "^1.1.1", 1923 | "has-bigints": "^1.0.1", 1924 | "has-symbols": "^1.0.2", 1925 | "which-boxed-primitive": "^1.0.2" 1926 | } 1927 | }, 1928 | "unpipe": { 1929 | "version": "1.0.0", 1930 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1931 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1932 | }, 1933 | "upper-case-first": { 1934 | "version": "2.0.2", 1935 | "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", 1936 | "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", 1937 | "requires": { 1938 | "tslib": "^2.0.3" 1939 | } 1940 | }, 1941 | "uri-js": { 1942 | "version": "4.4.1", 1943 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1944 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1945 | "requires": { 1946 | "punycode": "^2.1.0" 1947 | } 1948 | }, 1949 | "util.promisify": { 1950 | "version": "1.1.1", 1951 | "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", 1952 | "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", 1953 | "requires": { 1954 | "call-bind": "^1.0.0", 1955 | "define-properties": "^1.1.3", 1956 | "for-each": "^0.3.3", 1957 | "has-symbols": "^1.0.1", 1958 | "object.getownpropertydescriptors": "^2.1.1" 1959 | } 1960 | }, 1961 | "utils-merge": { 1962 | "version": "1.0.1", 1963 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1964 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1965 | }, 1966 | "uuid": { 1967 | "version": "8.3.2", 1968 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1969 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 1970 | }, 1971 | "vary": { 1972 | "version": "1.1.2", 1973 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1974 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1975 | }, 1976 | "which-boxed-primitive": { 1977 | "version": "1.0.2", 1978 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1979 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1980 | "requires": { 1981 | "is-bigint": "^1.0.1", 1982 | "is-boolean-object": "^1.1.0", 1983 | "is-number-object": "^1.0.4", 1984 | "is-string": "^1.0.5", 1985 | "is-symbol": "^1.0.3" 1986 | } 1987 | }, 1988 | "which-collection": { 1989 | "version": "1.0.1", 1990 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 1991 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 1992 | "requires": { 1993 | "is-map": "^2.0.1", 1994 | "is-set": "^2.0.1", 1995 | "is-weakmap": "^2.0.1", 1996 | "is-weakset": "^2.0.1" 1997 | } 1998 | }, 1999 | "which-typed-array": { 2000 | "version": "1.1.4", 2001 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", 2002 | "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", 2003 | "requires": { 2004 | "available-typed-arrays": "^1.0.2", 2005 | "call-bind": "^1.0.0", 2006 | "es-abstract": "^1.18.0-next.1", 2007 | "foreach": "^2.0.5", 2008 | "function-bind": "^1.1.1", 2009 | "has-symbols": "^1.0.1", 2010 | "is-typed-array": "^1.1.3" 2011 | } 2012 | }, 2013 | "ws": { 2014 | "version": "6.2.1", 2015 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", 2016 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", 2017 | "requires": { 2018 | "async-limiter": "~1.0.0" 2019 | } 2020 | }, 2021 | "xss": { 2022 | "version": "1.0.8", 2023 | "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz", 2024 | "integrity": "sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw==", 2025 | "requires": { 2026 | "commander": "^2.20.3", 2027 | "cssfilter": "0.0.10" 2028 | } 2029 | }, 2030 | "yallist": { 2031 | "version": "4.0.0", 2032 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2033 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2034 | }, 2035 | "zen-observable": { 2036 | "version": "0.8.15", 2037 | "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", 2038 | "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" 2039 | }, 2040 | "zen-observable-ts": { 2041 | "version": "0.8.21", 2042 | "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", 2043 | "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", 2044 | "requires": { 2045 | "tslib": "^1.9.3", 2046 | "zen-observable": "^0.8.0" 2047 | }, 2048 | "dependencies": { 2049 | "tslib": { 2050 | "version": "1.14.1", 2051 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 2052 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 2053 | } 2054 | } 2055 | } 2056 | } 2057 | } 2058 | -------------------------------------------------------------------------------- /graphql/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphql-twitter", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@neo4j/graphql": "^1.0.0-alpha.5", 15 | "apollo-server": "^2.21.0", 16 | "apollo-server-lambda": "^2.21.1", 17 | "dotenv": "^8.2.0", 18 | "graphql": "^15.5.0", 19 | "neo4j-driver": "^4.2.3" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /graphql/schema.graphql: -------------------------------------------------------------------------------- 1 | type Tweet { 2 | created_at: DateTime 3 | favorites: Int 4 | id: ID! 5 | id_str: String 6 | import_method: String 7 | text: String 8 | using: [Source] @relationship(type: "USING", direction: OUT) 9 | tags: [Hashtag] @relationship(type: "TAGS", direction: OUT) 10 | retweets: [Tweet] @relationship(type: "RETWEETS", direction: OUT) 11 | reply_to: [Tweet] @relationship(type: "REPLY_TO", direction: OUT) 12 | contains: [Link] @relationship(type: "CONTAINS", direction: OUT) 13 | posted_by: User @relationship(type: "POSTS", direction: IN) 14 | } 15 | 16 | type Me { 17 | followers: Int! 18 | following: Int! 19 | location: String! 20 | name: String! 21 | profile_image_url: String! 22 | screen_name: ID! 23 | posts: [Tweet] @relationship(type: "POSTS", direction: OUT) 24 | users: [User] @relationship(type: "FOLLOWS", direction: IN) 25 | tweets: [Tweet] @relationship(type: "MENTIONS", direction: IN) 26 | } 27 | 28 | type Hashtag { 29 | name: String! 30 | tweets: [Tweet] @relationship(type: "TAGS", direction: IN) 31 | num_tweets: Int @cypher(statement: "RETURN SIZE( (this)<-[:TAGS]-(:Tweet) )") 32 | } 33 | 34 | type Link { 35 | url: String! 36 | tweets: [Tweet] @relationship(type: "CONTAINS", direction: IN) 37 | } 38 | 39 | type Source { 40 | name: String! 41 | tweets: [Tweet] @relationship(type: "USING", direction: IN) 42 | } 43 | 44 | type User { 45 | followers: Int 46 | following: Int 47 | location: String 48 | name: String! 49 | profile_image_url: String 50 | screen_name: String! 51 | statuses: Int 52 | url: String 53 | posts: [Tweet] @relationship(type: "POSTS", direction: OUT) 54 | tweets: [Tweet] @relationship(type: "MENTIONS", direction: IN) 55 | } 56 | 57 | type UserCount { 58 | count: Int 59 | user: User 60 | } 61 | 62 | type HashtagCount { 63 | count: Int 64 | name: String 65 | } 66 | 67 | type UserTweet { 68 | screen_name: String 69 | name: String 70 | profile_pic: String 71 | created_at: DateTime 72 | text: String 73 | } 74 | 75 | extend type Me { 76 | topMentions(first: Int = 5): [UserCount] 77 | @cypher( 78 | statement: """ 79 | MATCH (this)-[:POSTS]->(t:Tweet)-[:MENTIONS]->(m:User) 80 | WITH m, COUNT(m.screen_name) AS count 81 | ORDER BY count DESC 82 | LIMIT $first 83 | RETURN { 84 | user: m { .* }, 85 | count: count 86 | } 87 | """ 88 | ) 89 | topHashtags(first: Int = 5): [HashtagCount] 90 | @cypher( 91 | statement: """ 92 | MATCH (this:Me)-[:POSTS]->(t:Tweet)-[:TAGS]->(h:Hashtag) 93 | WITH h, COUNT(h) AS count 94 | ORDER BY count DESC 95 | LIMIT $first 96 | RETURN { 97 | name: h.name, 98 | count: count 99 | } 100 | """ 101 | ) 102 | followbackCount: Int 103 | @cypher( 104 | statement: """ 105 | MATCH (me:Me)-[:FOLLOWS]->(f:User) 106 | WHERE (f)-[:FOLLOWS]->(me) 107 | RETURN count(f) 108 | """ 109 | ) 110 | recommended(first: Int = 10): [UserCount] 111 | @cypher( 112 | statement: """ 113 | MATCH (u:User)-[:POSTS]->(t:Tweet)-[:MENTIONS]->(me:Me) 114 | WITH DISTINCT u, me, count(t) as count 115 | WHERE (u)-[:FOLLOWS]->(me) 116 | AND NOT (me)-[:FOLLOWS]->(u) 117 | RETURN { 118 | user: u { .* }, 119 | count: count 120 | } 121 | ORDER BY count DESC 122 | LIMIT $first 123 | """ 124 | ) 125 | priorityFeed: [UserTweet] 126 | @cypher( 127 | statement: """ 128 | MATCH (t:Tweet) WHERE t.created_at IS NOT NULL 129 | WITH max(t.created_at) - duration('P3D') as recentDate 130 | CALL { 131 | WITH recentDate 132 | MATCH (this:Me)-[r:SIMILAR_TO]-(u:User) 133 | WITH u, recentDate 134 | ORDER BY r.score DESC 135 | LIMIT 10 136 | MATCH (u)-[:POSTS]->(t:Tweet) 137 | WHERE t.created_at >= recentDate 138 | WITH u, t 139 | ORDER BY t.created_at DESC 140 | LIMIT 50 141 | RETURN { 142 | screen_name: u.screen_name, 143 | name: u.name, 144 | profile_pic: u.profile_image_url, 145 | created_at: t.created_at, 146 | text: t.text 147 | } as tweets 148 | UNION 149 | WITH recentDate 150 | MATCH (u:User)-[r:POSTS]->(t:Tweet) 151 | WHERE t.created_at >= recentDate AND NOT u:Me 152 | WITH u, t 153 | ORDER BY t.created_at DESC 154 | LIMIT 50 155 | RETURN { 156 | screen_name: u.screen_name, 157 | name: u.name, 158 | profile_pic: u.profile_image_url, 159 | created_at: t.created_at, 160 | text: t.text 161 | } as tweets 162 | ORDER BY t.created_at DESC 163 | LIMIT 50 164 | } 165 | RETURN tweets 166 | """ 167 | ) 168 | } 169 | 170 | extend type User { 171 | topMentions: UserCount 172 | @cypher( 173 | statement: """ 174 | MATCH (this)-[:POSTS]->(t:Tweet)-[:MENTIONS]->(m:User) 175 | WITH m, COUNT(m.screen_name) AS count 176 | ORDER BY count DESC 177 | LIMIT 1 178 | RETURN { 179 | user: m {.*}, 180 | count: count 181 | } 182 | """ 183 | ) 184 | } 185 | 186 | extend type Tweet { 187 | mentions: [User] @relationship(type: "MENTIONS", direction: OUT) 188 | } 189 | 190 | extend type Hashtag { 191 | trendingTags(first: Int = 5): [HashtagCount] 192 | @cypher( 193 | statement: """ 194 | MATCH (t:Tweet)-[:TAGS]->(h:Hashtag) 195 | WITH h, count(h) as count 196 | ORDER BY count DESC 197 | LIMIT $first 198 | RETURN { 199 | name: h.name, 200 | count: count 201 | } 202 | """ 203 | ) 204 | } -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "cp schema.graphql lambda/graphql/schema.graphql" 3 | base = "graphql" 4 | functions = "lambda" 5 | 6 | [[redirects]] 7 | from = "/" 8 | to = "/.netlify/functions/graphql" 9 | status = 200 -------------------------------------------------------------------------------- /relate.project-install.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitter", 3 | "description":"Explore a social network with Neo4j's Twitter data", 4 | "dbms": [ 5 | { 6 | "dumpFile": "data/twitter-v2-40.dump", 7 | "targetNeo4jVersion": ">=4.0.0 <4.3.0", 8 | "plugins": ["apoc"] 9 | }, 10 | { 11 | "dumpFile": "data/twitter-v2-43.dump", 12 | "targetNeo4jVersion": ">=4.3.0 <5.0.0", 13 | "plugins": ["apoc"] 14 | }, 15 | { 16 | "dumpFile": "data/twitter-v2-50.dump", 17 | "targetNeo4jVersion": ">=5.0.0 <6.0.0", 18 | "plugins": ["apoc"] 19 | } 20 | ] 21 | } 22 | --------------------------------------------------------------------------------