diff --git a/block-streamer/Cargo.lock b/block-streamer/Cargo.lock index 4e67d68ed..1a68afaa5 100644 --- a/block-streamer/Cargo.lock +++ b/block-streamer/Cargo.lock @@ -369,6 +369,12 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + [[package]] name = "assert-json-diff" version = "1.1.0" @@ -898,6 +904,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64-simd" version = "0.8.0" @@ -957,10 +969,12 @@ dependencies = [ "aws-sdk-s3", "aws-smithy-runtime", "aws-smithy-types", + "base64 0.22.1", "borsh 0.10.3", "cached", "chrono", "futures", + "graphql_client", "http 0.2.12", "lazy_static", "mockall", @@ -969,6 +983,7 @@ dependencies = [ "prost 0.12.4", "redis", "registry-types", + "reqwest", "serde", "serde_json", "tokio", @@ -1259,6 +1274,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + [[package]] name = "combine" version = "4.6.7" @@ -1799,6 +1827,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1951,6 +1994,65 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "graphql-introspection-query" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2a4732cf5140bd6c082434494f785a19cfb566ab07d1382c3671f5812fed6d" +dependencies = [ + "serde", +] + +[[package]] +name = "graphql-parser" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ebc8013b4426d5b81a4364c419a95ed0b404af2b82e2457de52d9348f0e474" +dependencies = [ + "combine 3.8.1", + "thiserror", +] + +[[package]] +name = "graphql_client" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a50cfdc7f34b7f01909d55c2dcb71d4c13cbcbb4a1605d6c8bd760d654c1144b" +dependencies = [ + "graphql_query_derive", + "reqwest", + "serde", + "serde_json", +] + +[[package]] +name = "graphql_client_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e27ed0c2cf0c0cc52c6bcf3b45c907f433015e580879d14005386251842fb0a" +dependencies = [ + "graphql-introspection-query", + "graphql-parser", + "heck 0.4.1", + "lazy_static", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 1.0.109", +] + +[[package]] +name = "graphql_query_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83febfa838f898cfa73dfaa7a8eb69ff3409021ac06ee94cfb3d622f6eeb1a97" +dependencies = [ + "graphql_client_codegen", + "proc-macro2", + "syn 1.0.109", +] + [[package]] name = "group" version = "0.12.1" @@ -2180,6 +2282,19 @@ dependencies = [ "tokio-io-timeout", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -2250,6 +2365,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + [[package]] name = "itertools" version = "0.10.5" @@ -2482,6 +2603,24 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "near-account-id" version = "1.0.0" @@ -2841,12 +2980,50 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.59", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "opentelemetry" version = "0.17.0" @@ -3362,7 +3539,7 @@ dependencies = [ "arc-swap", "async-trait", "bytes", - "combine", + "combine 4.6.7", "futures", "futures-util", "itoa", @@ -3452,6 +3629,46 @@ dependencies = [ "serde", ] +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "rfc6979" version = "0.3.1" @@ -3995,6 +4212,27 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" version = "3.10.1" @@ -4129,6 +4367,16 @@ dependencies = [ "syn 2.0.59", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.24.1" @@ -4507,6 +4755,15 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -4554,12 +4811,24 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "vsimd" version = "0.8.0" @@ -4612,6 +4881,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.92" @@ -4641,6 +4922,16 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "which" version = "4.4.2" @@ -4838,6 +5129,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "xmlparser" version = "0.13.6" diff --git a/block-streamer/Cargo.toml b/block-streamer/Cargo.toml index 1072c5e07..d44903786 100644 --- a/block-streamer/Cargo.toml +++ b/block-streamer/Cargo.toml @@ -13,11 +13,14 @@ borsh = "0.10.2" cached = "0.49.3" chrono = "0.4.25" futures = "0.3.5" +graphql_client = { version = "0.14.0", features = ["reqwest"] } lazy_static = "1.4.0" mockall = "0.11.4" +near-lake-framework = "0.7.8" prometheus = "0.13.3" prost = "0.12.3" redis = { version = "0.21.5", features = ["tokio-comp", "connection-manager"] } +reqwest = { version = "^0.11.0", features = ["json"] } serde = { version = "1", features = ["derive"] } serde_json = "1.0.55" tracing = "0.1.40" @@ -30,8 +33,7 @@ tonic = "0.10.2" wildmatch = "2.1.1" registry-types = { path = "../registry/types" } - -near-lake-framework = "0.7.8" +base64 = "0.22.1" [build-dependencies] tonic-build = "0.10" diff --git a/block-streamer/README.md b/block-streamer/README.md new file mode 100644 index 000000000..e05d4a559 --- /dev/null +++ b/block-streamer/README.md @@ -0,0 +1,23 @@ +// TODO: Improve README further + +## GraphQL Code Generation +Querying a GraphQL requires informing Rust of the correct types to deserialize the response data into. In order to do this, the schema of the GraphQL data needs to be introspected. Following that, the query intended to be called needs to be fully defined. With this information, code can be automatically generated using the macro provided in graphql-client. Below are the instructions on how to do so. + +### Generating schema.graphql +Follow the instructions in the [Hasura Documentation](https://hasura.io/docs/latest/schema/common-patterns/export-graphql-schema/) to introspect the schema and generate the graphql file. Keep in mind that a header for the role needs to be provided. Otherwise, the schemas remain hidden from the public/default user. + +For example: `gq https://my-graphql-engine.com/v1/graphql -H 'X-Hasura-Role: someaccount_near' --introspect > schema.graphql` + +### Generating Rust types from query +After acquiring the graphql file for the schema, write the queries that need to be called in individual graphql files. Once written, add the following code template to a Rust file and the code will be auto generated using the macro. Assuming there are no problems generating the code, the code will be immediately usable. + +``` +#[derive(GraphQLQuery)] +#[graphql( + schema_path = "PATH/TO/schema.graphql", + query_path = "PATH/TO/query.graphql", + response_derives = "Debug", + normalization = "rust" +)] +struct QueryNameInPascalCase; +``` diff --git a/block-streamer/graphql/darunrs_near/get_bitmaps_exact.graphql b/block-streamer/graphql/darunrs_near/get_bitmaps_exact.graphql new file mode 100644 index 000000000..eb5c73b6e --- /dev/null +++ b/block-streamer/graphql/darunrs_near/get_bitmaps_exact.graphql @@ -0,0 +1,6 @@ +query GetBitmapsExact($block_date: date, $receiver_ids: [String!], $limit: Int, $offset: Int) { + darunrs_near_bitmap_v5_actions_index(limit: $limit, offset: $offset, where: {block_date: {_eq: $block_date}, receiver: {receiver: {_in: $receiver_ids}}}) { + bitmap + first_block_height + } +} diff --git a/block-streamer/graphql/darunrs_near/get_bitmaps_wildcard.graphql b/block-streamer/graphql/darunrs_near/get_bitmaps_wildcard.graphql new file mode 100644 index 000000000..d742d0556 --- /dev/null +++ b/block-streamer/graphql/darunrs_near/get_bitmaps_wildcard.graphql @@ -0,0 +1,6 @@ +query GetBitmapsWildcard($block_date: date, $receiver_ids: String, $limit: Int, $offset: Int) { + darunrs_near_bitmap_v5_actions_index(limit: $limit, offset: $offset, where: {block_date: {_eq: $block_date}, receiver: {receiver: {_regex: $receiver_ids}}}) { + bitmap + first_block_height + } +} diff --git a/block-streamer/graphql/darunrs_near/schema.graphql b/block-streamer/graphql/darunrs_near/schema.graphql new file mode 100644 index 000000000..4d27d2019 --- /dev/null +++ b/block-streamer/graphql/darunrs_near/schema.graphql @@ -0,0 +1,6178 @@ +schema { + query: query_root + mutation: mutation_root + subscription: subscription_root +} + +"""whether this query should be cached (Hasura Cloud only)""" +directive @cached( + """measured in seconds""" + ttl: Int! = 60 + + """refresh the cache entry""" + refresh: Boolean! = false +) on QUERY + +""" +Boolean expression to compare columns of type "Int". All fields are combined with logical 'AND'. +""" +input Int_comparison_exp { + _eq: Int + _gt: Int + _gte: Int + _in: [Int!] + _is_null: Boolean + _lt: Int + _lte: Int + _neq: Int + _nin: [Int!] +} + +""" +Boolean expression to compare columns of type "String". All fields are combined with logical 'AND'. +""" +input String_comparison_exp { + _eq: String + _gt: String + _gte: String + + """does the column match the given case-insensitive pattern""" + _ilike: String + _in: [String!] + + """ + does the column match the given POSIX regular expression, case insensitive + """ + _iregex: String + _is_null: Boolean + + """does the column match the given pattern""" + _like: String + _lt: String + _lte: String + _neq: String + + """does the column NOT match the given case-insensitive pattern""" + _nilike: String + _nin: [String!] + + """ + does the column NOT match the given POSIX regular expression, case insensitive + """ + _niregex: String + + """does the column NOT match the given pattern""" + _nlike: String + + """ + does the column NOT match the given POSIX regular expression, case sensitive + """ + _nregex: String + + """does the column NOT match the given SQL regular expression""" + _nsimilar: String + + """ + does the column match the given POSIX regular expression, case sensitive + """ + _regex: String + + """does the column match the given SQL regular expression""" + _similar: String +} + +scalar bigint + +""" +Boolean expression to compare columns of type "bigint". All fields are combined with logical 'AND'. +""" +input bigint_comparison_exp { + _eq: bigint + _gt: bigint + _gte: bigint + _in: [bigint!] + _is_null: Boolean + _lt: bigint + _lte: bigint + _neq: bigint + _nin: [bigint!] +} + +"""ordering argument of a cursor""" +enum cursor_ordering { + """ascending ordering of the cursor""" + ASC + + """descending ordering of the cursor""" + DESC +} + +""" +columns and relationships of "darunrs_near_benchmark_indexer.indexer_storage" +""" +type darunrs_near_benchmark_indexer_indexer_storage { + function_name: String! + key_name: String! + value: String! +} + +""" +aggregated selection of "darunrs_near_benchmark_indexer.indexer_storage" +""" +type darunrs_near_benchmark_indexer_indexer_storage_aggregate { + aggregate: darunrs_near_benchmark_indexer_indexer_storage_aggregate_fields + nodes: [darunrs_near_benchmark_indexer_indexer_storage!]! +} + +""" +aggregate fields of "darunrs_near_benchmark_indexer.indexer_storage" +""" +type darunrs_near_benchmark_indexer_indexer_storage_aggregate_fields { + count(columns: [darunrs_near_benchmark_indexer_indexer_storage_select_column!], distinct: Boolean): Int! + max: darunrs_near_benchmark_indexer_indexer_storage_max_fields + min: darunrs_near_benchmark_indexer_indexer_storage_min_fields +} + +""" +Boolean expression to filter rows from the table "darunrs_near_benchmark_indexer.indexer_storage". All fields are combined with a logical 'AND'. +""" +input darunrs_near_benchmark_indexer_indexer_storage_bool_exp { + _and: [darunrs_near_benchmark_indexer_indexer_storage_bool_exp!] + _not: darunrs_near_benchmark_indexer_indexer_storage_bool_exp + _or: [darunrs_near_benchmark_indexer_indexer_storage_bool_exp!] + function_name: String_comparison_exp + key_name: String_comparison_exp + value: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_benchmark_indexer_indexer_storage_max_fields { + function_name: String + key_name: String + value: String +} + +"""aggregate min on columns""" +type darunrs_near_benchmark_indexer_indexer_storage_min_fields { + function_name: String + key_name: String + value: String +} + +""" +Ordering options when selecting data from "darunrs_near_benchmark_indexer.indexer_storage". +""" +input darunrs_near_benchmark_indexer_indexer_storage_order_by { + function_name: order_by + key_name: order_by + value: order_by +} + +""" +select columns of table "darunrs_near_benchmark_indexer.indexer_storage" +""" +enum darunrs_near_benchmark_indexer_indexer_storage_select_column { + """column name""" + function_name + + """column name""" + key_name + + """column name""" + value +} + +""" +Streaming cursor of the table "darunrs_near_benchmark_indexer_indexer_storage" +""" +input darunrs_near_benchmark_indexer_indexer_storage_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_benchmark_indexer_indexer_storage_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_benchmark_indexer_indexer_storage_stream_cursor_value_input { + function_name: String + key_name: String + value: String +} + +""" +columns and relationships of "darunrs_near_benchmark_indexer.sys_logs" +""" +type darunrs_near_benchmark_indexer_sys_logs { + block_height: numeric + date: date! + id: bigint! + level: String! + message: String! + timestamp: timestamp! + type: String! +} + +""" +aggregated selection of "darunrs_near_benchmark_indexer.sys_logs" +""" +type darunrs_near_benchmark_indexer_sys_logs_aggregate { + aggregate: darunrs_near_benchmark_indexer_sys_logs_aggregate_fields + nodes: [darunrs_near_benchmark_indexer_sys_logs!]! +} + +""" +aggregate fields of "darunrs_near_benchmark_indexer.sys_logs" +""" +type darunrs_near_benchmark_indexer_sys_logs_aggregate_fields { + avg: darunrs_near_benchmark_indexer_sys_logs_avg_fields + count(columns: [darunrs_near_benchmark_indexer_sys_logs_select_column!], distinct: Boolean): Int! + max: darunrs_near_benchmark_indexer_sys_logs_max_fields + min: darunrs_near_benchmark_indexer_sys_logs_min_fields + stddev: darunrs_near_benchmark_indexer_sys_logs_stddev_fields + stddev_pop: darunrs_near_benchmark_indexer_sys_logs_stddev_pop_fields + stddev_samp: darunrs_near_benchmark_indexer_sys_logs_stddev_samp_fields + sum: darunrs_near_benchmark_indexer_sys_logs_sum_fields + var_pop: darunrs_near_benchmark_indexer_sys_logs_var_pop_fields + var_samp: darunrs_near_benchmark_indexer_sys_logs_var_samp_fields + variance: darunrs_near_benchmark_indexer_sys_logs_variance_fields +} + +"""aggregate avg on columns""" +type darunrs_near_benchmark_indexer_sys_logs_avg_fields { + block_height: Float + id: Float +} + +""" +Boolean expression to filter rows from the table "darunrs_near_benchmark_indexer.sys_logs". All fields are combined with a logical 'AND'. +""" +input darunrs_near_benchmark_indexer_sys_logs_bool_exp { + _and: [darunrs_near_benchmark_indexer_sys_logs_bool_exp!] + _not: darunrs_near_benchmark_indexer_sys_logs_bool_exp + _or: [darunrs_near_benchmark_indexer_sys_logs_bool_exp!] + block_height: numeric_comparison_exp + date: date_comparison_exp + id: bigint_comparison_exp + level: String_comparison_exp + message: String_comparison_exp + timestamp: timestamp_comparison_exp + type: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_benchmark_indexer_sys_logs_max_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate min on columns""" +type darunrs_near_benchmark_indexer_sys_logs_min_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +""" +Ordering options when selecting data from "darunrs_near_benchmark_indexer.sys_logs". +""" +input darunrs_near_benchmark_indexer_sys_logs_order_by { + block_height: order_by + date: order_by + id: order_by + level: order_by + message: order_by + timestamp: order_by + type: order_by +} + +""" +select columns of table "darunrs_near_benchmark_indexer.sys_logs" +""" +enum darunrs_near_benchmark_indexer_sys_logs_select_column { + """column name""" + block_height + + """column name""" + date + + """column name""" + id + + """column name""" + level + + """column name""" + message + + """column name""" + timestamp + + """column name""" + type +} + +"""aggregate stddev on columns""" +type darunrs_near_benchmark_indexer_sys_logs_stddev_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_benchmark_indexer_sys_logs_stddev_pop_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_benchmark_indexer_sys_logs_stddev_samp_fields { + block_height: Float + id: Float +} + +""" +Streaming cursor of the table "darunrs_near_benchmark_indexer_sys_logs" +""" +input darunrs_near_benchmark_indexer_sys_logs_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_benchmark_indexer_sys_logs_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_benchmark_indexer_sys_logs_stream_cursor_value_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate sum on columns""" +type darunrs_near_benchmark_indexer_sys_logs_sum_fields { + block_height: numeric + id: bigint +} + +"""aggregate var_pop on columns""" +type darunrs_near_benchmark_indexer_sys_logs_var_pop_fields { + block_height: Float + id: Float +} + +"""aggregate var_samp on columns""" +type darunrs_near_benchmark_indexer_sys_logs_var_samp_fields { + block_height: Float + id: Float +} + +"""aggregate variance on columns""" +type darunrs_near_benchmark_indexer_sys_logs_variance_fields { + block_height: Float + id: Float +} + +""" +columns and relationships of "darunrs_near_benchmark_indexer.sys_metadata" +""" +type darunrs_near_benchmark_indexer_sys_metadata { + attribute: String! + value: String! +} + +""" +aggregated selection of "darunrs_near_benchmark_indexer.sys_metadata" +""" +type darunrs_near_benchmark_indexer_sys_metadata_aggregate { + aggregate: darunrs_near_benchmark_indexer_sys_metadata_aggregate_fields + nodes: [darunrs_near_benchmark_indexer_sys_metadata!]! +} + +""" +aggregate fields of "darunrs_near_benchmark_indexer.sys_metadata" +""" +type darunrs_near_benchmark_indexer_sys_metadata_aggregate_fields { + count(columns: [darunrs_near_benchmark_indexer_sys_metadata_select_column!], distinct: Boolean): Int! + max: darunrs_near_benchmark_indexer_sys_metadata_max_fields + min: darunrs_near_benchmark_indexer_sys_metadata_min_fields +} + +""" +Boolean expression to filter rows from the table "darunrs_near_benchmark_indexer.sys_metadata". All fields are combined with a logical 'AND'. +""" +input darunrs_near_benchmark_indexer_sys_metadata_bool_exp { + _and: [darunrs_near_benchmark_indexer_sys_metadata_bool_exp!] + _not: darunrs_near_benchmark_indexer_sys_metadata_bool_exp + _or: [darunrs_near_benchmark_indexer_sys_metadata_bool_exp!] + attribute: String_comparison_exp + value: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_benchmark_indexer_sys_metadata_max_fields { + attribute: String + value: String +} + +"""aggregate min on columns""" +type darunrs_near_benchmark_indexer_sys_metadata_min_fields { + attribute: String + value: String +} + +""" +Ordering options when selecting data from "darunrs_near_benchmark_indexer.sys_metadata". +""" +input darunrs_near_benchmark_indexer_sys_metadata_order_by { + attribute: order_by + value: order_by +} + +""" +select columns of table "darunrs_near_benchmark_indexer.sys_metadata" +""" +enum darunrs_near_benchmark_indexer_sys_metadata_select_column { + """column name""" + attribute + + """column name""" + value +} + +""" +Streaming cursor of the table "darunrs_near_benchmark_indexer_sys_metadata" +""" +input darunrs_near_benchmark_indexer_sys_metadata_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_benchmark_indexer_sys_metadata_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_benchmark_indexer_sys_metadata_stream_cursor_value_input { + attribute: String + value: String +} + +""" +columns and relationships of "darunrs_near_bitmap_v3.actions_index" +""" +type darunrs_near_bitmap_v3_actions_index { + bitmap: String! + block_date: String! + first_block_height: numeric! + last_elias_gamma_start_bit: numeric! + max_index: numeric! + receiver_id: String! +} + +""" +aggregated selection of "darunrs_near_bitmap_v3.actions_index" +""" +type darunrs_near_bitmap_v3_actions_index_aggregate { + aggregate: darunrs_near_bitmap_v3_actions_index_aggregate_fields + nodes: [darunrs_near_bitmap_v3_actions_index!]! +} + +""" +aggregate fields of "darunrs_near_bitmap_v3.actions_index" +""" +type darunrs_near_bitmap_v3_actions_index_aggregate_fields { + avg: darunrs_near_bitmap_v3_actions_index_avg_fields + count(columns: [darunrs_near_bitmap_v3_actions_index_select_column!], distinct: Boolean): Int! + max: darunrs_near_bitmap_v3_actions_index_max_fields + min: darunrs_near_bitmap_v3_actions_index_min_fields + stddev: darunrs_near_bitmap_v3_actions_index_stddev_fields + stddev_pop: darunrs_near_bitmap_v3_actions_index_stddev_pop_fields + stddev_samp: darunrs_near_bitmap_v3_actions_index_stddev_samp_fields + sum: darunrs_near_bitmap_v3_actions_index_sum_fields + var_pop: darunrs_near_bitmap_v3_actions_index_var_pop_fields + var_samp: darunrs_near_bitmap_v3_actions_index_var_samp_fields + variance: darunrs_near_bitmap_v3_actions_index_variance_fields +} + +"""aggregate avg on columns""" +type darunrs_near_bitmap_v3_actions_index_avg_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float +} + +""" +Boolean expression to filter rows from the table "darunrs_near_bitmap_v3.actions_index". All fields are combined with a logical 'AND'. +""" +input darunrs_near_bitmap_v3_actions_index_bool_exp { + _and: [darunrs_near_bitmap_v3_actions_index_bool_exp!] + _not: darunrs_near_bitmap_v3_actions_index_bool_exp + _or: [darunrs_near_bitmap_v3_actions_index_bool_exp!] + bitmap: String_comparison_exp + block_date: String_comparison_exp + first_block_height: numeric_comparison_exp + last_elias_gamma_start_bit: numeric_comparison_exp + max_index: numeric_comparison_exp + receiver_id: String_comparison_exp +} + +""" +unique or primary key constraints on table "darunrs_near_bitmap_v3.actions_index" +""" +enum darunrs_near_bitmap_v3_actions_index_constraint { + """ + unique or primary key constraint on columns "receiver_id", "block_date" + """ + actions_index_pkey +} + +""" +input type for incrementing numeric columns in table "darunrs_near_bitmap_v3.actions_index" +""" +input darunrs_near_bitmap_v3_actions_index_inc_input { + first_block_height: numeric + last_elias_gamma_start_bit: numeric + max_index: numeric +} + +""" +input type for inserting data into table "darunrs_near_bitmap_v3.actions_index" +""" +input darunrs_near_bitmap_v3_actions_index_insert_input { + bitmap: String + block_date: String + first_block_height: numeric + last_elias_gamma_start_bit: numeric + max_index: numeric + receiver_id: String +} + +"""aggregate max on columns""" +type darunrs_near_bitmap_v3_actions_index_max_fields { + bitmap: String + block_date: String + first_block_height: numeric + last_elias_gamma_start_bit: numeric + max_index: numeric + receiver_id: String +} + +"""aggregate min on columns""" +type darunrs_near_bitmap_v3_actions_index_min_fields { + bitmap: String + block_date: String + first_block_height: numeric + last_elias_gamma_start_bit: numeric + max_index: numeric + receiver_id: String +} + +""" +response of any mutation on the table "darunrs_near_bitmap_v3.actions_index" +""" +type darunrs_near_bitmap_v3_actions_index_mutation_response { + """number of rows affected by the mutation""" + affected_rows: Int! + + """data from the rows affected by the mutation""" + returning: [darunrs_near_bitmap_v3_actions_index!]! +} + +""" +on_conflict condition type for table "darunrs_near_bitmap_v3.actions_index" +""" +input darunrs_near_bitmap_v3_actions_index_on_conflict { + constraint: darunrs_near_bitmap_v3_actions_index_constraint! + update_columns: [darunrs_near_bitmap_v3_actions_index_update_column!]! = [] + where: darunrs_near_bitmap_v3_actions_index_bool_exp +} + +""" +Ordering options when selecting data from "darunrs_near_bitmap_v3.actions_index". +""" +input darunrs_near_bitmap_v3_actions_index_order_by { + bitmap: order_by + block_date: order_by + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +""" +primary key columns input for table: darunrs_near_bitmap_v3.actions_index +""" +input darunrs_near_bitmap_v3_actions_index_pk_columns_input { + block_date: String! + receiver_id: String! +} + +""" +select columns of table "darunrs_near_bitmap_v3.actions_index" +""" +enum darunrs_near_bitmap_v3_actions_index_select_column { + """column name""" + bitmap + + """column name""" + block_date + + """column name""" + first_block_height + + """column name""" + last_elias_gamma_start_bit + + """column name""" + max_index + + """column name""" + receiver_id +} + +""" +input type for updating data in table "darunrs_near_bitmap_v3.actions_index" +""" +input darunrs_near_bitmap_v3_actions_index_set_input { + bitmap: String + block_date: String + first_block_height: numeric + last_elias_gamma_start_bit: numeric + max_index: numeric + receiver_id: String +} + +"""aggregate stddev on columns""" +type darunrs_near_bitmap_v3_actions_index_stddev_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_bitmap_v3_actions_index_stddev_pop_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_bitmap_v3_actions_index_stddev_samp_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float +} + +""" +Streaming cursor of the table "darunrs_near_bitmap_v3_actions_index" +""" +input darunrs_near_bitmap_v3_actions_index_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_bitmap_v3_actions_index_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_bitmap_v3_actions_index_stream_cursor_value_input { + bitmap: String + block_date: String + first_block_height: numeric + last_elias_gamma_start_bit: numeric + max_index: numeric + receiver_id: String +} + +"""aggregate sum on columns""" +type darunrs_near_bitmap_v3_actions_index_sum_fields { + first_block_height: numeric + last_elias_gamma_start_bit: numeric + max_index: numeric +} + +""" +update columns of table "darunrs_near_bitmap_v3.actions_index" +""" +enum darunrs_near_bitmap_v3_actions_index_update_column { + """column name""" + bitmap + + """column name""" + block_date + + """column name""" + first_block_height + + """column name""" + last_elias_gamma_start_bit + + """column name""" + max_index + + """column name""" + receiver_id +} + +input darunrs_near_bitmap_v3_actions_index_updates { + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_bitmap_v3_actions_index_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_actions_index_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_bitmap_v3_actions_index_bool_exp! +} + +"""aggregate var_pop on columns""" +type darunrs_near_bitmap_v3_actions_index_var_pop_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float +} + +"""aggregate var_samp on columns""" +type darunrs_near_bitmap_v3_actions_index_var_samp_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float +} + +"""aggregate variance on columns""" +type darunrs_near_bitmap_v3_actions_index_variance_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float +} + +""" +columns and relationships of "darunrs_near_bitmap_v3.sys_logs" +""" +type darunrs_near_bitmap_v3_sys_logs { + block_height: numeric + date: date! + id: bigint! + level: String! + message: String! + timestamp: timestamp! + type: String! +} + +""" +aggregated selection of "darunrs_near_bitmap_v3.sys_logs" +""" +type darunrs_near_bitmap_v3_sys_logs_aggregate { + aggregate: darunrs_near_bitmap_v3_sys_logs_aggregate_fields + nodes: [darunrs_near_bitmap_v3_sys_logs!]! +} + +""" +aggregate fields of "darunrs_near_bitmap_v3.sys_logs" +""" +type darunrs_near_bitmap_v3_sys_logs_aggregate_fields { + avg: darunrs_near_bitmap_v3_sys_logs_avg_fields + count(columns: [darunrs_near_bitmap_v3_sys_logs_select_column!], distinct: Boolean): Int! + max: darunrs_near_bitmap_v3_sys_logs_max_fields + min: darunrs_near_bitmap_v3_sys_logs_min_fields + stddev: darunrs_near_bitmap_v3_sys_logs_stddev_fields + stddev_pop: darunrs_near_bitmap_v3_sys_logs_stddev_pop_fields + stddev_samp: darunrs_near_bitmap_v3_sys_logs_stddev_samp_fields + sum: darunrs_near_bitmap_v3_sys_logs_sum_fields + var_pop: darunrs_near_bitmap_v3_sys_logs_var_pop_fields + var_samp: darunrs_near_bitmap_v3_sys_logs_var_samp_fields + variance: darunrs_near_bitmap_v3_sys_logs_variance_fields +} + +"""aggregate avg on columns""" +type darunrs_near_bitmap_v3_sys_logs_avg_fields { + block_height: Float + id: Float +} + +""" +Boolean expression to filter rows from the table "darunrs_near_bitmap_v3.sys_logs". All fields are combined with a logical 'AND'. +""" +input darunrs_near_bitmap_v3_sys_logs_bool_exp { + _and: [darunrs_near_bitmap_v3_sys_logs_bool_exp!] + _not: darunrs_near_bitmap_v3_sys_logs_bool_exp + _or: [darunrs_near_bitmap_v3_sys_logs_bool_exp!] + block_height: numeric_comparison_exp + date: date_comparison_exp + id: bigint_comparison_exp + level: String_comparison_exp + message: String_comparison_exp + timestamp: timestamp_comparison_exp + type: String_comparison_exp +} + +""" +unique or primary key constraints on table "darunrs_near_bitmap_v3.sys_logs" +""" +enum darunrs_near_bitmap_v3_sys_logs_constraint { + """ + unique or primary key constraint on columns "id", "date" + """ + sys_logs_pkey +} + +""" +input type for incrementing numeric columns in table "darunrs_near_bitmap_v3.sys_logs" +""" +input darunrs_near_bitmap_v3_sys_logs_inc_input { + block_height: numeric + id: bigint +} + +""" +input type for inserting data into table "darunrs_near_bitmap_v3.sys_logs" +""" +input darunrs_near_bitmap_v3_sys_logs_insert_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate max on columns""" +type darunrs_near_bitmap_v3_sys_logs_max_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate min on columns""" +type darunrs_near_bitmap_v3_sys_logs_min_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +""" +response of any mutation on the table "darunrs_near_bitmap_v3.sys_logs" +""" +type darunrs_near_bitmap_v3_sys_logs_mutation_response { + """number of rows affected by the mutation""" + affected_rows: Int! + + """data from the rows affected by the mutation""" + returning: [darunrs_near_bitmap_v3_sys_logs!]! +} + +""" +on_conflict condition type for table "darunrs_near_bitmap_v3.sys_logs" +""" +input darunrs_near_bitmap_v3_sys_logs_on_conflict { + constraint: darunrs_near_bitmap_v3_sys_logs_constraint! + update_columns: [darunrs_near_bitmap_v3_sys_logs_update_column!]! = [] + where: darunrs_near_bitmap_v3_sys_logs_bool_exp +} + +""" +Ordering options when selecting data from "darunrs_near_bitmap_v3.sys_logs". +""" +input darunrs_near_bitmap_v3_sys_logs_order_by { + block_height: order_by + date: order_by + id: order_by + level: order_by + message: order_by + timestamp: order_by + type: order_by +} + +"""primary key columns input for table: darunrs_near_bitmap_v3.sys_logs""" +input darunrs_near_bitmap_v3_sys_logs_pk_columns_input { + date: date! + id: bigint! +} + +""" +select columns of table "darunrs_near_bitmap_v3.sys_logs" +""" +enum darunrs_near_bitmap_v3_sys_logs_select_column { + """column name""" + block_height + + """column name""" + date + + """column name""" + id + + """column name""" + level + + """column name""" + message + + """column name""" + timestamp + + """column name""" + type +} + +""" +input type for updating data in table "darunrs_near_bitmap_v3.sys_logs" +""" +input darunrs_near_bitmap_v3_sys_logs_set_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate stddev on columns""" +type darunrs_near_bitmap_v3_sys_logs_stddev_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_bitmap_v3_sys_logs_stddev_pop_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_bitmap_v3_sys_logs_stddev_samp_fields { + block_height: Float + id: Float +} + +""" +Streaming cursor of the table "darunrs_near_bitmap_v3_sys_logs" +""" +input darunrs_near_bitmap_v3_sys_logs_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_bitmap_v3_sys_logs_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_bitmap_v3_sys_logs_stream_cursor_value_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate sum on columns""" +type darunrs_near_bitmap_v3_sys_logs_sum_fields { + block_height: numeric + id: bigint +} + +""" +update columns of table "darunrs_near_bitmap_v3.sys_logs" +""" +enum darunrs_near_bitmap_v3_sys_logs_update_column { + """column name""" + block_height + + """column name""" + date + + """column name""" + id + + """column name""" + level + + """column name""" + message + + """column name""" + timestamp + + """column name""" + type +} + +input darunrs_near_bitmap_v3_sys_logs_updates { + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_bitmap_v3_sys_logs_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_sys_logs_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_bitmap_v3_sys_logs_bool_exp! +} + +"""aggregate var_pop on columns""" +type darunrs_near_bitmap_v3_sys_logs_var_pop_fields { + block_height: Float + id: Float +} + +"""aggregate var_samp on columns""" +type darunrs_near_bitmap_v3_sys_logs_var_samp_fields { + block_height: Float + id: Float +} + +"""aggregate variance on columns""" +type darunrs_near_bitmap_v3_sys_logs_variance_fields { + block_height: Float + id: Float +} + +""" +columns and relationships of "darunrs_near_bitmap_v3.sys_metadata" +""" +type darunrs_near_bitmap_v3_sys_metadata { + attribute: String! + value: String! +} + +""" +aggregated selection of "darunrs_near_bitmap_v3.sys_metadata" +""" +type darunrs_near_bitmap_v3_sys_metadata_aggregate { + aggregate: darunrs_near_bitmap_v3_sys_metadata_aggregate_fields + nodes: [darunrs_near_bitmap_v3_sys_metadata!]! +} + +""" +aggregate fields of "darunrs_near_bitmap_v3.sys_metadata" +""" +type darunrs_near_bitmap_v3_sys_metadata_aggregate_fields { + count(columns: [darunrs_near_bitmap_v3_sys_metadata_select_column!], distinct: Boolean): Int! + max: darunrs_near_bitmap_v3_sys_metadata_max_fields + min: darunrs_near_bitmap_v3_sys_metadata_min_fields +} + +""" +Boolean expression to filter rows from the table "darunrs_near_bitmap_v3.sys_metadata". All fields are combined with a logical 'AND'. +""" +input darunrs_near_bitmap_v3_sys_metadata_bool_exp { + _and: [darunrs_near_bitmap_v3_sys_metadata_bool_exp!] + _not: darunrs_near_bitmap_v3_sys_metadata_bool_exp + _or: [darunrs_near_bitmap_v3_sys_metadata_bool_exp!] + attribute: String_comparison_exp + value: String_comparison_exp +} + +""" +unique or primary key constraints on table "darunrs_near_bitmap_v3.sys_metadata" +""" +enum darunrs_near_bitmap_v3_sys_metadata_constraint { + """ + unique or primary key constraint on columns "attribute" + """ + sys_metadata_pkey +} + +""" +input type for inserting data into table "darunrs_near_bitmap_v3.sys_metadata" +""" +input darunrs_near_bitmap_v3_sys_metadata_insert_input { + attribute: String + value: String +} + +"""aggregate max on columns""" +type darunrs_near_bitmap_v3_sys_metadata_max_fields { + attribute: String + value: String +} + +"""aggregate min on columns""" +type darunrs_near_bitmap_v3_sys_metadata_min_fields { + attribute: String + value: String +} + +""" +response of any mutation on the table "darunrs_near_bitmap_v3.sys_metadata" +""" +type darunrs_near_bitmap_v3_sys_metadata_mutation_response { + """number of rows affected by the mutation""" + affected_rows: Int! + + """data from the rows affected by the mutation""" + returning: [darunrs_near_bitmap_v3_sys_metadata!]! +} + +""" +on_conflict condition type for table "darunrs_near_bitmap_v3.sys_metadata" +""" +input darunrs_near_bitmap_v3_sys_metadata_on_conflict { + constraint: darunrs_near_bitmap_v3_sys_metadata_constraint! + update_columns: [darunrs_near_bitmap_v3_sys_metadata_update_column!]! = [] + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp +} + +""" +Ordering options when selecting data from "darunrs_near_bitmap_v3.sys_metadata". +""" +input darunrs_near_bitmap_v3_sys_metadata_order_by { + attribute: order_by + value: order_by +} + +""" +primary key columns input for table: darunrs_near_bitmap_v3.sys_metadata +""" +input darunrs_near_bitmap_v3_sys_metadata_pk_columns_input { + attribute: String! +} + +""" +select columns of table "darunrs_near_bitmap_v3.sys_metadata" +""" +enum darunrs_near_bitmap_v3_sys_metadata_select_column { + """column name""" + attribute + + """column name""" + value +} + +""" +input type for updating data in table "darunrs_near_bitmap_v3.sys_metadata" +""" +input darunrs_near_bitmap_v3_sys_metadata_set_input { + attribute: String + value: String +} + +""" +Streaming cursor of the table "darunrs_near_bitmap_v3_sys_metadata" +""" +input darunrs_near_bitmap_v3_sys_metadata_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_bitmap_v3_sys_metadata_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_bitmap_v3_sys_metadata_stream_cursor_value_input { + attribute: String + value: String +} + +""" +update columns of table "darunrs_near_bitmap_v3.sys_metadata" +""" +enum darunrs_near_bitmap_v3_sys_metadata_update_column { + """column name""" + attribute + + """column name""" + value +} + +input darunrs_near_bitmap_v3_sys_metadata_updates { + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_sys_metadata_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp! +} + +""" +columns and relationships of "darunrs_near_bitmap_v5.actions_index" +""" +type darunrs_near_bitmap_v5_actions_index { + bitmap: String! + block_date: date! + first_block_height: Int! + last_elias_gamma_start_bit: Int! + max_index: Int! + + """An object relationship""" + receiver: darunrs_near_bitmap_v5_receivers! + receiver_id: bigint! +} + +""" +aggregated selection of "darunrs_near_bitmap_v5.actions_index" +""" +type darunrs_near_bitmap_v5_actions_index_aggregate { + aggregate: darunrs_near_bitmap_v5_actions_index_aggregate_fields + nodes: [darunrs_near_bitmap_v5_actions_index!]! +} + +input darunrs_near_bitmap_v5_actions_index_aggregate_bool_exp { + count: darunrs_near_bitmap_v5_actions_index_aggregate_bool_exp_count +} + +input darunrs_near_bitmap_v5_actions_index_aggregate_bool_exp_count { + arguments: [darunrs_near_bitmap_v5_actions_index_select_column!] + distinct: Boolean + filter: darunrs_near_bitmap_v5_actions_index_bool_exp + predicate: Int_comparison_exp! +} + +""" +aggregate fields of "darunrs_near_bitmap_v5.actions_index" +""" +type darunrs_near_bitmap_v5_actions_index_aggregate_fields { + avg: darunrs_near_bitmap_v5_actions_index_avg_fields + count(columns: [darunrs_near_bitmap_v5_actions_index_select_column!], distinct: Boolean): Int! + max: darunrs_near_bitmap_v5_actions_index_max_fields + min: darunrs_near_bitmap_v5_actions_index_min_fields + stddev: darunrs_near_bitmap_v5_actions_index_stddev_fields + stddev_pop: darunrs_near_bitmap_v5_actions_index_stddev_pop_fields + stddev_samp: darunrs_near_bitmap_v5_actions_index_stddev_samp_fields + sum: darunrs_near_bitmap_v5_actions_index_sum_fields + var_pop: darunrs_near_bitmap_v5_actions_index_var_pop_fields + var_samp: darunrs_near_bitmap_v5_actions_index_var_samp_fields + variance: darunrs_near_bitmap_v5_actions_index_variance_fields +} + +""" +order by aggregate values of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_aggregate_order_by { + avg: darunrs_near_bitmap_v5_actions_index_avg_order_by + count: order_by + max: darunrs_near_bitmap_v5_actions_index_max_order_by + min: darunrs_near_bitmap_v5_actions_index_min_order_by + stddev: darunrs_near_bitmap_v5_actions_index_stddev_order_by + stddev_pop: darunrs_near_bitmap_v5_actions_index_stddev_pop_order_by + stddev_samp: darunrs_near_bitmap_v5_actions_index_stddev_samp_order_by + sum: darunrs_near_bitmap_v5_actions_index_sum_order_by + var_pop: darunrs_near_bitmap_v5_actions_index_var_pop_order_by + var_samp: darunrs_near_bitmap_v5_actions_index_var_samp_order_by + variance: darunrs_near_bitmap_v5_actions_index_variance_order_by +} + +"""aggregate avg on columns""" +type darunrs_near_bitmap_v5_actions_index_avg_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float + receiver_id: Float +} + +""" +order by avg() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_avg_order_by { + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +""" +Boolean expression to filter rows from the table "darunrs_near_bitmap_v5.actions_index". All fields are combined with a logical 'AND'. +""" +input darunrs_near_bitmap_v5_actions_index_bool_exp { + _and: [darunrs_near_bitmap_v5_actions_index_bool_exp!] + _not: darunrs_near_bitmap_v5_actions_index_bool_exp + _or: [darunrs_near_bitmap_v5_actions_index_bool_exp!] + bitmap: String_comparison_exp + block_date: date_comparison_exp + first_block_height: Int_comparison_exp + last_elias_gamma_start_bit: Int_comparison_exp + max_index: Int_comparison_exp + receiver: darunrs_near_bitmap_v5_receivers_bool_exp + receiver_id: bigint_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_bitmap_v5_actions_index_max_fields { + bitmap: String + block_date: date + first_block_height: Int + last_elias_gamma_start_bit: Int + max_index: Int + receiver_id: bigint +} + +""" +order by max() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_max_order_by { + bitmap: order_by + block_date: order_by + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +"""aggregate min on columns""" +type darunrs_near_bitmap_v5_actions_index_min_fields { + bitmap: String + block_date: date + first_block_height: Int + last_elias_gamma_start_bit: Int + max_index: Int + receiver_id: bigint +} + +""" +order by min() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_min_order_by { + bitmap: order_by + block_date: order_by + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +""" +Ordering options when selecting data from "darunrs_near_bitmap_v5.actions_index". +""" +input darunrs_near_bitmap_v5_actions_index_order_by { + bitmap: order_by + block_date: order_by + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver: darunrs_near_bitmap_v5_receivers_order_by + receiver_id: order_by +} + +""" +select columns of table "darunrs_near_bitmap_v5.actions_index" +""" +enum darunrs_near_bitmap_v5_actions_index_select_column { + """column name""" + bitmap + + """column name""" + block_date + + """column name""" + first_block_height + + """column name""" + last_elias_gamma_start_bit + + """column name""" + max_index + + """column name""" + receiver_id +} + +"""aggregate stddev on columns""" +type darunrs_near_bitmap_v5_actions_index_stddev_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float + receiver_id: Float +} + +""" +order by stddev() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_stddev_order_by { + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_bitmap_v5_actions_index_stddev_pop_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float + receiver_id: Float +} + +""" +order by stddev_pop() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_stddev_pop_order_by { + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_bitmap_v5_actions_index_stddev_samp_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float + receiver_id: Float +} + +""" +order by stddev_samp() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_stddev_samp_order_by { + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +""" +Streaming cursor of the table "darunrs_near_bitmap_v5_actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_bitmap_v5_actions_index_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_bitmap_v5_actions_index_stream_cursor_value_input { + bitmap: String + block_date: date + first_block_height: Int + last_elias_gamma_start_bit: Int + max_index: Int + receiver_id: bigint +} + +"""aggregate sum on columns""" +type darunrs_near_bitmap_v5_actions_index_sum_fields { + first_block_height: Int + last_elias_gamma_start_bit: Int + max_index: Int + receiver_id: bigint +} + +""" +order by sum() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_sum_order_by { + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +"""aggregate var_pop on columns""" +type darunrs_near_bitmap_v5_actions_index_var_pop_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float + receiver_id: Float +} + +""" +order by var_pop() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_var_pop_order_by { + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +"""aggregate var_samp on columns""" +type darunrs_near_bitmap_v5_actions_index_var_samp_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float + receiver_id: Float +} + +""" +order by var_samp() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_var_samp_order_by { + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +"""aggregate variance on columns""" +type darunrs_near_bitmap_v5_actions_index_variance_fields { + first_block_height: Float + last_elias_gamma_start_bit: Float + max_index: Float + receiver_id: Float +} + +""" +order by variance() on columns of table "darunrs_near_bitmap_v5.actions_index" +""" +input darunrs_near_bitmap_v5_actions_index_variance_order_by { + first_block_height: order_by + last_elias_gamma_start_bit: order_by + max_index: order_by + receiver_id: order_by +} + +""" +columns and relationships of "darunrs_near_bitmap_v5.receivers" +""" +type darunrs_near_bitmap_v5_receivers { + """An array relationship""" + actions_index( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_actions_index_bool_exp + ): [darunrs_near_bitmap_v5_actions_index!]! + + """An aggregate relationship""" + actions_index_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_actions_index_bool_exp + ): darunrs_near_bitmap_v5_actions_index_aggregate! + id: bigint! + receiver: String! +} + +""" +aggregated selection of "darunrs_near_bitmap_v5.receivers" +""" +type darunrs_near_bitmap_v5_receivers_aggregate { + aggregate: darunrs_near_bitmap_v5_receivers_aggregate_fields + nodes: [darunrs_near_bitmap_v5_receivers!]! +} + +""" +aggregate fields of "darunrs_near_bitmap_v5.receivers" +""" +type darunrs_near_bitmap_v5_receivers_aggregate_fields { + avg: darunrs_near_bitmap_v5_receivers_avg_fields + count(columns: [darunrs_near_bitmap_v5_receivers_select_column!], distinct: Boolean): Int! + max: darunrs_near_bitmap_v5_receivers_max_fields + min: darunrs_near_bitmap_v5_receivers_min_fields + stddev: darunrs_near_bitmap_v5_receivers_stddev_fields + stddev_pop: darunrs_near_bitmap_v5_receivers_stddev_pop_fields + stddev_samp: darunrs_near_bitmap_v5_receivers_stddev_samp_fields + sum: darunrs_near_bitmap_v5_receivers_sum_fields + var_pop: darunrs_near_bitmap_v5_receivers_var_pop_fields + var_samp: darunrs_near_bitmap_v5_receivers_var_samp_fields + variance: darunrs_near_bitmap_v5_receivers_variance_fields +} + +"""aggregate avg on columns""" +type darunrs_near_bitmap_v5_receivers_avg_fields { + id: Float +} + +""" +Boolean expression to filter rows from the table "darunrs_near_bitmap_v5.receivers". All fields are combined with a logical 'AND'. +""" +input darunrs_near_bitmap_v5_receivers_bool_exp { + _and: [darunrs_near_bitmap_v5_receivers_bool_exp!] + _not: darunrs_near_bitmap_v5_receivers_bool_exp + _or: [darunrs_near_bitmap_v5_receivers_bool_exp!] + actions_index: darunrs_near_bitmap_v5_actions_index_bool_exp + actions_index_aggregate: darunrs_near_bitmap_v5_actions_index_aggregate_bool_exp + id: bigint_comparison_exp + receiver: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_bitmap_v5_receivers_max_fields { + id: bigint + receiver: String +} + +"""aggregate min on columns""" +type darunrs_near_bitmap_v5_receivers_min_fields { + id: bigint + receiver: String +} + +""" +Ordering options when selecting data from "darunrs_near_bitmap_v5.receivers". +""" +input darunrs_near_bitmap_v5_receivers_order_by { + actions_index_aggregate: darunrs_near_bitmap_v5_actions_index_aggregate_order_by + id: order_by + receiver: order_by +} + +""" +select columns of table "darunrs_near_bitmap_v5.receivers" +""" +enum darunrs_near_bitmap_v5_receivers_select_column { + """column name""" + id + + """column name""" + receiver +} + +"""aggregate stddev on columns""" +type darunrs_near_bitmap_v5_receivers_stddev_fields { + id: Float +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_bitmap_v5_receivers_stddev_pop_fields { + id: Float +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_bitmap_v5_receivers_stddev_samp_fields { + id: Float +} + +""" +Streaming cursor of the table "darunrs_near_bitmap_v5_receivers" +""" +input darunrs_near_bitmap_v5_receivers_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_bitmap_v5_receivers_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_bitmap_v5_receivers_stream_cursor_value_input { + id: bigint + receiver: String +} + +"""aggregate sum on columns""" +type darunrs_near_bitmap_v5_receivers_sum_fields { + id: bigint +} + +"""aggregate var_pop on columns""" +type darunrs_near_bitmap_v5_receivers_var_pop_fields { + id: Float +} + +"""aggregate var_samp on columns""" +type darunrs_near_bitmap_v5_receivers_var_samp_fields { + id: Float +} + +"""aggregate variance on columns""" +type darunrs_near_bitmap_v5_receivers_variance_fields { + id: Float +} + +""" +columns and relationships of "darunrs_near_bitmap_v5.sys_logs" +""" +type darunrs_near_bitmap_v5_sys_logs { + block_height: numeric + date: date! + id: bigint! + level: String! + message: String! + timestamp: timestamp! + type: String! +} + +""" +aggregated selection of "darunrs_near_bitmap_v5.sys_logs" +""" +type darunrs_near_bitmap_v5_sys_logs_aggregate { + aggregate: darunrs_near_bitmap_v5_sys_logs_aggregate_fields + nodes: [darunrs_near_bitmap_v5_sys_logs!]! +} + +""" +aggregate fields of "darunrs_near_bitmap_v5.sys_logs" +""" +type darunrs_near_bitmap_v5_sys_logs_aggregate_fields { + avg: darunrs_near_bitmap_v5_sys_logs_avg_fields + count(columns: [darunrs_near_bitmap_v5_sys_logs_select_column!], distinct: Boolean): Int! + max: darunrs_near_bitmap_v5_sys_logs_max_fields + min: darunrs_near_bitmap_v5_sys_logs_min_fields + stddev: darunrs_near_bitmap_v5_sys_logs_stddev_fields + stddev_pop: darunrs_near_bitmap_v5_sys_logs_stddev_pop_fields + stddev_samp: darunrs_near_bitmap_v5_sys_logs_stddev_samp_fields + sum: darunrs_near_bitmap_v5_sys_logs_sum_fields + var_pop: darunrs_near_bitmap_v5_sys_logs_var_pop_fields + var_samp: darunrs_near_bitmap_v5_sys_logs_var_samp_fields + variance: darunrs_near_bitmap_v5_sys_logs_variance_fields +} + +"""aggregate avg on columns""" +type darunrs_near_bitmap_v5_sys_logs_avg_fields { + block_height: Float + id: Float +} + +""" +Boolean expression to filter rows from the table "darunrs_near_bitmap_v5.sys_logs". All fields are combined with a logical 'AND'. +""" +input darunrs_near_bitmap_v5_sys_logs_bool_exp { + _and: [darunrs_near_bitmap_v5_sys_logs_bool_exp!] + _not: darunrs_near_bitmap_v5_sys_logs_bool_exp + _or: [darunrs_near_bitmap_v5_sys_logs_bool_exp!] + block_height: numeric_comparison_exp + date: date_comparison_exp + id: bigint_comparison_exp + level: String_comparison_exp + message: String_comparison_exp + timestamp: timestamp_comparison_exp + type: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_bitmap_v5_sys_logs_max_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate min on columns""" +type darunrs_near_bitmap_v5_sys_logs_min_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +""" +Ordering options when selecting data from "darunrs_near_bitmap_v5.sys_logs". +""" +input darunrs_near_bitmap_v5_sys_logs_order_by { + block_height: order_by + date: order_by + id: order_by + level: order_by + message: order_by + timestamp: order_by + type: order_by +} + +""" +select columns of table "darunrs_near_bitmap_v5.sys_logs" +""" +enum darunrs_near_bitmap_v5_sys_logs_select_column { + """column name""" + block_height + + """column name""" + date + + """column name""" + id + + """column name""" + level + + """column name""" + message + + """column name""" + timestamp + + """column name""" + type +} + +"""aggregate stddev on columns""" +type darunrs_near_bitmap_v5_sys_logs_stddev_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_bitmap_v5_sys_logs_stddev_pop_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_bitmap_v5_sys_logs_stddev_samp_fields { + block_height: Float + id: Float +} + +""" +Streaming cursor of the table "darunrs_near_bitmap_v5_sys_logs" +""" +input darunrs_near_bitmap_v5_sys_logs_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_bitmap_v5_sys_logs_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_bitmap_v5_sys_logs_stream_cursor_value_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate sum on columns""" +type darunrs_near_bitmap_v5_sys_logs_sum_fields { + block_height: numeric + id: bigint +} + +"""aggregate var_pop on columns""" +type darunrs_near_bitmap_v5_sys_logs_var_pop_fields { + block_height: Float + id: Float +} + +"""aggregate var_samp on columns""" +type darunrs_near_bitmap_v5_sys_logs_var_samp_fields { + block_height: Float + id: Float +} + +"""aggregate variance on columns""" +type darunrs_near_bitmap_v5_sys_logs_variance_fields { + block_height: Float + id: Float +} + +""" +columns and relationships of "darunrs_near_bitmap_v5.sys_metadata" +""" +type darunrs_near_bitmap_v5_sys_metadata { + attribute: String! + value: String! +} + +""" +aggregated selection of "darunrs_near_bitmap_v5.sys_metadata" +""" +type darunrs_near_bitmap_v5_sys_metadata_aggregate { + aggregate: darunrs_near_bitmap_v5_sys_metadata_aggregate_fields + nodes: [darunrs_near_bitmap_v5_sys_metadata!]! +} + +""" +aggregate fields of "darunrs_near_bitmap_v5.sys_metadata" +""" +type darunrs_near_bitmap_v5_sys_metadata_aggregate_fields { + count(columns: [darunrs_near_bitmap_v5_sys_metadata_select_column!], distinct: Boolean): Int! + max: darunrs_near_bitmap_v5_sys_metadata_max_fields + min: darunrs_near_bitmap_v5_sys_metadata_min_fields +} + +""" +Boolean expression to filter rows from the table "darunrs_near_bitmap_v5.sys_metadata". All fields are combined with a logical 'AND'. +""" +input darunrs_near_bitmap_v5_sys_metadata_bool_exp { + _and: [darunrs_near_bitmap_v5_sys_metadata_bool_exp!] + _not: darunrs_near_bitmap_v5_sys_metadata_bool_exp + _or: [darunrs_near_bitmap_v5_sys_metadata_bool_exp!] + attribute: String_comparison_exp + value: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_bitmap_v5_sys_metadata_max_fields { + attribute: String + value: String +} + +"""aggregate min on columns""" +type darunrs_near_bitmap_v5_sys_metadata_min_fields { + attribute: String + value: String +} + +""" +Ordering options when selecting data from "darunrs_near_bitmap_v5.sys_metadata". +""" +input darunrs_near_bitmap_v5_sys_metadata_order_by { + attribute: order_by + value: order_by +} + +""" +select columns of table "darunrs_near_bitmap_v5.sys_metadata" +""" +enum darunrs_near_bitmap_v5_sys_metadata_select_column { + """column name""" + attribute + + """column name""" + value +} + +""" +Streaming cursor of the table "darunrs_near_bitmap_v5_sys_metadata" +""" +input darunrs_near_bitmap_v5_sys_metadata_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_bitmap_v5_sys_metadata_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_bitmap_v5_sys_metadata_stream_cursor_value_input { + attribute: String + value: String +} + +""" +columns and relationships of "darunrs_near_social_feed_test.comments" +""" +type darunrs_near_social_feed_test_comments { + account_id: String! + block_height: numeric! + block_timestamp: numeric! + content: String! + id: Int! + + """An object relationship""" + post: darunrs_near_social_feed_test_posts! + post_id: Int! + receipt_id: String! +} + +""" +aggregated selection of "darunrs_near_social_feed_test.comments" +""" +type darunrs_near_social_feed_test_comments_aggregate { + aggregate: darunrs_near_social_feed_test_comments_aggregate_fields + nodes: [darunrs_near_social_feed_test_comments!]! +} + +input darunrs_near_social_feed_test_comments_aggregate_bool_exp { + count: darunrs_near_social_feed_test_comments_aggregate_bool_exp_count +} + +input darunrs_near_social_feed_test_comments_aggregate_bool_exp_count { + arguments: [darunrs_near_social_feed_test_comments_select_column!] + distinct: Boolean + filter: darunrs_near_social_feed_test_comments_bool_exp + predicate: Int_comparison_exp! +} + +""" +aggregate fields of "darunrs_near_social_feed_test.comments" +""" +type darunrs_near_social_feed_test_comments_aggregate_fields { + avg: darunrs_near_social_feed_test_comments_avg_fields + count(columns: [darunrs_near_social_feed_test_comments_select_column!], distinct: Boolean): Int! + max: darunrs_near_social_feed_test_comments_max_fields + min: darunrs_near_social_feed_test_comments_min_fields + stddev: darunrs_near_social_feed_test_comments_stddev_fields + stddev_pop: darunrs_near_social_feed_test_comments_stddev_pop_fields + stddev_samp: darunrs_near_social_feed_test_comments_stddev_samp_fields + sum: darunrs_near_social_feed_test_comments_sum_fields + var_pop: darunrs_near_social_feed_test_comments_var_pop_fields + var_samp: darunrs_near_social_feed_test_comments_var_samp_fields + variance: darunrs_near_social_feed_test_comments_variance_fields +} + +""" +order by aggregate values of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_aggregate_order_by { + avg: darunrs_near_social_feed_test_comments_avg_order_by + count: order_by + max: darunrs_near_social_feed_test_comments_max_order_by + min: darunrs_near_social_feed_test_comments_min_order_by + stddev: darunrs_near_social_feed_test_comments_stddev_order_by + stddev_pop: darunrs_near_social_feed_test_comments_stddev_pop_order_by + stddev_samp: darunrs_near_social_feed_test_comments_stddev_samp_order_by + sum: darunrs_near_social_feed_test_comments_sum_order_by + var_pop: darunrs_near_social_feed_test_comments_var_pop_order_by + var_samp: darunrs_near_social_feed_test_comments_var_samp_order_by + variance: darunrs_near_social_feed_test_comments_variance_order_by +} + +"""aggregate avg on columns""" +type darunrs_near_social_feed_test_comments_avg_fields { + block_height: Float + block_timestamp: Float + id: Float + post_id: Float +} + +""" +order by avg() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_avg_order_by { + block_height: order_by + block_timestamp: order_by + id: order_by + post_id: order_by +} + +""" +Boolean expression to filter rows from the table "darunrs_near_social_feed_test.comments". All fields are combined with a logical 'AND'. +""" +input darunrs_near_social_feed_test_comments_bool_exp { + _and: [darunrs_near_social_feed_test_comments_bool_exp!] + _not: darunrs_near_social_feed_test_comments_bool_exp + _or: [darunrs_near_social_feed_test_comments_bool_exp!] + account_id: String_comparison_exp + block_height: numeric_comparison_exp + block_timestamp: numeric_comparison_exp + content: String_comparison_exp + id: Int_comparison_exp + post: darunrs_near_social_feed_test_posts_bool_exp + post_id: Int_comparison_exp + receipt_id: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_social_feed_test_comments_max_fields { + account_id: String + block_height: numeric + block_timestamp: numeric + content: String + id: Int + post_id: Int + receipt_id: String +} + +""" +order by max() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_max_order_by { + account_id: order_by + block_height: order_by + block_timestamp: order_by + content: order_by + id: order_by + post_id: order_by + receipt_id: order_by +} + +"""aggregate min on columns""" +type darunrs_near_social_feed_test_comments_min_fields { + account_id: String + block_height: numeric + block_timestamp: numeric + content: String + id: Int + post_id: Int + receipt_id: String +} + +""" +order by min() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_min_order_by { + account_id: order_by + block_height: order_by + block_timestamp: order_by + content: order_by + id: order_by + post_id: order_by + receipt_id: order_by +} + +""" +Ordering options when selecting data from "darunrs_near_social_feed_test.comments". +""" +input darunrs_near_social_feed_test_comments_order_by { + account_id: order_by + block_height: order_by + block_timestamp: order_by + content: order_by + id: order_by + post: darunrs_near_social_feed_test_posts_order_by + post_id: order_by + receipt_id: order_by +} + +""" +select columns of table "darunrs_near_social_feed_test.comments" +""" +enum darunrs_near_social_feed_test_comments_select_column { + """column name""" + account_id + + """column name""" + block_height + + """column name""" + block_timestamp + + """column name""" + content + + """column name""" + id + + """column name""" + post_id + + """column name""" + receipt_id +} + +"""aggregate stddev on columns""" +type darunrs_near_social_feed_test_comments_stddev_fields { + block_height: Float + block_timestamp: Float + id: Float + post_id: Float +} + +""" +order by stddev() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_stddev_order_by { + block_height: order_by + block_timestamp: order_by + id: order_by + post_id: order_by +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_social_feed_test_comments_stddev_pop_fields { + block_height: Float + block_timestamp: Float + id: Float + post_id: Float +} + +""" +order by stddev_pop() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_stddev_pop_order_by { + block_height: order_by + block_timestamp: order_by + id: order_by + post_id: order_by +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_social_feed_test_comments_stddev_samp_fields { + block_height: Float + block_timestamp: Float + id: Float + post_id: Float +} + +""" +order by stddev_samp() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_stddev_samp_order_by { + block_height: order_by + block_timestamp: order_by + id: order_by + post_id: order_by +} + +""" +Streaming cursor of the table "darunrs_near_social_feed_test_comments" +""" +input darunrs_near_social_feed_test_comments_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_social_feed_test_comments_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_social_feed_test_comments_stream_cursor_value_input { + account_id: String + block_height: numeric + block_timestamp: numeric + content: String + id: Int + post_id: Int + receipt_id: String +} + +"""aggregate sum on columns""" +type darunrs_near_social_feed_test_comments_sum_fields { + block_height: numeric + block_timestamp: numeric + id: Int + post_id: Int +} + +""" +order by sum() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_sum_order_by { + block_height: order_by + block_timestamp: order_by + id: order_by + post_id: order_by +} + +"""aggregate var_pop on columns""" +type darunrs_near_social_feed_test_comments_var_pop_fields { + block_height: Float + block_timestamp: Float + id: Float + post_id: Float +} + +""" +order by var_pop() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_var_pop_order_by { + block_height: order_by + block_timestamp: order_by + id: order_by + post_id: order_by +} + +"""aggregate var_samp on columns""" +type darunrs_near_social_feed_test_comments_var_samp_fields { + block_height: Float + block_timestamp: Float + id: Float + post_id: Float +} + +""" +order by var_samp() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_var_samp_order_by { + block_height: order_by + block_timestamp: order_by + id: order_by + post_id: order_by +} + +"""aggregate variance on columns""" +type darunrs_near_social_feed_test_comments_variance_fields { + block_height: Float + block_timestamp: Float + id: Float + post_id: Float +} + +""" +order by variance() on columns of table "darunrs_near_social_feed_test.comments" +""" +input darunrs_near_social_feed_test_comments_variance_order_by { + block_height: order_by + block_timestamp: order_by + id: order_by + post_id: order_by +} + +""" +columns and relationships of "darunrs_near_social_feed_test.post_likes" +""" +type darunrs_near_social_feed_test_post_likes { + account_id: String! + block_height: numeric + block_timestamp: numeric! + + """An object relationship""" + post: darunrs_near_social_feed_test_posts! + post_id: Int! + receipt_id: String! +} + +""" +aggregated selection of "darunrs_near_social_feed_test.post_likes" +""" +type darunrs_near_social_feed_test_post_likes_aggregate { + aggregate: darunrs_near_social_feed_test_post_likes_aggregate_fields + nodes: [darunrs_near_social_feed_test_post_likes!]! +} + +input darunrs_near_social_feed_test_post_likes_aggregate_bool_exp { + count: darunrs_near_social_feed_test_post_likes_aggregate_bool_exp_count +} + +input darunrs_near_social_feed_test_post_likes_aggregate_bool_exp_count { + arguments: [darunrs_near_social_feed_test_post_likes_select_column!] + distinct: Boolean + filter: darunrs_near_social_feed_test_post_likes_bool_exp + predicate: Int_comparison_exp! +} + +""" +aggregate fields of "darunrs_near_social_feed_test.post_likes" +""" +type darunrs_near_social_feed_test_post_likes_aggregate_fields { + avg: darunrs_near_social_feed_test_post_likes_avg_fields + count(columns: [darunrs_near_social_feed_test_post_likes_select_column!], distinct: Boolean): Int! + max: darunrs_near_social_feed_test_post_likes_max_fields + min: darunrs_near_social_feed_test_post_likes_min_fields + stddev: darunrs_near_social_feed_test_post_likes_stddev_fields + stddev_pop: darunrs_near_social_feed_test_post_likes_stddev_pop_fields + stddev_samp: darunrs_near_social_feed_test_post_likes_stddev_samp_fields + sum: darunrs_near_social_feed_test_post_likes_sum_fields + var_pop: darunrs_near_social_feed_test_post_likes_var_pop_fields + var_samp: darunrs_near_social_feed_test_post_likes_var_samp_fields + variance: darunrs_near_social_feed_test_post_likes_variance_fields +} + +""" +order by aggregate values of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_aggregate_order_by { + avg: darunrs_near_social_feed_test_post_likes_avg_order_by + count: order_by + max: darunrs_near_social_feed_test_post_likes_max_order_by + min: darunrs_near_social_feed_test_post_likes_min_order_by + stddev: darunrs_near_social_feed_test_post_likes_stddev_order_by + stddev_pop: darunrs_near_social_feed_test_post_likes_stddev_pop_order_by + stddev_samp: darunrs_near_social_feed_test_post_likes_stddev_samp_order_by + sum: darunrs_near_social_feed_test_post_likes_sum_order_by + var_pop: darunrs_near_social_feed_test_post_likes_var_pop_order_by + var_samp: darunrs_near_social_feed_test_post_likes_var_samp_order_by + variance: darunrs_near_social_feed_test_post_likes_variance_order_by +} + +"""aggregate avg on columns""" +type darunrs_near_social_feed_test_post_likes_avg_fields { + block_height: Float + block_timestamp: Float + post_id: Float +} + +""" +order by avg() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_avg_order_by { + block_height: order_by + block_timestamp: order_by + post_id: order_by +} + +""" +Boolean expression to filter rows from the table "darunrs_near_social_feed_test.post_likes". All fields are combined with a logical 'AND'. +""" +input darunrs_near_social_feed_test_post_likes_bool_exp { + _and: [darunrs_near_social_feed_test_post_likes_bool_exp!] + _not: darunrs_near_social_feed_test_post_likes_bool_exp + _or: [darunrs_near_social_feed_test_post_likes_bool_exp!] + account_id: String_comparison_exp + block_height: numeric_comparison_exp + block_timestamp: numeric_comparison_exp + post: darunrs_near_social_feed_test_posts_bool_exp + post_id: Int_comparison_exp + receipt_id: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_social_feed_test_post_likes_max_fields { + account_id: String + block_height: numeric + block_timestamp: numeric + post_id: Int + receipt_id: String +} + +""" +order by max() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_max_order_by { + account_id: order_by + block_height: order_by + block_timestamp: order_by + post_id: order_by + receipt_id: order_by +} + +"""aggregate min on columns""" +type darunrs_near_social_feed_test_post_likes_min_fields { + account_id: String + block_height: numeric + block_timestamp: numeric + post_id: Int + receipt_id: String +} + +""" +order by min() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_min_order_by { + account_id: order_by + block_height: order_by + block_timestamp: order_by + post_id: order_by + receipt_id: order_by +} + +""" +Ordering options when selecting data from "darunrs_near_social_feed_test.post_likes". +""" +input darunrs_near_social_feed_test_post_likes_order_by { + account_id: order_by + block_height: order_by + block_timestamp: order_by + post: darunrs_near_social_feed_test_posts_order_by + post_id: order_by + receipt_id: order_by +} + +""" +select columns of table "darunrs_near_social_feed_test.post_likes" +""" +enum darunrs_near_social_feed_test_post_likes_select_column { + """column name""" + account_id + + """column name""" + block_height + + """column name""" + block_timestamp + + """column name""" + post_id + + """column name""" + receipt_id +} + +"""aggregate stddev on columns""" +type darunrs_near_social_feed_test_post_likes_stddev_fields { + block_height: Float + block_timestamp: Float + post_id: Float +} + +""" +order by stddev() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_stddev_order_by { + block_height: order_by + block_timestamp: order_by + post_id: order_by +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_social_feed_test_post_likes_stddev_pop_fields { + block_height: Float + block_timestamp: Float + post_id: Float +} + +""" +order by stddev_pop() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_stddev_pop_order_by { + block_height: order_by + block_timestamp: order_by + post_id: order_by +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_social_feed_test_post_likes_stddev_samp_fields { + block_height: Float + block_timestamp: Float + post_id: Float +} + +""" +order by stddev_samp() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_stddev_samp_order_by { + block_height: order_by + block_timestamp: order_by + post_id: order_by +} + +""" +Streaming cursor of the table "darunrs_near_social_feed_test_post_likes" +""" +input darunrs_near_social_feed_test_post_likes_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_social_feed_test_post_likes_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_social_feed_test_post_likes_stream_cursor_value_input { + account_id: String + block_height: numeric + block_timestamp: numeric + post_id: Int + receipt_id: String +} + +"""aggregate sum on columns""" +type darunrs_near_social_feed_test_post_likes_sum_fields { + block_height: numeric + block_timestamp: numeric + post_id: Int +} + +""" +order by sum() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_sum_order_by { + block_height: order_by + block_timestamp: order_by + post_id: order_by +} + +"""aggregate var_pop on columns""" +type darunrs_near_social_feed_test_post_likes_var_pop_fields { + block_height: Float + block_timestamp: Float + post_id: Float +} + +""" +order by var_pop() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_var_pop_order_by { + block_height: order_by + block_timestamp: order_by + post_id: order_by +} + +"""aggregate var_samp on columns""" +type darunrs_near_social_feed_test_post_likes_var_samp_fields { + block_height: Float + block_timestamp: Float + post_id: Float +} + +""" +order by var_samp() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_var_samp_order_by { + block_height: order_by + block_timestamp: order_by + post_id: order_by +} + +"""aggregate variance on columns""" +type darunrs_near_social_feed_test_post_likes_variance_fields { + block_height: Float + block_timestamp: Float + post_id: Float +} + +""" +order by variance() on columns of table "darunrs_near_social_feed_test.post_likes" +""" +input darunrs_near_social_feed_test_post_likes_variance_order_by { + block_height: order_by + block_timestamp: order_by + post_id: order_by +} + +""" +columns and relationships of "darunrs_near_social_feed_test.posts" +""" +type darunrs_near_social_feed_test_posts { + account_id: String! + accounts_liked( + """JSON select path""" + path: String + ): jsonb! + block_height: numeric! + block_timestamp: numeric! + + """An array relationship""" + comments( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_comments_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_comments_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_comments_bool_exp + ): [darunrs_near_social_feed_test_comments!]! + + """An aggregate relationship""" + comments_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_comments_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_comments_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_comments_bool_exp + ): darunrs_near_social_feed_test_comments_aggregate! + content: String! + id: Int! + last_comment_timestamp: numeric + + """An array relationship""" + post_likes( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_post_likes_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_post_likes_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_post_likes_bool_exp + ): [darunrs_near_social_feed_test_post_likes!]! + + """An aggregate relationship""" + post_likes_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_post_likes_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_post_likes_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_post_likes_bool_exp + ): darunrs_near_social_feed_test_post_likes_aggregate! + receipt_id: String! +} + +""" +aggregated selection of "darunrs_near_social_feed_test.posts" +""" +type darunrs_near_social_feed_test_posts_aggregate { + aggregate: darunrs_near_social_feed_test_posts_aggregate_fields + nodes: [darunrs_near_social_feed_test_posts!]! +} + +""" +aggregate fields of "darunrs_near_social_feed_test.posts" +""" +type darunrs_near_social_feed_test_posts_aggregate_fields { + avg: darunrs_near_social_feed_test_posts_avg_fields + count(columns: [darunrs_near_social_feed_test_posts_select_column!], distinct: Boolean): Int! + max: darunrs_near_social_feed_test_posts_max_fields + min: darunrs_near_social_feed_test_posts_min_fields + stddev: darunrs_near_social_feed_test_posts_stddev_fields + stddev_pop: darunrs_near_social_feed_test_posts_stddev_pop_fields + stddev_samp: darunrs_near_social_feed_test_posts_stddev_samp_fields + sum: darunrs_near_social_feed_test_posts_sum_fields + var_pop: darunrs_near_social_feed_test_posts_var_pop_fields + var_samp: darunrs_near_social_feed_test_posts_var_samp_fields + variance: darunrs_near_social_feed_test_posts_variance_fields +} + +"""aggregate avg on columns""" +type darunrs_near_social_feed_test_posts_avg_fields { + block_height: Float + block_timestamp: Float + id: Float + last_comment_timestamp: Float +} + +""" +Boolean expression to filter rows from the table "darunrs_near_social_feed_test.posts". All fields are combined with a logical 'AND'. +""" +input darunrs_near_social_feed_test_posts_bool_exp { + _and: [darunrs_near_social_feed_test_posts_bool_exp!] + _not: darunrs_near_social_feed_test_posts_bool_exp + _or: [darunrs_near_social_feed_test_posts_bool_exp!] + account_id: String_comparison_exp + accounts_liked: jsonb_comparison_exp + block_height: numeric_comparison_exp + block_timestamp: numeric_comparison_exp + comments: darunrs_near_social_feed_test_comments_bool_exp + comments_aggregate: darunrs_near_social_feed_test_comments_aggregate_bool_exp + content: String_comparison_exp + id: Int_comparison_exp + last_comment_timestamp: numeric_comparison_exp + post_likes: darunrs_near_social_feed_test_post_likes_bool_exp + post_likes_aggregate: darunrs_near_social_feed_test_post_likes_aggregate_bool_exp + receipt_id: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_social_feed_test_posts_max_fields { + account_id: String + block_height: numeric + block_timestamp: numeric + content: String + id: Int + last_comment_timestamp: numeric + receipt_id: String +} + +"""aggregate min on columns""" +type darunrs_near_social_feed_test_posts_min_fields { + account_id: String + block_height: numeric + block_timestamp: numeric + content: String + id: Int + last_comment_timestamp: numeric + receipt_id: String +} + +""" +Ordering options when selecting data from "darunrs_near_social_feed_test.posts". +""" +input darunrs_near_social_feed_test_posts_order_by { + account_id: order_by + accounts_liked: order_by + block_height: order_by + block_timestamp: order_by + comments_aggregate: darunrs_near_social_feed_test_comments_aggregate_order_by + content: order_by + id: order_by + last_comment_timestamp: order_by + post_likes_aggregate: darunrs_near_social_feed_test_post_likes_aggregate_order_by + receipt_id: order_by +} + +""" +select columns of table "darunrs_near_social_feed_test.posts" +""" +enum darunrs_near_social_feed_test_posts_select_column { + """column name""" + account_id + + """column name""" + accounts_liked + + """column name""" + block_height + + """column name""" + block_timestamp + + """column name""" + content + + """column name""" + id + + """column name""" + last_comment_timestamp + + """column name""" + receipt_id +} + +"""aggregate stddev on columns""" +type darunrs_near_social_feed_test_posts_stddev_fields { + block_height: Float + block_timestamp: Float + id: Float + last_comment_timestamp: Float +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_social_feed_test_posts_stddev_pop_fields { + block_height: Float + block_timestamp: Float + id: Float + last_comment_timestamp: Float +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_social_feed_test_posts_stddev_samp_fields { + block_height: Float + block_timestamp: Float + id: Float + last_comment_timestamp: Float +} + +""" +Streaming cursor of the table "darunrs_near_social_feed_test_posts" +""" +input darunrs_near_social_feed_test_posts_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_social_feed_test_posts_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_social_feed_test_posts_stream_cursor_value_input { + account_id: String + accounts_liked: jsonb + block_height: numeric + block_timestamp: numeric + content: String + id: Int + last_comment_timestamp: numeric + receipt_id: String +} + +"""aggregate sum on columns""" +type darunrs_near_social_feed_test_posts_sum_fields { + block_height: numeric + block_timestamp: numeric + id: Int + last_comment_timestamp: numeric +} + +"""aggregate var_pop on columns""" +type darunrs_near_social_feed_test_posts_var_pop_fields { + block_height: Float + block_timestamp: Float + id: Float + last_comment_timestamp: Float +} + +"""aggregate var_samp on columns""" +type darunrs_near_social_feed_test_posts_var_samp_fields { + block_height: Float + block_timestamp: Float + id: Float + last_comment_timestamp: Float +} + +"""aggregate variance on columns""" +type darunrs_near_social_feed_test_posts_variance_fields { + block_height: Float + block_timestamp: Float + id: Float + last_comment_timestamp: Float +} + +""" +columns and relationships of "darunrs_near_social_feed_test.sys_logs" +""" +type darunrs_near_social_feed_test_sys_logs { + block_height: numeric + date: date! + id: bigint! + level: String! + message: String! + timestamp: timestamp! + type: String! +} + +""" +aggregated selection of "darunrs_near_social_feed_test.sys_logs" +""" +type darunrs_near_social_feed_test_sys_logs_aggregate { + aggregate: darunrs_near_social_feed_test_sys_logs_aggregate_fields + nodes: [darunrs_near_social_feed_test_sys_logs!]! +} + +""" +aggregate fields of "darunrs_near_social_feed_test.sys_logs" +""" +type darunrs_near_social_feed_test_sys_logs_aggregate_fields { + avg: darunrs_near_social_feed_test_sys_logs_avg_fields + count(columns: [darunrs_near_social_feed_test_sys_logs_select_column!], distinct: Boolean): Int! + max: darunrs_near_social_feed_test_sys_logs_max_fields + min: darunrs_near_social_feed_test_sys_logs_min_fields + stddev: darunrs_near_social_feed_test_sys_logs_stddev_fields + stddev_pop: darunrs_near_social_feed_test_sys_logs_stddev_pop_fields + stddev_samp: darunrs_near_social_feed_test_sys_logs_stddev_samp_fields + sum: darunrs_near_social_feed_test_sys_logs_sum_fields + var_pop: darunrs_near_social_feed_test_sys_logs_var_pop_fields + var_samp: darunrs_near_social_feed_test_sys_logs_var_samp_fields + variance: darunrs_near_social_feed_test_sys_logs_variance_fields +} + +"""aggregate avg on columns""" +type darunrs_near_social_feed_test_sys_logs_avg_fields { + block_height: Float + id: Float +} + +""" +Boolean expression to filter rows from the table "darunrs_near_social_feed_test.sys_logs". All fields are combined with a logical 'AND'. +""" +input darunrs_near_social_feed_test_sys_logs_bool_exp { + _and: [darunrs_near_social_feed_test_sys_logs_bool_exp!] + _not: darunrs_near_social_feed_test_sys_logs_bool_exp + _or: [darunrs_near_social_feed_test_sys_logs_bool_exp!] + block_height: numeric_comparison_exp + date: date_comparison_exp + id: bigint_comparison_exp + level: String_comparison_exp + message: String_comparison_exp + timestamp: timestamp_comparison_exp + type: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_social_feed_test_sys_logs_max_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate min on columns""" +type darunrs_near_social_feed_test_sys_logs_min_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +""" +Ordering options when selecting data from "darunrs_near_social_feed_test.sys_logs". +""" +input darunrs_near_social_feed_test_sys_logs_order_by { + block_height: order_by + date: order_by + id: order_by + level: order_by + message: order_by + timestamp: order_by + type: order_by +} + +""" +select columns of table "darunrs_near_social_feed_test.sys_logs" +""" +enum darunrs_near_social_feed_test_sys_logs_select_column { + """column name""" + block_height + + """column name""" + date + + """column name""" + id + + """column name""" + level + + """column name""" + message + + """column name""" + timestamp + + """column name""" + type +} + +"""aggregate stddev on columns""" +type darunrs_near_social_feed_test_sys_logs_stddev_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_social_feed_test_sys_logs_stddev_pop_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_social_feed_test_sys_logs_stddev_samp_fields { + block_height: Float + id: Float +} + +""" +Streaming cursor of the table "darunrs_near_social_feed_test_sys_logs" +""" +input darunrs_near_social_feed_test_sys_logs_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_social_feed_test_sys_logs_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_social_feed_test_sys_logs_stream_cursor_value_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate sum on columns""" +type darunrs_near_social_feed_test_sys_logs_sum_fields { + block_height: numeric + id: bigint +} + +"""aggregate var_pop on columns""" +type darunrs_near_social_feed_test_sys_logs_var_pop_fields { + block_height: Float + id: Float +} + +"""aggregate var_samp on columns""" +type darunrs_near_social_feed_test_sys_logs_var_samp_fields { + block_height: Float + id: Float +} + +"""aggregate variance on columns""" +type darunrs_near_social_feed_test_sys_logs_variance_fields { + block_height: Float + id: Float +} + +""" +columns and relationships of "darunrs_near_social_feed_test.sys_metadata" +""" +type darunrs_near_social_feed_test_sys_metadata { + attribute: String! + value: String! +} + +""" +aggregated selection of "darunrs_near_social_feed_test.sys_metadata" +""" +type darunrs_near_social_feed_test_sys_metadata_aggregate { + aggregate: darunrs_near_social_feed_test_sys_metadata_aggregate_fields + nodes: [darunrs_near_social_feed_test_sys_metadata!]! +} + +""" +aggregate fields of "darunrs_near_social_feed_test.sys_metadata" +""" +type darunrs_near_social_feed_test_sys_metadata_aggregate_fields { + count(columns: [darunrs_near_social_feed_test_sys_metadata_select_column!], distinct: Boolean): Int! + max: darunrs_near_social_feed_test_sys_metadata_max_fields + min: darunrs_near_social_feed_test_sys_metadata_min_fields +} + +""" +Boolean expression to filter rows from the table "darunrs_near_social_feed_test.sys_metadata". All fields are combined with a logical 'AND'. +""" +input darunrs_near_social_feed_test_sys_metadata_bool_exp { + _and: [darunrs_near_social_feed_test_sys_metadata_bool_exp!] + _not: darunrs_near_social_feed_test_sys_metadata_bool_exp + _or: [darunrs_near_social_feed_test_sys_metadata_bool_exp!] + attribute: String_comparison_exp + value: String_comparison_exp +} + +"""aggregate max on columns""" +type darunrs_near_social_feed_test_sys_metadata_max_fields { + attribute: String + value: String +} + +"""aggregate min on columns""" +type darunrs_near_social_feed_test_sys_metadata_min_fields { + attribute: String + value: String +} + +""" +Ordering options when selecting data from "darunrs_near_social_feed_test.sys_metadata". +""" +input darunrs_near_social_feed_test_sys_metadata_order_by { + attribute: order_by + value: order_by +} + +""" +select columns of table "darunrs_near_social_feed_test.sys_metadata" +""" +enum darunrs_near_social_feed_test_sys_metadata_select_column { + """column name""" + attribute + + """column name""" + value +} + +""" +Streaming cursor of the table "darunrs_near_social_feed_test_sys_metadata" +""" +input darunrs_near_social_feed_test_sys_metadata_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_social_feed_test_sys_metadata_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_social_feed_test_sys_metadata_stream_cursor_value_input { + attribute: String + value: String +} + +""" +columns and relationships of "darunrs_near_test_fork.indexer_storage" +""" +type darunrs_near_test_fork_indexer_storage { + function_name: String! + key_name: String! + value: String! +} + +""" +aggregated selection of "darunrs_near_test_fork.indexer_storage" +""" +type darunrs_near_test_fork_indexer_storage_aggregate { + aggregate: darunrs_near_test_fork_indexer_storage_aggregate_fields + nodes: [darunrs_near_test_fork_indexer_storage!]! +} + +""" +aggregate fields of "darunrs_near_test_fork.indexer_storage" +""" +type darunrs_near_test_fork_indexer_storage_aggregate_fields { + count(columns: [darunrs_near_test_fork_indexer_storage_select_column!], distinct: Boolean): Int! + max: darunrs_near_test_fork_indexer_storage_max_fields + min: darunrs_near_test_fork_indexer_storage_min_fields +} + +""" +Boolean expression to filter rows from the table "darunrs_near_test_fork.indexer_storage". All fields are combined with a logical 'AND'. +""" +input darunrs_near_test_fork_indexer_storage_bool_exp { + _and: [darunrs_near_test_fork_indexer_storage_bool_exp!] + _not: darunrs_near_test_fork_indexer_storage_bool_exp + _or: [darunrs_near_test_fork_indexer_storage_bool_exp!] + function_name: String_comparison_exp + key_name: String_comparison_exp + value: String_comparison_exp +} + +""" +unique or primary key constraints on table "darunrs_near_test_fork.indexer_storage" +""" +enum darunrs_near_test_fork_indexer_storage_constraint { + """ + unique or primary key constraint on columns "function_name", "key_name" + """ + indexer_storage_pkey +} + +""" +input type for inserting data into table "darunrs_near_test_fork.indexer_storage" +""" +input darunrs_near_test_fork_indexer_storage_insert_input { + function_name: String + key_name: String + value: String +} + +"""aggregate max on columns""" +type darunrs_near_test_fork_indexer_storage_max_fields { + function_name: String + key_name: String + value: String +} + +"""aggregate min on columns""" +type darunrs_near_test_fork_indexer_storage_min_fields { + function_name: String + key_name: String + value: String +} + +""" +response of any mutation on the table "darunrs_near_test_fork.indexer_storage" +""" +type darunrs_near_test_fork_indexer_storage_mutation_response { + """number of rows affected by the mutation""" + affected_rows: Int! + + """data from the rows affected by the mutation""" + returning: [darunrs_near_test_fork_indexer_storage!]! +} + +""" +on_conflict condition type for table "darunrs_near_test_fork.indexer_storage" +""" +input darunrs_near_test_fork_indexer_storage_on_conflict { + constraint: darunrs_near_test_fork_indexer_storage_constraint! + update_columns: [darunrs_near_test_fork_indexer_storage_update_column!]! = [] + where: darunrs_near_test_fork_indexer_storage_bool_exp +} + +""" +Ordering options when selecting data from "darunrs_near_test_fork.indexer_storage". +""" +input darunrs_near_test_fork_indexer_storage_order_by { + function_name: order_by + key_name: order_by + value: order_by +} + +""" +primary key columns input for table: darunrs_near_test_fork.indexer_storage +""" +input darunrs_near_test_fork_indexer_storage_pk_columns_input { + function_name: String! + key_name: String! +} + +""" +select columns of table "darunrs_near_test_fork.indexer_storage" +""" +enum darunrs_near_test_fork_indexer_storage_select_column { + """column name""" + function_name + + """column name""" + key_name + + """column name""" + value +} + +""" +input type for updating data in table "darunrs_near_test_fork.indexer_storage" +""" +input darunrs_near_test_fork_indexer_storage_set_input { + function_name: String + key_name: String + value: String +} + +""" +Streaming cursor of the table "darunrs_near_test_fork_indexer_storage" +""" +input darunrs_near_test_fork_indexer_storage_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_test_fork_indexer_storage_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_test_fork_indexer_storage_stream_cursor_value_input { + function_name: String + key_name: String + value: String +} + +""" +update columns of table "darunrs_near_test_fork.indexer_storage" +""" +enum darunrs_near_test_fork_indexer_storage_update_column { + """column name""" + function_name + + """column name""" + key_name + + """column name""" + value +} + +input darunrs_near_test_fork_indexer_storage_updates { + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_indexer_storage_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_test_fork_indexer_storage_bool_exp! +} + +""" +columns and relationships of "darunrs_near_test_fork.sys_logs" +""" +type darunrs_near_test_fork_sys_logs { + block_height: numeric + date: date! + id: bigint! + level: String! + message: String! + timestamp: timestamp! + type: String! +} + +""" +aggregated selection of "darunrs_near_test_fork.sys_logs" +""" +type darunrs_near_test_fork_sys_logs_aggregate { + aggregate: darunrs_near_test_fork_sys_logs_aggregate_fields + nodes: [darunrs_near_test_fork_sys_logs!]! +} + +""" +aggregate fields of "darunrs_near_test_fork.sys_logs" +""" +type darunrs_near_test_fork_sys_logs_aggregate_fields { + avg: darunrs_near_test_fork_sys_logs_avg_fields + count(columns: [darunrs_near_test_fork_sys_logs_select_column!], distinct: Boolean): Int! + max: darunrs_near_test_fork_sys_logs_max_fields + min: darunrs_near_test_fork_sys_logs_min_fields + stddev: darunrs_near_test_fork_sys_logs_stddev_fields + stddev_pop: darunrs_near_test_fork_sys_logs_stddev_pop_fields + stddev_samp: darunrs_near_test_fork_sys_logs_stddev_samp_fields + sum: darunrs_near_test_fork_sys_logs_sum_fields + var_pop: darunrs_near_test_fork_sys_logs_var_pop_fields + var_samp: darunrs_near_test_fork_sys_logs_var_samp_fields + variance: darunrs_near_test_fork_sys_logs_variance_fields +} + +"""aggregate avg on columns""" +type darunrs_near_test_fork_sys_logs_avg_fields { + block_height: Float + id: Float +} + +""" +Boolean expression to filter rows from the table "darunrs_near_test_fork.sys_logs". All fields are combined with a logical 'AND'. +""" +input darunrs_near_test_fork_sys_logs_bool_exp { + _and: [darunrs_near_test_fork_sys_logs_bool_exp!] + _not: darunrs_near_test_fork_sys_logs_bool_exp + _or: [darunrs_near_test_fork_sys_logs_bool_exp!] + block_height: numeric_comparison_exp + date: date_comparison_exp + id: bigint_comparison_exp + level: String_comparison_exp + message: String_comparison_exp + timestamp: timestamp_comparison_exp + type: String_comparison_exp +} + +""" +unique or primary key constraints on table "darunrs_near_test_fork.sys_logs" +""" +enum darunrs_near_test_fork_sys_logs_constraint { + """ + unique or primary key constraint on columns "id", "date" + """ + sys_logs_pkey +} + +""" +input type for incrementing numeric columns in table "darunrs_near_test_fork.sys_logs" +""" +input darunrs_near_test_fork_sys_logs_inc_input { + block_height: numeric + id: bigint +} + +""" +input type for inserting data into table "darunrs_near_test_fork.sys_logs" +""" +input darunrs_near_test_fork_sys_logs_insert_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate max on columns""" +type darunrs_near_test_fork_sys_logs_max_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate min on columns""" +type darunrs_near_test_fork_sys_logs_min_fields { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +""" +response of any mutation on the table "darunrs_near_test_fork.sys_logs" +""" +type darunrs_near_test_fork_sys_logs_mutation_response { + """number of rows affected by the mutation""" + affected_rows: Int! + + """data from the rows affected by the mutation""" + returning: [darunrs_near_test_fork_sys_logs!]! +} + +""" +on_conflict condition type for table "darunrs_near_test_fork.sys_logs" +""" +input darunrs_near_test_fork_sys_logs_on_conflict { + constraint: darunrs_near_test_fork_sys_logs_constraint! + update_columns: [darunrs_near_test_fork_sys_logs_update_column!]! = [] + where: darunrs_near_test_fork_sys_logs_bool_exp +} + +""" +Ordering options when selecting data from "darunrs_near_test_fork.sys_logs". +""" +input darunrs_near_test_fork_sys_logs_order_by { + block_height: order_by + date: order_by + id: order_by + level: order_by + message: order_by + timestamp: order_by + type: order_by +} + +"""primary key columns input for table: darunrs_near_test_fork.sys_logs""" +input darunrs_near_test_fork_sys_logs_pk_columns_input { + date: date! + id: bigint! +} + +""" +select columns of table "darunrs_near_test_fork.sys_logs" +""" +enum darunrs_near_test_fork_sys_logs_select_column { + """column name""" + block_height + + """column name""" + date + + """column name""" + id + + """column name""" + level + + """column name""" + message + + """column name""" + timestamp + + """column name""" + type +} + +""" +input type for updating data in table "darunrs_near_test_fork.sys_logs" +""" +input darunrs_near_test_fork_sys_logs_set_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate stddev on columns""" +type darunrs_near_test_fork_sys_logs_stddev_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_pop on columns""" +type darunrs_near_test_fork_sys_logs_stddev_pop_fields { + block_height: Float + id: Float +} + +"""aggregate stddev_samp on columns""" +type darunrs_near_test_fork_sys_logs_stddev_samp_fields { + block_height: Float + id: Float +} + +""" +Streaming cursor of the table "darunrs_near_test_fork_sys_logs" +""" +input darunrs_near_test_fork_sys_logs_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_test_fork_sys_logs_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_test_fork_sys_logs_stream_cursor_value_input { + block_height: numeric + date: date + id: bigint + level: String + message: String + timestamp: timestamp + type: String +} + +"""aggregate sum on columns""" +type darunrs_near_test_fork_sys_logs_sum_fields { + block_height: numeric + id: bigint +} + +""" +update columns of table "darunrs_near_test_fork.sys_logs" +""" +enum darunrs_near_test_fork_sys_logs_update_column { + """column name""" + block_height + + """column name""" + date + + """column name""" + id + + """column name""" + level + + """column name""" + message + + """column name""" + timestamp + + """column name""" + type +} + +input darunrs_near_test_fork_sys_logs_updates { + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_test_fork_sys_logs_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_sys_logs_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_test_fork_sys_logs_bool_exp! +} + +"""aggregate var_pop on columns""" +type darunrs_near_test_fork_sys_logs_var_pop_fields { + block_height: Float + id: Float +} + +"""aggregate var_samp on columns""" +type darunrs_near_test_fork_sys_logs_var_samp_fields { + block_height: Float + id: Float +} + +"""aggregate variance on columns""" +type darunrs_near_test_fork_sys_logs_variance_fields { + block_height: Float + id: Float +} + +""" +columns and relationships of "darunrs_near_test_fork.sys_metadata" +""" +type darunrs_near_test_fork_sys_metadata { + attribute: String! + value: String! +} + +""" +aggregated selection of "darunrs_near_test_fork.sys_metadata" +""" +type darunrs_near_test_fork_sys_metadata_aggregate { + aggregate: darunrs_near_test_fork_sys_metadata_aggregate_fields + nodes: [darunrs_near_test_fork_sys_metadata!]! +} + +""" +aggregate fields of "darunrs_near_test_fork.sys_metadata" +""" +type darunrs_near_test_fork_sys_metadata_aggregate_fields { + count(columns: [darunrs_near_test_fork_sys_metadata_select_column!], distinct: Boolean): Int! + max: darunrs_near_test_fork_sys_metadata_max_fields + min: darunrs_near_test_fork_sys_metadata_min_fields +} + +""" +Boolean expression to filter rows from the table "darunrs_near_test_fork.sys_metadata". All fields are combined with a logical 'AND'. +""" +input darunrs_near_test_fork_sys_metadata_bool_exp { + _and: [darunrs_near_test_fork_sys_metadata_bool_exp!] + _not: darunrs_near_test_fork_sys_metadata_bool_exp + _or: [darunrs_near_test_fork_sys_metadata_bool_exp!] + attribute: String_comparison_exp + value: String_comparison_exp +} + +""" +unique or primary key constraints on table "darunrs_near_test_fork.sys_metadata" +""" +enum darunrs_near_test_fork_sys_metadata_constraint { + """ + unique or primary key constraint on columns "attribute" + """ + sys_metadata_pkey +} + +""" +input type for inserting data into table "darunrs_near_test_fork.sys_metadata" +""" +input darunrs_near_test_fork_sys_metadata_insert_input { + attribute: String + value: String +} + +"""aggregate max on columns""" +type darunrs_near_test_fork_sys_metadata_max_fields { + attribute: String + value: String +} + +"""aggregate min on columns""" +type darunrs_near_test_fork_sys_metadata_min_fields { + attribute: String + value: String +} + +""" +response of any mutation on the table "darunrs_near_test_fork.sys_metadata" +""" +type darunrs_near_test_fork_sys_metadata_mutation_response { + """number of rows affected by the mutation""" + affected_rows: Int! + + """data from the rows affected by the mutation""" + returning: [darunrs_near_test_fork_sys_metadata!]! +} + +""" +on_conflict condition type for table "darunrs_near_test_fork.sys_metadata" +""" +input darunrs_near_test_fork_sys_metadata_on_conflict { + constraint: darunrs_near_test_fork_sys_metadata_constraint! + update_columns: [darunrs_near_test_fork_sys_metadata_update_column!]! = [] + where: darunrs_near_test_fork_sys_metadata_bool_exp +} + +""" +Ordering options when selecting data from "darunrs_near_test_fork.sys_metadata". +""" +input darunrs_near_test_fork_sys_metadata_order_by { + attribute: order_by + value: order_by +} + +""" +primary key columns input for table: darunrs_near_test_fork.sys_metadata +""" +input darunrs_near_test_fork_sys_metadata_pk_columns_input { + attribute: String! +} + +""" +select columns of table "darunrs_near_test_fork.sys_metadata" +""" +enum darunrs_near_test_fork_sys_metadata_select_column { + """column name""" + attribute + + """column name""" + value +} + +""" +input type for updating data in table "darunrs_near_test_fork.sys_metadata" +""" +input darunrs_near_test_fork_sys_metadata_set_input { + attribute: String + value: String +} + +""" +Streaming cursor of the table "darunrs_near_test_fork_sys_metadata" +""" +input darunrs_near_test_fork_sys_metadata_stream_cursor_input { + """Stream column input with initial value""" + initial_value: darunrs_near_test_fork_sys_metadata_stream_cursor_value_input! + + """cursor ordering""" + ordering: cursor_ordering +} + +"""Initial value of the column from where the streaming should start""" +input darunrs_near_test_fork_sys_metadata_stream_cursor_value_input { + attribute: String + value: String +} + +""" +update columns of table "darunrs_near_test_fork.sys_metadata" +""" +enum darunrs_near_test_fork_sys_metadata_update_column { + """column name""" + attribute + + """column name""" + value +} + +input darunrs_near_test_fork_sys_metadata_updates { + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_sys_metadata_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_test_fork_sys_metadata_bool_exp! +} + +scalar date + +""" +Boolean expression to compare columns of type "date". All fields are combined with logical 'AND'. +""" +input date_comparison_exp { + _eq: date + _gt: date + _gte: date + _in: [date!] + _is_null: Boolean + _lt: date + _lte: date + _neq: date + _nin: [date!] +} + +scalar jsonb + +input jsonb_cast_exp { + String: String_comparison_exp +} + +""" +Boolean expression to compare columns of type "jsonb". All fields are combined with logical 'AND'. +""" +input jsonb_comparison_exp { + _cast: jsonb_cast_exp + + """is the column contained in the given json value""" + _contained_in: jsonb + + """does the column contain the given json value at the top level""" + _contains: jsonb + _eq: jsonb + _gt: jsonb + _gte: jsonb + + """does the string exist as a top-level key in the column""" + _has_key: String + + """do all of these strings exist as top-level keys in the column""" + _has_keys_all: [String!] + + """do any of these strings exist as top-level keys in the column""" + _has_keys_any: [String!] + _in: [jsonb!] + _is_null: Boolean + _lt: jsonb + _lte: jsonb + _neq: jsonb + _nin: [jsonb!] +} + +"""mutation root""" +type mutation_root { + """ + delete data from the table: "darunrs_near_bitmap_v3.actions_index" + """ + delete_darunrs_near_bitmap_v3_actions_index( + """filter the rows which have to be deleted""" + where: darunrs_near_bitmap_v3_actions_index_bool_exp! + ): darunrs_near_bitmap_v3_actions_index_mutation_response + + """ + delete single row from the table: "darunrs_near_bitmap_v3.actions_index" + """ + delete_darunrs_near_bitmap_v3_actions_index_by_pk(block_date: String!, receiver_id: String!): darunrs_near_bitmap_v3_actions_index + + """ + delete data from the table: "darunrs_near_bitmap_v3.sys_logs" + """ + delete_darunrs_near_bitmap_v3_sys_logs( + """filter the rows which have to be deleted""" + where: darunrs_near_bitmap_v3_sys_logs_bool_exp! + ): darunrs_near_bitmap_v3_sys_logs_mutation_response + + """ + delete single row from the table: "darunrs_near_bitmap_v3.sys_logs" + """ + delete_darunrs_near_bitmap_v3_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_bitmap_v3_sys_logs + + """ + delete data from the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + delete_darunrs_near_bitmap_v3_sys_metadata( + """filter the rows which have to be deleted""" + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp! + ): darunrs_near_bitmap_v3_sys_metadata_mutation_response + + """ + delete single row from the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + delete_darunrs_near_bitmap_v3_sys_metadata_by_pk(attribute: String!): darunrs_near_bitmap_v3_sys_metadata + + """ + delete data from the table: "darunrs_near_test_fork.indexer_storage" + """ + delete_darunrs_near_test_fork_indexer_storage( + """filter the rows which have to be deleted""" + where: darunrs_near_test_fork_indexer_storage_bool_exp! + ): darunrs_near_test_fork_indexer_storage_mutation_response + + """ + delete single row from the table: "darunrs_near_test_fork.indexer_storage" + """ + delete_darunrs_near_test_fork_indexer_storage_by_pk(function_name: String!, key_name: String!): darunrs_near_test_fork_indexer_storage + + """ + delete data from the table: "darunrs_near_test_fork.sys_logs" + """ + delete_darunrs_near_test_fork_sys_logs( + """filter the rows which have to be deleted""" + where: darunrs_near_test_fork_sys_logs_bool_exp! + ): darunrs_near_test_fork_sys_logs_mutation_response + + """ + delete single row from the table: "darunrs_near_test_fork.sys_logs" + """ + delete_darunrs_near_test_fork_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_test_fork_sys_logs + + """ + delete data from the table: "darunrs_near_test_fork.sys_metadata" + """ + delete_darunrs_near_test_fork_sys_metadata( + """filter the rows which have to be deleted""" + where: darunrs_near_test_fork_sys_metadata_bool_exp! + ): darunrs_near_test_fork_sys_metadata_mutation_response + + """ + delete single row from the table: "darunrs_near_test_fork.sys_metadata" + """ + delete_darunrs_near_test_fork_sys_metadata_by_pk(attribute: String!): darunrs_near_test_fork_sys_metadata + + """ + insert data into the table: "darunrs_near_bitmap_v3.actions_index" + """ + insert_darunrs_near_bitmap_v3_actions_index( + """the rows to be inserted""" + objects: [darunrs_near_bitmap_v3_actions_index_insert_input!]! + + """upsert condition""" + on_conflict: darunrs_near_bitmap_v3_actions_index_on_conflict + ): darunrs_near_bitmap_v3_actions_index_mutation_response + + """ + insert a single row into the table: "darunrs_near_bitmap_v3.actions_index" + """ + insert_darunrs_near_bitmap_v3_actions_index_one( + """the row to be inserted""" + object: darunrs_near_bitmap_v3_actions_index_insert_input! + + """upsert condition""" + on_conflict: darunrs_near_bitmap_v3_actions_index_on_conflict + ): darunrs_near_bitmap_v3_actions_index + + """ + insert data into the table: "darunrs_near_bitmap_v3.sys_logs" + """ + insert_darunrs_near_bitmap_v3_sys_logs( + """the rows to be inserted""" + objects: [darunrs_near_bitmap_v3_sys_logs_insert_input!]! + + """upsert condition""" + on_conflict: darunrs_near_bitmap_v3_sys_logs_on_conflict + ): darunrs_near_bitmap_v3_sys_logs_mutation_response + + """ + insert a single row into the table: "darunrs_near_bitmap_v3.sys_logs" + """ + insert_darunrs_near_bitmap_v3_sys_logs_one( + """the row to be inserted""" + object: darunrs_near_bitmap_v3_sys_logs_insert_input! + + """upsert condition""" + on_conflict: darunrs_near_bitmap_v3_sys_logs_on_conflict + ): darunrs_near_bitmap_v3_sys_logs + + """ + insert data into the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + insert_darunrs_near_bitmap_v3_sys_metadata( + """the rows to be inserted""" + objects: [darunrs_near_bitmap_v3_sys_metadata_insert_input!]! + + """upsert condition""" + on_conflict: darunrs_near_bitmap_v3_sys_metadata_on_conflict + ): darunrs_near_bitmap_v3_sys_metadata_mutation_response + + """ + insert a single row into the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + insert_darunrs_near_bitmap_v3_sys_metadata_one( + """the row to be inserted""" + object: darunrs_near_bitmap_v3_sys_metadata_insert_input! + + """upsert condition""" + on_conflict: darunrs_near_bitmap_v3_sys_metadata_on_conflict + ): darunrs_near_bitmap_v3_sys_metadata + + """ + insert data into the table: "darunrs_near_test_fork.indexer_storage" + """ + insert_darunrs_near_test_fork_indexer_storage( + """the rows to be inserted""" + objects: [darunrs_near_test_fork_indexer_storage_insert_input!]! + + """upsert condition""" + on_conflict: darunrs_near_test_fork_indexer_storage_on_conflict + ): darunrs_near_test_fork_indexer_storage_mutation_response + + """ + insert a single row into the table: "darunrs_near_test_fork.indexer_storage" + """ + insert_darunrs_near_test_fork_indexer_storage_one( + """the row to be inserted""" + object: darunrs_near_test_fork_indexer_storage_insert_input! + + """upsert condition""" + on_conflict: darunrs_near_test_fork_indexer_storage_on_conflict + ): darunrs_near_test_fork_indexer_storage + + """ + insert data into the table: "darunrs_near_test_fork.sys_logs" + """ + insert_darunrs_near_test_fork_sys_logs( + """the rows to be inserted""" + objects: [darunrs_near_test_fork_sys_logs_insert_input!]! + + """upsert condition""" + on_conflict: darunrs_near_test_fork_sys_logs_on_conflict + ): darunrs_near_test_fork_sys_logs_mutation_response + + """ + insert a single row into the table: "darunrs_near_test_fork.sys_logs" + """ + insert_darunrs_near_test_fork_sys_logs_one( + """the row to be inserted""" + object: darunrs_near_test_fork_sys_logs_insert_input! + + """upsert condition""" + on_conflict: darunrs_near_test_fork_sys_logs_on_conflict + ): darunrs_near_test_fork_sys_logs + + """ + insert data into the table: "darunrs_near_test_fork.sys_metadata" + """ + insert_darunrs_near_test_fork_sys_metadata( + """the rows to be inserted""" + objects: [darunrs_near_test_fork_sys_metadata_insert_input!]! + + """upsert condition""" + on_conflict: darunrs_near_test_fork_sys_metadata_on_conflict + ): darunrs_near_test_fork_sys_metadata_mutation_response + + """ + insert a single row into the table: "darunrs_near_test_fork.sys_metadata" + """ + insert_darunrs_near_test_fork_sys_metadata_one( + """the row to be inserted""" + object: darunrs_near_test_fork_sys_metadata_insert_input! + + """upsert condition""" + on_conflict: darunrs_near_test_fork_sys_metadata_on_conflict + ): darunrs_near_test_fork_sys_metadata + + """ + update data of the table: "darunrs_near_bitmap_v3.actions_index" + """ + update_darunrs_near_bitmap_v3_actions_index( + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_bitmap_v3_actions_index_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_actions_index_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_bitmap_v3_actions_index_bool_exp! + ): darunrs_near_bitmap_v3_actions_index_mutation_response + + """ + update single row of the table: "darunrs_near_bitmap_v3.actions_index" + """ + update_darunrs_near_bitmap_v3_actions_index_by_pk( + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_bitmap_v3_actions_index_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_actions_index_set_input + pk_columns: darunrs_near_bitmap_v3_actions_index_pk_columns_input! + ): darunrs_near_bitmap_v3_actions_index + + """ + update multiples rows of table: "darunrs_near_bitmap_v3.actions_index" + """ + update_darunrs_near_bitmap_v3_actions_index_many( + """updates to execute, in order""" + updates: [darunrs_near_bitmap_v3_actions_index_updates!]! + ): [darunrs_near_bitmap_v3_actions_index_mutation_response] + + """ + update data of the table: "darunrs_near_bitmap_v3.sys_logs" + """ + update_darunrs_near_bitmap_v3_sys_logs( + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_bitmap_v3_sys_logs_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_sys_logs_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_bitmap_v3_sys_logs_bool_exp! + ): darunrs_near_bitmap_v3_sys_logs_mutation_response + + """ + update single row of the table: "darunrs_near_bitmap_v3.sys_logs" + """ + update_darunrs_near_bitmap_v3_sys_logs_by_pk( + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_bitmap_v3_sys_logs_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_sys_logs_set_input + pk_columns: darunrs_near_bitmap_v3_sys_logs_pk_columns_input! + ): darunrs_near_bitmap_v3_sys_logs + + """ + update multiples rows of table: "darunrs_near_bitmap_v3.sys_logs" + """ + update_darunrs_near_bitmap_v3_sys_logs_many( + """updates to execute, in order""" + updates: [darunrs_near_bitmap_v3_sys_logs_updates!]! + ): [darunrs_near_bitmap_v3_sys_logs_mutation_response] + + """ + update data of the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + update_darunrs_near_bitmap_v3_sys_metadata( + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_sys_metadata_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp! + ): darunrs_near_bitmap_v3_sys_metadata_mutation_response + + """ + update single row of the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + update_darunrs_near_bitmap_v3_sys_metadata_by_pk( + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_bitmap_v3_sys_metadata_set_input + pk_columns: darunrs_near_bitmap_v3_sys_metadata_pk_columns_input! + ): darunrs_near_bitmap_v3_sys_metadata + + """ + update multiples rows of table: "darunrs_near_bitmap_v3.sys_metadata" + """ + update_darunrs_near_bitmap_v3_sys_metadata_many( + """updates to execute, in order""" + updates: [darunrs_near_bitmap_v3_sys_metadata_updates!]! + ): [darunrs_near_bitmap_v3_sys_metadata_mutation_response] + + """ + update data of the table: "darunrs_near_test_fork.indexer_storage" + """ + update_darunrs_near_test_fork_indexer_storage( + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_indexer_storage_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_test_fork_indexer_storage_bool_exp! + ): darunrs_near_test_fork_indexer_storage_mutation_response + + """ + update single row of the table: "darunrs_near_test_fork.indexer_storage" + """ + update_darunrs_near_test_fork_indexer_storage_by_pk( + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_indexer_storage_set_input + pk_columns: darunrs_near_test_fork_indexer_storage_pk_columns_input! + ): darunrs_near_test_fork_indexer_storage + + """ + update multiples rows of table: "darunrs_near_test_fork.indexer_storage" + """ + update_darunrs_near_test_fork_indexer_storage_many( + """updates to execute, in order""" + updates: [darunrs_near_test_fork_indexer_storage_updates!]! + ): [darunrs_near_test_fork_indexer_storage_mutation_response] + + """ + update data of the table: "darunrs_near_test_fork.sys_logs" + """ + update_darunrs_near_test_fork_sys_logs( + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_test_fork_sys_logs_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_sys_logs_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_test_fork_sys_logs_bool_exp! + ): darunrs_near_test_fork_sys_logs_mutation_response + + """ + update single row of the table: "darunrs_near_test_fork.sys_logs" + """ + update_darunrs_near_test_fork_sys_logs_by_pk( + """increments the numeric columns with given value of the filtered values""" + _inc: darunrs_near_test_fork_sys_logs_inc_input + + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_sys_logs_set_input + pk_columns: darunrs_near_test_fork_sys_logs_pk_columns_input! + ): darunrs_near_test_fork_sys_logs + + """ + update multiples rows of table: "darunrs_near_test_fork.sys_logs" + """ + update_darunrs_near_test_fork_sys_logs_many( + """updates to execute, in order""" + updates: [darunrs_near_test_fork_sys_logs_updates!]! + ): [darunrs_near_test_fork_sys_logs_mutation_response] + + """ + update data of the table: "darunrs_near_test_fork.sys_metadata" + """ + update_darunrs_near_test_fork_sys_metadata( + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_sys_metadata_set_input + + """filter the rows which have to be updated""" + where: darunrs_near_test_fork_sys_metadata_bool_exp! + ): darunrs_near_test_fork_sys_metadata_mutation_response + + """ + update single row of the table: "darunrs_near_test_fork.sys_metadata" + """ + update_darunrs_near_test_fork_sys_metadata_by_pk( + """sets the columns of the filtered rows to the given values""" + _set: darunrs_near_test_fork_sys_metadata_set_input + pk_columns: darunrs_near_test_fork_sys_metadata_pk_columns_input! + ): darunrs_near_test_fork_sys_metadata + + """ + update multiples rows of table: "darunrs_near_test_fork.sys_metadata" + """ + update_darunrs_near_test_fork_sys_metadata_many( + """updates to execute, in order""" + updates: [darunrs_near_test_fork_sys_metadata_updates!]! + ): [darunrs_near_test_fork_sys_metadata_mutation_response] +} + +scalar numeric + +""" +Boolean expression to compare columns of type "numeric". All fields are combined with logical 'AND'. +""" +input numeric_comparison_exp { + _eq: numeric + _gt: numeric + _gte: numeric + _in: [numeric!] + _is_null: Boolean + _lt: numeric + _lte: numeric + _neq: numeric + _nin: [numeric!] +} + +"""column ordering options""" +enum order_by { + """in ascending order, nulls last""" + asc + + """in ascending order, nulls first""" + asc_nulls_first + + """in ascending order, nulls last""" + asc_nulls_last + + """in descending order, nulls first""" + desc + + """in descending order, nulls first""" + desc_nulls_first + + """in descending order, nulls last""" + desc_nulls_last +} + +type query_root { + """ + fetch data from the table: "darunrs_near_benchmark_indexer.indexer_storage" + """ + darunrs_near_benchmark_indexer_indexer_storage( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_indexer_storage_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_indexer_storage_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_indexer_storage_bool_exp + ): [darunrs_near_benchmark_indexer_indexer_storage!]! + + """ + fetch aggregated fields from the table: "darunrs_near_benchmark_indexer.indexer_storage" + """ + darunrs_near_benchmark_indexer_indexer_storage_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_indexer_storage_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_indexer_storage_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_indexer_storage_bool_exp + ): darunrs_near_benchmark_indexer_indexer_storage_aggregate! + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.indexer_storage" using primary key columns + """ + darunrs_near_benchmark_indexer_indexer_storage_by_pk(function_name: String!, key_name: String!): darunrs_near_benchmark_indexer_indexer_storage + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.sys_logs" + """ + darunrs_near_benchmark_indexer_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_logs_bool_exp + ): [darunrs_near_benchmark_indexer_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_benchmark_indexer.sys_logs" + """ + darunrs_near_benchmark_indexer_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_logs_bool_exp + ): darunrs_near_benchmark_indexer_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.sys_logs" using primary key columns + """ + darunrs_near_benchmark_indexer_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_benchmark_indexer_sys_logs + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.sys_metadata" + """ + darunrs_near_benchmark_indexer_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_metadata_bool_exp + ): [darunrs_near_benchmark_indexer_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_benchmark_indexer.sys_metadata" + """ + darunrs_near_benchmark_indexer_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_metadata_bool_exp + ): darunrs_near_benchmark_indexer_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.sys_metadata" using primary key columns + """ + darunrs_near_benchmark_indexer_sys_metadata_by_pk(attribute: String!): darunrs_near_benchmark_indexer_sys_metadata + + """ + fetch data from the table: "darunrs_near_bitmap_v3.actions_index" + """ + darunrs_near_bitmap_v3_actions_index( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_actions_index_bool_exp + ): [darunrs_near_bitmap_v3_actions_index!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v3.actions_index" + """ + darunrs_near_bitmap_v3_actions_index_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_actions_index_bool_exp + ): darunrs_near_bitmap_v3_actions_index_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.actions_index" using primary key columns + """ + darunrs_near_bitmap_v3_actions_index_by_pk(block_date: String!, receiver_id: String!): darunrs_near_bitmap_v3_actions_index + + """ + fetch data from the table: "darunrs_near_bitmap_v3.sys_logs" + """ + darunrs_near_bitmap_v3_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_logs_bool_exp + ): [darunrs_near_bitmap_v3_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v3.sys_logs" + """ + darunrs_near_bitmap_v3_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_logs_bool_exp + ): darunrs_near_bitmap_v3_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.sys_logs" using primary key columns + """ + darunrs_near_bitmap_v3_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_bitmap_v3_sys_logs + + """ + fetch data from the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + darunrs_near_bitmap_v3_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp + ): [darunrs_near_bitmap_v3_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + darunrs_near_bitmap_v3_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp + ): darunrs_near_bitmap_v3_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.sys_metadata" using primary key columns + """ + darunrs_near_bitmap_v3_sys_metadata_by_pk(attribute: String!): darunrs_near_bitmap_v3_sys_metadata + + """ + fetch data from the table: "darunrs_near_bitmap_v5.actions_index" + """ + darunrs_near_bitmap_v5_actions_index( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_actions_index_bool_exp + ): [darunrs_near_bitmap_v5_actions_index!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v5.actions_index" + """ + darunrs_near_bitmap_v5_actions_index_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_actions_index_bool_exp + ): darunrs_near_bitmap_v5_actions_index_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.actions_index" using primary key columns + """ + darunrs_near_bitmap_v5_actions_index_by_pk(block_date: date!, receiver_id: bigint!): darunrs_near_bitmap_v5_actions_index + + """ + fetch data from the table: "darunrs_near_bitmap_v5.receivers" + """ + darunrs_near_bitmap_v5_receivers( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_receivers_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_receivers_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_receivers_bool_exp + ): [darunrs_near_bitmap_v5_receivers!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v5.receivers" + """ + darunrs_near_bitmap_v5_receivers_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_receivers_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_receivers_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_receivers_bool_exp + ): darunrs_near_bitmap_v5_receivers_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.receivers" using primary key columns + """ + darunrs_near_bitmap_v5_receivers_by_pk(id: bigint!): darunrs_near_bitmap_v5_receivers + + """ + fetch data from the table: "darunrs_near_bitmap_v5.sys_logs" + """ + darunrs_near_bitmap_v5_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_logs_bool_exp + ): [darunrs_near_bitmap_v5_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v5.sys_logs" + """ + darunrs_near_bitmap_v5_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_logs_bool_exp + ): darunrs_near_bitmap_v5_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.sys_logs" using primary key columns + """ + darunrs_near_bitmap_v5_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_bitmap_v5_sys_logs + + """ + fetch data from the table: "darunrs_near_bitmap_v5.sys_metadata" + """ + darunrs_near_bitmap_v5_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_metadata_bool_exp + ): [darunrs_near_bitmap_v5_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v5.sys_metadata" + """ + darunrs_near_bitmap_v5_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_metadata_bool_exp + ): darunrs_near_bitmap_v5_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.sys_metadata" using primary key columns + """ + darunrs_near_bitmap_v5_sys_metadata_by_pk(attribute: String!): darunrs_near_bitmap_v5_sys_metadata + + """ + fetch data from the table: "darunrs_near_social_feed_test.comments" + """ + darunrs_near_social_feed_test_comments( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_comments_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_comments_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_comments_bool_exp + ): [darunrs_near_social_feed_test_comments!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.comments" + """ + darunrs_near_social_feed_test_comments_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_comments_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_comments_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_comments_bool_exp + ): darunrs_near_social_feed_test_comments_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.comments" using primary key columns + """ + darunrs_near_social_feed_test_comments_by_pk(id: Int!): darunrs_near_social_feed_test_comments + + """ + fetch data from the table: "darunrs_near_social_feed_test.post_likes" + """ + darunrs_near_social_feed_test_post_likes( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_post_likes_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_post_likes_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_post_likes_bool_exp + ): [darunrs_near_social_feed_test_post_likes!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.post_likes" + """ + darunrs_near_social_feed_test_post_likes_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_post_likes_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_post_likes_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_post_likes_bool_exp + ): darunrs_near_social_feed_test_post_likes_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.post_likes" using primary key columns + """ + darunrs_near_social_feed_test_post_likes_by_pk(account_id: String!, post_id: Int!): darunrs_near_social_feed_test_post_likes + + """ + fetch data from the table: "darunrs_near_social_feed_test.posts" + """ + darunrs_near_social_feed_test_posts( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_posts_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_posts_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_posts_bool_exp + ): [darunrs_near_social_feed_test_posts!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.posts" + """ + darunrs_near_social_feed_test_posts_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_posts_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_posts_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_posts_bool_exp + ): darunrs_near_social_feed_test_posts_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.posts" using primary key columns + """ + darunrs_near_social_feed_test_posts_by_pk(id: Int!): darunrs_near_social_feed_test_posts + + """ + fetch data from the table: "darunrs_near_social_feed_test.sys_logs" + """ + darunrs_near_social_feed_test_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_logs_bool_exp + ): [darunrs_near_social_feed_test_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.sys_logs" + """ + darunrs_near_social_feed_test_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_logs_bool_exp + ): darunrs_near_social_feed_test_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.sys_logs" using primary key columns + """ + darunrs_near_social_feed_test_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_social_feed_test_sys_logs + + """ + fetch data from the table: "darunrs_near_social_feed_test.sys_metadata" + """ + darunrs_near_social_feed_test_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_metadata_bool_exp + ): [darunrs_near_social_feed_test_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.sys_metadata" + """ + darunrs_near_social_feed_test_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_metadata_bool_exp + ): darunrs_near_social_feed_test_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.sys_metadata" using primary key columns + """ + darunrs_near_social_feed_test_sys_metadata_by_pk(attribute: String!): darunrs_near_social_feed_test_sys_metadata + + """ + fetch data from the table: "darunrs_near_test_fork.indexer_storage" + """ + darunrs_near_test_fork_indexer_storage( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_indexer_storage_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_indexer_storage_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_indexer_storage_bool_exp + ): [darunrs_near_test_fork_indexer_storage!]! + + """ + fetch aggregated fields from the table: "darunrs_near_test_fork.indexer_storage" + """ + darunrs_near_test_fork_indexer_storage_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_indexer_storage_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_indexer_storage_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_indexer_storage_bool_exp + ): darunrs_near_test_fork_indexer_storage_aggregate! + + """ + fetch data from the table: "darunrs_near_test_fork.indexer_storage" using primary key columns + """ + darunrs_near_test_fork_indexer_storage_by_pk(function_name: String!, key_name: String!): darunrs_near_test_fork_indexer_storage + + """ + fetch data from the table: "darunrs_near_test_fork.sys_logs" + """ + darunrs_near_test_fork_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_logs_bool_exp + ): [darunrs_near_test_fork_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_test_fork.sys_logs" + """ + darunrs_near_test_fork_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_logs_bool_exp + ): darunrs_near_test_fork_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_test_fork.sys_logs" using primary key columns + """ + darunrs_near_test_fork_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_test_fork_sys_logs + + """ + fetch data from the table: "darunrs_near_test_fork.sys_metadata" + """ + darunrs_near_test_fork_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_metadata_bool_exp + ): [darunrs_near_test_fork_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_test_fork.sys_metadata" + """ + darunrs_near_test_fork_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_metadata_bool_exp + ): darunrs_near_test_fork_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_test_fork.sys_metadata" using primary key columns + """ + darunrs_near_test_fork_sys_metadata_by_pk(attribute: String!): darunrs_near_test_fork_sys_metadata +} + +type subscription_root { + """ + fetch data from the table: "darunrs_near_benchmark_indexer.indexer_storage" + """ + darunrs_near_benchmark_indexer_indexer_storage( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_indexer_storage_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_indexer_storage_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_indexer_storage_bool_exp + ): [darunrs_near_benchmark_indexer_indexer_storage!]! + + """ + fetch aggregated fields from the table: "darunrs_near_benchmark_indexer.indexer_storage" + """ + darunrs_near_benchmark_indexer_indexer_storage_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_indexer_storage_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_indexer_storage_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_indexer_storage_bool_exp + ): darunrs_near_benchmark_indexer_indexer_storage_aggregate! + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.indexer_storage" using primary key columns + """ + darunrs_near_benchmark_indexer_indexer_storage_by_pk(function_name: String!, key_name: String!): darunrs_near_benchmark_indexer_indexer_storage + + """ + fetch data from the table in a streaming manner: "darunrs_near_benchmark_indexer.indexer_storage" + """ + darunrs_near_benchmark_indexer_indexer_storage_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_benchmark_indexer_indexer_storage_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_indexer_storage_bool_exp + ): [darunrs_near_benchmark_indexer_indexer_storage!]! + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.sys_logs" + """ + darunrs_near_benchmark_indexer_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_logs_bool_exp + ): [darunrs_near_benchmark_indexer_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_benchmark_indexer.sys_logs" + """ + darunrs_near_benchmark_indexer_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_logs_bool_exp + ): darunrs_near_benchmark_indexer_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.sys_logs" using primary key columns + """ + darunrs_near_benchmark_indexer_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_benchmark_indexer_sys_logs + + """ + fetch data from the table in a streaming manner: "darunrs_near_benchmark_indexer.sys_logs" + """ + darunrs_near_benchmark_indexer_sys_logs_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_benchmark_indexer_sys_logs_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_logs_bool_exp + ): [darunrs_near_benchmark_indexer_sys_logs!]! + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.sys_metadata" + """ + darunrs_near_benchmark_indexer_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_metadata_bool_exp + ): [darunrs_near_benchmark_indexer_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_benchmark_indexer.sys_metadata" + """ + darunrs_near_benchmark_indexer_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_benchmark_indexer_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_benchmark_indexer_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_metadata_bool_exp + ): darunrs_near_benchmark_indexer_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_benchmark_indexer.sys_metadata" using primary key columns + """ + darunrs_near_benchmark_indexer_sys_metadata_by_pk(attribute: String!): darunrs_near_benchmark_indexer_sys_metadata + + """ + fetch data from the table in a streaming manner: "darunrs_near_benchmark_indexer.sys_metadata" + """ + darunrs_near_benchmark_indexer_sys_metadata_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_benchmark_indexer_sys_metadata_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_benchmark_indexer_sys_metadata_bool_exp + ): [darunrs_near_benchmark_indexer_sys_metadata!]! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.actions_index" + """ + darunrs_near_bitmap_v3_actions_index( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_actions_index_bool_exp + ): [darunrs_near_bitmap_v3_actions_index!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v3.actions_index" + """ + darunrs_near_bitmap_v3_actions_index_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_actions_index_bool_exp + ): darunrs_near_bitmap_v3_actions_index_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.actions_index" using primary key columns + """ + darunrs_near_bitmap_v3_actions_index_by_pk(block_date: String!, receiver_id: String!): darunrs_near_bitmap_v3_actions_index + + """ + fetch data from the table in a streaming manner: "darunrs_near_bitmap_v3.actions_index" + """ + darunrs_near_bitmap_v3_actions_index_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_bitmap_v3_actions_index_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_actions_index_bool_exp + ): [darunrs_near_bitmap_v3_actions_index!]! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.sys_logs" + """ + darunrs_near_bitmap_v3_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_logs_bool_exp + ): [darunrs_near_bitmap_v3_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v3.sys_logs" + """ + darunrs_near_bitmap_v3_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_logs_bool_exp + ): darunrs_near_bitmap_v3_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.sys_logs" using primary key columns + """ + darunrs_near_bitmap_v3_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_bitmap_v3_sys_logs + + """ + fetch data from the table in a streaming manner: "darunrs_near_bitmap_v3.sys_logs" + """ + darunrs_near_bitmap_v3_sys_logs_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_bitmap_v3_sys_logs_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_logs_bool_exp + ): [darunrs_near_bitmap_v3_sys_logs!]! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + darunrs_near_bitmap_v3_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp + ): [darunrs_near_bitmap_v3_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v3.sys_metadata" + """ + darunrs_near_bitmap_v3_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v3_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v3_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp + ): darunrs_near_bitmap_v3_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v3.sys_metadata" using primary key columns + """ + darunrs_near_bitmap_v3_sys_metadata_by_pk(attribute: String!): darunrs_near_bitmap_v3_sys_metadata + + """ + fetch data from the table in a streaming manner: "darunrs_near_bitmap_v3.sys_metadata" + """ + darunrs_near_bitmap_v3_sys_metadata_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_bitmap_v3_sys_metadata_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_bitmap_v3_sys_metadata_bool_exp + ): [darunrs_near_bitmap_v3_sys_metadata!]! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.actions_index" + """ + darunrs_near_bitmap_v5_actions_index( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_actions_index_bool_exp + ): [darunrs_near_bitmap_v5_actions_index!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v5.actions_index" + """ + darunrs_near_bitmap_v5_actions_index_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_actions_index_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_actions_index_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_actions_index_bool_exp + ): darunrs_near_bitmap_v5_actions_index_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.actions_index" using primary key columns + """ + darunrs_near_bitmap_v5_actions_index_by_pk(block_date: date!, receiver_id: bigint!): darunrs_near_bitmap_v5_actions_index + + """ + fetch data from the table in a streaming manner: "darunrs_near_bitmap_v5.actions_index" + """ + darunrs_near_bitmap_v5_actions_index_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_bitmap_v5_actions_index_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_actions_index_bool_exp + ): [darunrs_near_bitmap_v5_actions_index!]! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.receivers" + """ + darunrs_near_bitmap_v5_receivers( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_receivers_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_receivers_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_receivers_bool_exp + ): [darunrs_near_bitmap_v5_receivers!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v5.receivers" + """ + darunrs_near_bitmap_v5_receivers_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_receivers_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_receivers_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_receivers_bool_exp + ): darunrs_near_bitmap_v5_receivers_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.receivers" using primary key columns + """ + darunrs_near_bitmap_v5_receivers_by_pk(id: bigint!): darunrs_near_bitmap_v5_receivers + + """ + fetch data from the table in a streaming manner: "darunrs_near_bitmap_v5.receivers" + """ + darunrs_near_bitmap_v5_receivers_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_bitmap_v5_receivers_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_receivers_bool_exp + ): [darunrs_near_bitmap_v5_receivers!]! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.sys_logs" + """ + darunrs_near_bitmap_v5_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_logs_bool_exp + ): [darunrs_near_bitmap_v5_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v5.sys_logs" + """ + darunrs_near_bitmap_v5_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_logs_bool_exp + ): darunrs_near_bitmap_v5_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.sys_logs" using primary key columns + """ + darunrs_near_bitmap_v5_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_bitmap_v5_sys_logs + + """ + fetch data from the table in a streaming manner: "darunrs_near_bitmap_v5.sys_logs" + """ + darunrs_near_bitmap_v5_sys_logs_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_bitmap_v5_sys_logs_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_logs_bool_exp + ): [darunrs_near_bitmap_v5_sys_logs!]! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.sys_metadata" + """ + darunrs_near_bitmap_v5_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_metadata_bool_exp + ): [darunrs_near_bitmap_v5_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_bitmap_v5.sys_metadata" + """ + darunrs_near_bitmap_v5_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_bitmap_v5_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_bitmap_v5_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_metadata_bool_exp + ): darunrs_near_bitmap_v5_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_bitmap_v5.sys_metadata" using primary key columns + """ + darunrs_near_bitmap_v5_sys_metadata_by_pk(attribute: String!): darunrs_near_bitmap_v5_sys_metadata + + """ + fetch data from the table in a streaming manner: "darunrs_near_bitmap_v5.sys_metadata" + """ + darunrs_near_bitmap_v5_sys_metadata_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_bitmap_v5_sys_metadata_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_bitmap_v5_sys_metadata_bool_exp + ): [darunrs_near_bitmap_v5_sys_metadata!]! + + """ + fetch data from the table: "darunrs_near_social_feed_test.comments" + """ + darunrs_near_social_feed_test_comments( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_comments_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_comments_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_comments_bool_exp + ): [darunrs_near_social_feed_test_comments!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.comments" + """ + darunrs_near_social_feed_test_comments_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_comments_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_comments_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_comments_bool_exp + ): darunrs_near_social_feed_test_comments_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.comments" using primary key columns + """ + darunrs_near_social_feed_test_comments_by_pk(id: Int!): darunrs_near_social_feed_test_comments + + """ + fetch data from the table in a streaming manner: "darunrs_near_social_feed_test.comments" + """ + darunrs_near_social_feed_test_comments_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_social_feed_test_comments_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_social_feed_test_comments_bool_exp + ): [darunrs_near_social_feed_test_comments!]! + + """ + fetch data from the table: "darunrs_near_social_feed_test.post_likes" + """ + darunrs_near_social_feed_test_post_likes( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_post_likes_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_post_likes_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_post_likes_bool_exp + ): [darunrs_near_social_feed_test_post_likes!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.post_likes" + """ + darunrs_near_social_feed_test_post_likes_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_post_likes_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_post_likes_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_post_likes_bool_exp + ): darunrs_near_social_feed_test_post_likes_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.post_likes" using primary key columns + """ + darunrs_near_social_feed_test_post_likes_by_pk(account_id: String!, post_id: Int!): darunrs_near_social_feed_test_post_likes + + """ + fetch data from the table in a streaming manner: "darunrs_near_social_feed_test.post_likes" + """ + darunrs_near_social_feed_test_post_likes_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_social_feed_test_post_likes_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_social_feed_test_post_likes_bool_exp + ): [darunrs_near_social_feed_test_post_likes!]! + + """ + fetch data from the table: "darunrs_near_social_feed_test.posts" + """ + darunrs_near_social_feed_test_posts( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_posts_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_posts_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_posts_bool_exp + ): [darunrs_near_social_feed_test_posts!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.posts" + """ + darunrs_near_social_feed_test_posts_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_posts_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_posts_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_posts_bool_exp + ): darunrs_near_social_feed_test_posts_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.posts" using primary key columns + """ + darunrs_near_social_feed_test_posts_by_pk(id: Int!): darunrs_near_social_feed_test_posts + + """ + fetch data from the table in a streaming manner: "darunrs_near_social_feed_test.posts" + """ + darunrs_near_social_feed_test_posts_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_social_feed_test_posts_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_social_feed_test_posts_bool_exp + ): [darunrs_near_social_feed_test_posts!]! + + """ + fetch data from the table: "darunrs_near_social_feed_test.sys_logs" + """ + darunrs_near_social_feed_test_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_logs_bool_exp + ): [darunrs_near_social_feed_test_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.sys_logs" + """ + darunrs_near_social_feed_test_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_logs_bool_exp + ): darunrs_near_social_feed_test_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.sys_logs" using primary key columns + """ + darunrs_near_social_feed_test_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_social_feed_test_sys_logs + + """ + fetch data from the table in a streaming manner: "darunrs_near_social_feed_test.sys_logs" + """ + darunrs_near_social_feed_test_sys_logs_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_social_feed_test_sys_logs_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_logs_bool_exp + ): [darunrs_near_social_feed_test_sys_logs!]! + + """ + fetch data from the table: "darunrs_near_social_feed_test.sys_metadata" + """ + darunrs_near_social_feed_test_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_metadata_bool_exp + ): [darunrs_near_social_feed_test_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_social_feed_test.sys_metadata" + """ + darunrs_near_social_feed_test_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_social_feed_test_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_social_feed_test_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_metadata_bool_exp + ): darunrs_near_social_feed_test_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_social_feed_test.sys_metadata" using primary key columns + """ + darunrs_near_social_feed_test_sys_metadata_by_pk(attribute: String!): darunrs_near_social_feed_test_sys_metadata + + """ + fetch data from the table in a streaming manner: "darunrs_near_social_feed_test.sys_metadata" + """ + darunrs_near_social_feed_test_sys_metadata_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_social_feed_test_sys_metadata_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_social_feed_test_sys_metadata_bool_exp + ): [darunrs_near_social_feed_test_sys_metadata!]! + + """ + fetch data from the table: "darunrs_near_test_fork.indexer_storage" + """ + darunrs_near_test_fork_indexer_storage( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_indexer_storage_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_indexer_storage_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_indexer_storage_bool_exp + ): [darunrs_near_test_fork_indexer_storage!]! + + """ + fetch aggregated fields from the table: "darunrs_near_test_fork.indexer_storage" + """ + darunrs_near_test_fork_indexer_storage_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_indexer_storage_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_indexer_storage_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_indexer_storage_bool_exp + ): darunrs_near_test_fork_indexer_storage_aggregate! + + """ + fetch data from the table: "darunrs_near_test_fork.indexer_storage" using primary key columns + """ + darunrs_near_test_fork_indexer_storage_by_pk(function_name: String!, key_name: String!): darunrs_near_test_fork_indexer_storage + + """ + fetch data from the table in a streaming manner: "darunrs_near_test_fork.indexer_storage" + """ + darunrs_near_test_fork_indexer_storage_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_test_fork_indexer_storage_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_test_fork_indexer_storage_bool_exp + ): [darunrs_near_test_fork_indexer_storage!]! + + """ + fetch data from the table: "darunrs_near_test_fork.sys_logs" + """ + darunrs_near_test_fork_sys_logs( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_logs_bool_exp + ): [darunrs_near_test_fork_sys_logs!]! + + """ + fetch aggregated fields from the table: "darunrs_near_test_fork.sys_logs" + """ + darunrs_near_test_fork_sys_logs_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_sys_logs_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_sys_logs_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_logs_bool_exp + ): darunrs_near_test_fork_sys_logs_aggregate! + + """ + fetch data from the table: "darunrs_near_test_fork.sys_logs" using primary key columns + """ + darunrs_near_test_fork_sys_logs_by_pk(date: date!, id: bigint!): darunrs_near_test_fork_sys_logs + + """ + fetch data from the table in a streaming manner: "darunrs_near_test_fork.sys_logs" + """ + darunrs_near_test_fork_sys_logs_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_test_fork_sys_logs_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_logs_bool_exp + ): [darunrs_near_test_fork_sys_logs!]! + + """ + fetch data from the table: "darunrs_near_test_fork.sys_metadata" + """ + darunrs_near_test_fork_sys_metadata( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_metadata_bool_exp + ): [darunrs_near_test_fork_sys_metadata!]! + + """ + fetch aggregated fields from the table: "darunrs_near_test_fork.sys_metadata" + """ + darunrs_near_test_fork_sys_metadata_aggregate( + """distinct select on columns""" + distinct_on: [darunrs_near_test_fork_sys_metadata_select_column!] + + """limit the number of rows returned""" + limit: Int + + """skip the first n rows. Use only with order_by""" + offset: Int + + """sort the rows by one or more columns""" + order_by: [darunrs_near_test_fork_sys_metadata_order_by!] + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_metadata_bool_exp + ): darunrs_near_test_fork_sys_metadata_aggregate! + + """ + fetch data from the table: "darunrs_near_test_fork.sys_metadata" using primary key columns + """ + darunrs_near_test_fork_sys_metadata_by_pk(attribute: String!): darunrs_near_test_fork_sys_metadata + + """ + fetch data from the table in a streaming manner: "darunrs_near_test_fork.sys_metadata" + """ + darunrs_near_test_fork_sys_metadata_stream( + """maximum number of rows returned in a single batch""" + batch_size: Int! + + """cursor to stream the results returned by the query""" + cursor: [darunrs_near_test_fork_sys_metadata_stream_cursor_input]! + + """filter the rows returned""" + where: darunrs_near_test_fork_sys_metadata_bool_exp + ): [darunrs_near_test_fork_sys_metadata!]! +} + +scalar timestamp + +""" +Boolean expression to compare columns of type "timestamp". All fields are combined with logical 'AND'. +""" +input timestamp_comparison_exp { + _eq: timestamp + _gt: timestamp + _gte: timestamp + _in: [timestamp!] + _is_null: Boolean + _lt: timestamp + _lte: timestamp + _neq: timestamp + _nin: [timestamp!] +} diff --git a/block-streamer/src/bitmap.rs b/block-streamer/src/bitmap.rs new file mode 100644 index 000000000..a4e921974 --- /dev/null +++ b/block-streamer/src/bitmap.rs @@ -0,0 +1,358 @@ +use anyhow::anyhow; +use base64::{engine::general_purpose, Engine as _}; + +pub struct Base64Bitmap { + pub start_block_height: usize, + pub base64: String, +} + +pub struct Bitmap { + pub start_block_height: usize, + pub bitmap: Vec, +} + +#[derive(Default)] +struct EliasGammaDecoded { + pub value: usize, + pub last_bit_index: usize, +} + +pub struct BitmapOperator {} + +#[cfg_attr(test, mockall::automock)] +impl BitmapOperator { + pub fn new() -> Self { + Self {} + } + + pub fn get_bit(&self, bytes: &[u8], bit_index: usize) -> bool { + let byte_index: usize = bit_index / 8; + let bit_index_in_byte: usize = bit_index % 8; + + (bytes[byte_index] & (1u8 << (7 - bit_index_in_byte))) > 0 + } + + fn set_bit(&self, bytes: &mut [u8], bit_index: usize, bit_value: bool, write_zero: bool) { + if !bit_value && write_zero { + bytes[bit_index / 8] &= !(1u8 << (7 - (bit_index % 8))); + } else if bit_value { + bytes[bit_index / 8] |= 1u8 << (7 - (bit_index % 8)); + } + } + + fn read_integer_from_binary( + &self, + bytes: &[u8], + start_bit_index: usize, + end_bit_index: usize, + ) -> u32 { + let mut number: u32 = 0; + // Read bits from right to left + for curr_bit_index in (start_bit_index..=end_bit_index).rev() { + if self.get_bit(bytes, curr_bit_index) { + number |= 1u32 << (end_bit_index - curr_bit_index); + } + } + + number + } + + fn index_of_first_set_bit(&self, bytes: &[u8], start_bit_index: usize) -> Option { + let mut first_bit_index: usize = start_bit_index % 8; + for (byte_index, byte) in bytes.iter().enumerate().skip(start_bit_index / 8) { + if *byte > 0 { + for bit_index in first_bit_index..=7 { + if *byte & (1u8 << (7 - bit_index)) > 0 { + return Some(byte_index * 8 + bit_index); + } + } + } + first_bit_index = 0; + } + + None + } + + fn decode_elias_gamma_entry(&self, bytes: &[u8], start_bit_index: usize) -> EliasGammaDecoded { + if bytes.is_empty() { + return EliasGammaDecoded::default(); + } + let first_bit_index = match self.index_of_first_set_bit(bytes, start_bit_index) { + Some(index) => index, + None => { + return EliasGammaDecoded::default(); + } + }; + let zero_count: usize = first_bit_index - start_bit_index; + let remainder: usize = if zero_count == 0 { + 0 + } else { + self.read_integer_from_binary(bytes, first_bit_index + 1, first_bit_index + zero_count) + .try_into() + .unwrap() + }; + + EliasGammaDecoded { + value: 2_usize.pow(zero_count.try_into().unwrap()) + remainder, + last_bit_index: first_bit_index + zero_count, + } + } + + fn decompress_bitmap(&self, compressed_bitmap: &[u8]) -> Vec { + let compressed_bit_length: usize = compressed_bitmap.len() * 8; + let mut current_bit_value: bool = (compressed_bitmap[0] & 0b10000000) > 0; + let mut decompressed_bytes: Vec = Vec::new(); + + let mut compressed_bit_index = 1; + let mut decompressed_bit_index = 0; + + while compressed_bit_index < compressed_bit_length { + let decoded_elias_gamma = + self.decode_elias_gamma_entry(compressed_bitmap, compressed_bit_index); + if decoded_elias_gamma.value == 0 { + break; + } + + compressed_bit_index = decoded_elias_gamma.last_bit_index + 1; + let mut bit_index_offset: usize = 0; + while current_bit_value && (bit_index_offset < decoded_elias_gamma.value) { + while decompressed_bit_index + bit_index_offset >= (decompressed_bytes.len() * 8) { + decompressed_bytes.push(0b00000000); + } + self.set_bit( + &mut decompressed_bytes, + decompressed_bit_index + bit_index_offset, + true, + true, + ); + bit_index_offset += 1; + } + + decompressed_bit_index += decoded_elias_gamma.value; + current_bit_value = !current_bit_value; + } + + decompressed_bytes + } + + fn merge_bitmap( + &self, + bitmap_to_update: &mut Bitmap, + bitmap_to_merge: &Bitmap, + ) -> anyhow::Result<()> { + let start_bit_index: usize = match bitmap_to_merge + .start_block_height + .checked_sub(bitmap_to_update.start_block_height) + { + Some(result) => result, + None => { + return Err(anyhow!( + "Start block height in bitmap was lower than provided lowest block height", + )) + } + }; + + for bit_index_offset in 0..(bitmap_to_merge.bitmap.len() * 8) { + let decompressed_bit_value = self.get_bit(&bitmap_to_merge.bitmap, bit_index_offset); + while start_bit_index + bit_index_offset >= bitmap_to_update.bitmap.len() * 8 { + bitmap_to_update.bitmap.push(0b00000000); + } + + self.set_bit( + &mut bitmap_to_update.bitmap, + start_bit_index + bit_index_offset, + decompressed_bit_value, + false, + ); + } + + Ok(()) + } + + pub fn merge_bitmaps( + &self, + bitmaps_to_merge: &Vec, + smallest_start_block_height: usize, + ) -> anyhow::Result { + let mut merged_bitmap: Bitmap = Bitmap { + bitmap: Vec::new(), + start_block_height: smallest_start_block_height, + }; + + for compressed_base64_bitmap in bitmaps_to_merge { + let decoded_bitmap: Vec = + general_purpose::STANDARD.decode(compressed_base64_bitmap.base64.clone())?; + let decompressed_bitmap: Bitmap = Bitmap { + bitmap: self.decompress_bitmap(&decoded_bitmap), + start_block_height: compressed_base64_bitmap.start_block_height, + }; + self.merge_bitmap(&mut merged_bitmap, &decompressed_bitmap)?; + } + + Ok(merged_bitmap) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn get_bit_from_bytes() { + let operator: BitmapOperator = BitmapOperator::new(); + let bytes: &[u8; 3] = &[0b00000001, 0b00000000, 0b00001001]; + let results: Vec = [7, 8, 9, 15, 19, 20, 22, 23] + .iter() + .map(|index| { + return operator.get_bit(bytes, *index); + }) + .collect(); + assert_eq!( + results, + [true, false, false, false, false, true, false, true] + ); + } + + #[test] + fn set_bit_in_bytes() { + let operator: BitmapOperator = BitmapOperator::new(); + let correct_bytes: &[u8; 3] = &[0b00000001, 0b00000000, 0b00001001]; + let test_bytes: &mut [u8; 3] = &mut [0b10000000, 0b10000000, 0b00001001]; + operator.set_bit(test_bytes, 0, false, true); + operator.set_bit(test_bytes, 7, true, true); + operator.set_bit(test_bytes, 8, false, true); + operator.set_bit(test_bytes, 12, false, false); + assert_eq!(correct_bytes, test_bytes); + } + + #[test] + fn get_unsigned_integer_from_binary_sequence() { + let operator: BitmapOperator = BitmapOperator::new(); + let bytes: &[u8; 3] = &[0b11111110, 0b10010100, 0b10001101]; + assert_eq!(operator.read_integer_from_binary(bytes, 6, 16), 1321); + } + + #[test] + fn get_index_of_first_set_bit() { + let operator: BitmapOperator = BitmapOperator::new(); + let bytes: &[u8; 4] = &[0b00000001, 0b10000000, 0b00000001, 0b00000000]; + assert_eq!( + operator.index_of_first_set_bit(bytes, 4).unwrap(), + 7, + "Should get index 7 when starting from 4", + ); + assert_eq!( + operator.index_of_first_set_bit(bytes, 7).unwrap(), + 7, + "Should get index 7 when starting from 7", + ); + assert_eq!( + operator.index_of_first_set_bit(bytes, 8).unwrap(), + 8, + "Should get index 8 when starting from 8", + ); + assert_eq!( + operator.index_of_first_set_bit(bytes, 17).unwrap(), + 23, + "Should get index 23 when starting from 17", + ); + assert!( + operator.index_of_first_set_bit(bytes, 25).is_none(), + "Should get None when starting from 25", + ); + } + + #[test] + fn decode_elias_gamma() { + let operator: BitmapOperator = BitmapOperator::new(); + let bytes: &[u8; 2] = &[0b00000000, 0b00110110]; + let decoded_eg: EliasGammaDecoded = operator.decode_elias_gamma_entry(bytes, 6); + assert_eq!(decoded_eg.value, 27); + assert_eq!(decoded_eg.last_bit_index, 14); + } + + #[test] + fn decode_empty_elias_gamma() { + let operator: BitmapOperator = BitmapOperator::new(); + let bytes: &[u8; 2] = &[0b00000000, 0b00000000]; + let decoded_eg: EliasGammaDecoded = operator.decode_elias_gamma_entry(bytes, 0); + assert_eq!(decoded_eg.value, 0); + assert_eq!(decoded_eg.last_bit_index, 0); + } + + #[test] + fn decode_compressed_bitmap() { + let operator: BitmapOperator = BitmapOperator::new(); + assert_eq!(operator.decompress_bitmap(&[0b10100000]), &[0b11000000]); + assert_eq!(operator.decompress_bitmap(&[0b00100100]), &[0b00110000]); + assert_eq!(operator.decompress_bitmap(&[0b10010000]), &[0b11110000]); + assert_eq!( + operator.decompress_bitmap(&[0b10110010, 0b01000000]), + &[0b11100001] + ); + assert_eq!( + operator.decompress_bitmap(&[0b01010001, 0b01010000]), + &[0b01100000, 0b11000000] + ); + assert_eq!( + operator.decompress_bitmap(&[0b01111111, 0b11111111, 0b11111000]), + &[0b01010101, 0b01010101, 0b01010000] + ); + assert_eq!( + operator.decompress_bitmap(&[0b11010101, 0b11010101, 0b11010100]), + &[0b10010001, 0b00100010, 0b01000000] + ); + assert_eq!( + operator.decompress_bitmap(&[0b00000111, 0b11100000]), + &[0b00000000, 0b00000000, 0b00000000, 0b00000001] + ); + assert_eq!( + operator.decompress_bitmap(&[0b11000001, 0b11011011]), + &[ + 0b10000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, + 0b00001110 + ] + ); + } + + #[test] + fn merge_two_decompressed_bitmaps() { + let operator: BitmapOperator = BitmapOperator::new(); + let mut base_bitmap: Bitmap = Bitmap { + bitmap: vec![0b11001010, 0b10001111], + start_block_height: 10, + }; + let compressed_bitmap: Bitmap = Bitmap { + bitmap: vec![0b11100001], // Decompresses to 11100001 + start_block_height: 14, + }; + + assert!(operator + .merge_bitmap(&mut base_bitmap, &compressed_bitmap) + .is_ok()); + assert_eq!(base_bitmap.bitmap, vec![0b11001110, 0b10011111]); + } + + #[test] + fn merge_multiple_bitmaps_together() { + let operator: BitmapOperator = BitmapOperator::new(); + let test_bitmaps_to_merge: Vec = vec![ + Base64Bitmap { + base64: "oA==".to_string(), // Decompresses to 11000000 + start_block_height: 10, + }, + Base64Bitmap { + base64: "oA==".to_string(), + start_block_height: 14, + }, + Base64Bitmap { + base64: "oA==".to_string(), + start_block_height: 18, + }, + ]; + + let merged_bitmap = operator.merge_bitmaps(&test_bitmaps_to_merge, 10).unwrap(); + assert_eq!(merged_bitmap.bitmap, vec![0b11001100, 0b11000000]); + assert_eq!(merged_bitmap.start_block_height, 10); + } +} diff --git a/block-streamer/src/graphql/client.rs b/block-streamer/src/graphql/client.rs new file mode 100644 index 000000000..eca7cee80 --- /dev/null +++ b/block-streamer/src/graphql/client.rs @@ -0,0 +1,136 @@ +use ::reqwest; +use graphql_client::{GraphQLQuery, Response}; + +// TODO: Use Dataplatform account +const HASURA_ACCOUNT: &str = "darunrs_near"; + +#[allow(clippy::upper_case_acronyms)] +type Date = String; + +#[derive(GraphQLQuery)] +#[graphql( + schema_path = "graphql/darunrs_near/schema.graphql", + query_path = "graphql/darunrs_near/get_bitmaps_exact.graphql", + response_derives = "Debug", + normalization = "rust" +)] +struct GetBitmapsExact; + +#[derive(GraphQLQuery)] +#[graphql( + schema_path = "graphql/darunrs_near/schema.graphql", + query_path = "graphql/darunrs_near/get_bitmaps_wildcard.graphql", + response_derives = "Debug", + normalization = "rust" +)] +struct GetBitmapsWildcard; + +pub struct GraphQLClient { + client: reqwest::Client, + graphql_endpoint: String, +} + +#[cfg_attr(test, mockall::automock)] +impl GraphQLClient { + pub fn new(graphql_endpoint: String) -> Self { + Self { + client: reqwest::Client::new(), + graphql_endpoint, + } + } + + async fn post_graphql( + &self, + variables: Q::Variables, + ) -> Result, reqwest::Error> { + let body = Q::build_query(variables); + let reqwest_response = self + .client + .post(&self.graphql_endpoint) + .header("x-hasura-role", HASURA_ACCOUNT) + .json(&body) + .send() + .await?; + + reqwest_response.json().await + } + + pub async fn get_bitmaps_exact( + &self, + receiver_ids: Vec, + block_date: String, + limit: i64, + offset: i64, + ) -> anyhow::Result> + { + self.post_graphql::(get_bitmaps_exact::Variables { + receiver_ids: Some(receiver_ids), + block_date: Some(block_date), + limit: Some(limit), + offset: Some(offset), + }) + .await? + .data + .ok_or(anyhow::anyhow!("No bitmaps were returned")) + .map(|data| data.darunrs_near_bitmap_v5_actions_index) + } + + pub async fn get_bitmaps_wildcard( + &self, + receiver_ids: String, + block_date: String, + limit: i64, + offset: i64, + ) -> anyhow::Result> + { + self.post_graphql::(get_bitmaps_wildcard::Variables { + receiver_ids: Some(receiver_ids), + block_date: Some(block_date), + limit: Some(limit), + offset: Some(offset), + }) + .await? + .data + .ok_or(anyhow::anyhow!("No bitmaps were returned")) + .map(|data| data.darunrs_near_bitmap_v5_actions_index) + } +} + +// TODO: Remove Unit tests after bitmap query is integrated into the main application +#[cfg(test)] +mod tests { + use super::*; + + const HASURA_ENDPOINT: &str = + "https://queryapi-hasura-graphql-mainnet-vcqilefdcq-ew.a.run.app/v1/graphql"; + + #[tokio::test] + async fn test_get_bitmaps_exact() { + let client = GraphQLClient::new(HASURA_ENDPOINT.to_string()); + let receiver_ids = vec!["app.nearcrowd.near".to_string()]; + let block_date = "2024-03-21".to_string(); + let limit = 10; + let offset = 0; + let response = client + .get_bitmaps_exact(receiver_ids, block_date, limit, offset) + .await + .unwrap(); + assert_eq!(response[0].first_block_height, 115130287); + } + + // This query takes several seconds + #[ignore] + #[tokio::test] + async fn test_get_bitmaps_wildcard() { + let client = GraphQLClient::new(HASURA_ENDPOINT.to_string()); + let receiver_ids = "app.nearcrowd.near".to_string(); + let block_date = "2024-03-21".to_string(); + let limit = 10; + let offset = 0; + let response = client + .get_bitmaps_wildcard(receiver_ids, block_date, limit, offset) + .await + .unwrap(); + assert_eq!(response[0].first_block_height, 115130287); + } +} diff --git a/block-streamer/src/graphql/mod.rs b/block-streamer/src/graphql/mod.rs new file mode 100644 index 000000000..b9babe5bc --- /dev/null +++ b/block-streamer/src/graphql/mod.rs @@ -0,0 +1 @@ +pub mod client; diff --git a/block-streamer/src/main.rs b/block-streamer/src/main.rs index cee1c402f..d8e0a3c05 100644 --- a/block-streamer/src/main.rs +++ b/block-streamer/src/main.rs @@ -1,7 +1,9 @@ use tracing_subscriber::prelude::*; +mod bitmap; mod block_stream; mod delta_lake_client; +mod graphql; mod indexer_config; mod lake_s3_client; mod metrics; diff --git a/coordinator/Cargo.lock b/coordinator/Cargo.lock index d48755f5b..032dae9cf 100644 --- a/coordinator/Cargo.lock +++ b/coordinator/Cargo.lock @@ -369,6 +369,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + [[package]] name = "assert_matches" version = "1.5.0" @@ -860,6 +866,12 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64-simd" version = "0.8.0" @@ -917,10 +929,12 @@ dependencies = [ "async-trait", "aws-config", "aws-sdk-s3", + "base64 0.22.1", "borsh 0.10.3", "cached", "chrono", "futures", + "graphql_client", "lazy_static", "mockall", "near-lake-framework", @@ -928,6 +942,7 @@ dependencies = [ "prost 0.12.3", "redis 0.21.7", "registry-types", + "reqwest", "serde", "serde_json", "tokio", @@ -1218,6 +1233,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + [[package]] name = "combine" version = "4.6.6" @@ -1266,6 +1294,7 @@ dependencies = [ "near-jsonrpc-client", "near-jsonrpc-primitives", "near-primitives", + "prost 0.12.3", "redis 0.24.0", "registry-types", "runner", @@ -1273,6 +1302,7 @@ dependencies = [ "serde_json", "tokio", "tonic 0.10.2", + "tonic-build 0.10.2", "tracing", "tracing-subscriber", ] @@ -1930,6 +1960,65 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "graphql-introspection-query" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2a4732cf5140bd6c082434494f785a19cfb566ab07d1382c3671f5812fed6d" +dependencies = [ + "serde", +] + +[[package]] +name = "graphql-parser" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ebc8013b4426d5b81a4364c419a95ed0b404af2b82e2457de52d9348f0e474" +dependencies = [ + "combine 3.8.1", + "thiserror", +] + +[[package]] +name = "graphql_client" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a50cfdc7f34b7f01909d55c2dcb71d4c13cbcbb4a1605d6c8bd760d654c1144b" +dependencies = [ + "graphql_query_derive", + "reqwest", + "serde", + "serde_json", +] + +[[package]] +name = "graphql_client_codegen" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e27ed0c2cf0c0cc52c6bcf3b45c907f433015e580879d14005386251842fb0a" +dependencies = [ + "graphql-introspection-query", + "graphql-parser", + "heck 0.4.1", + "lazy_static", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 1.0.109", +] + +[[package]] +name = "graphql_query_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83febfa838f898cfa73dfaa7a8eb69ff3409021ac06ee94cfb3d622f6eeb1a97" +dependencies = [ + "graphql_client_codegen", + "proc-macro2", + "syn 1.0.109", +] + [[package]] name = "group" version = "0.12.1" @@ -3429,7 +3518,7 @@ dependencies = [ "arc-swap", "async-trait", "bytes", - "combine", + "combine 4.6.6", "futures", "futures-util", "itoa", @@ -3451,7 +3540,7 @@ dependencies = [ "arc-swap", "async-trait", "bytes", - "combine", + "combine 4.6.6", "futures", "futures-util", "itoa", @@ -3991,9 +4080,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smart-default" @@ -4681,6 +4770,15 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "unsafe-libyaml" version = "0.2.9" @@ -4740,6 +4838,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "vsimd" version = "0.8.0" diff --git a/coordinator/Cargo.toml b/coordinator/Cargo.toml index 93d8c77b2..a595dcf2f 100644 --- a/coordinator/Cargo.toml +++ b/coordinator/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] anyhow = "1.0.75" futures-util = "0.3.30" +prost = "0.12.3" redis = { version = "0.24", features = ["tokio-comp", "connection-manager"] } tokio = "1.28" tonic = "0.10.2" @@ -22,5 +23,8 @@ near-jsonrpc-client = "0.8.0" near-primitives = "0.20.0" near-jsonrpc-primitives = "0.20.0" +[build-dependencies] +tonic-build = "0.10" + [dev-dependencies] mockall = "0.11.4" diff --git a/coordinator/build.rs b/coordinator/build.rs new file mode 100644 index 000000000..8b42d7e8d --- /dev/null +++ b/coordinator/build.rs @@ -0,0 +1,5 @@ +fn main() -> Result<(), Box> { + tonic_build::compile_protos("proto/indexer_manager.proto")?; + + Ok(()) +} diff --git a/coordinator/proto/indexer_manager.proto b/coordinator/proto/indexer_manager.proto new file mode 100644 index 000000000..d82ca24fd --- /dev/null +++ b/coordinator/proto/indexer_manager.proto @@ -0,0 +1,47 @@ +syntax = "proto3"; + +package indexer; + +// The IndexerManager service provides RPCs to manage Indexer instances +service IndexerManager { + // Re-enable an existing Indexer + rpc Enable (IndexerRequest) returns (EnableIndexerResponse); + + // Disable an Indexer, preventing it from running + rpc Disable (IndexerRequest) returns (DisableIndexerResponse); + + // List all Indexer with their state + rpc List (Empty) returns (ListIndexersResponse); +} + +// Request message for managing Indexers +message IndexerRequest { + // Account ID which the indexer is defined under + string account_id = 1; + // Name of the indexer + string function_name = 2; +} + +// Response message for enabling Indexer +message EnableIndexerResponse { + bool success = 1; +} + +// Response message for disabling Indexer +message DisableIndexerResponse { + bool success = 1; +} + +// Reponse message for listing Indexers +message ListIndexersResponse { + repeated IndexerState indexers = 1; +} + +// Persisted state relevant to Indexer +message IndexerState { + string account_id = 1; + string function_name = 2; + bool enabled = 3; +} + +message Empty {} diff --git a/coordinator/src/block_streams/synchronise.rs b/coordinator/src/block_streams/synchronise.rs index 1766e7d9a..5a8af2ecb 100644 --- a/coordinator/src/block_streams/synchronise.rs +++ b/coordinator/src/block_streams/synchronise.rs @@ -1,8 +1,7 @@ -use std::cmp::Ordering; - use registry_types::StartBlock; use crate::indexer_config::IndexerConfig; +use crate::indexer_state::{IndexerStateManager, SyncStatus}; use crate::redis::RedisClient; use crate::registry::IndexerRegistry; @@ -10,36 +9,37 @@ use super::handler::{BlockStreamsHandler, StreamInfo}; pub async fn synchronise_block_streams( indexer_registry: &IndexerRegistry, + indexer_manager: &IndexerStateManager, redis_client: &RedisClient, block_streams_handler: &BlockStreamsHandler, ) -> anyhow::Result<()> { let mut active_block_streams = block_streams_handler.list().await?; - for (account_id, indexers) in indexer_registry.iter() { - for (function_name, indexer_config) in indexers.iter() { - let active_block_stream = active_block_streams - .iter() - .position(|stream| { - stream.account_id == *account_id && &stream.function_name == function_name - }) - .map(|index| active_block_streams.swap_remove(index)); - - let _ = synchronise_block_stream( - active_block_stream, - indexer_config, - redis_client, - block_streams_handler, + for indexer_config in indexer_registry.iter() { + let active_block_stream = active_block_streams + .iter() + .position(|stream| { + stream.account_id == *indexer_config.account_id + && stream.function_name == indexer_config.function_name + }) + .map(|index| active_block_streams.swap_remove(index)); + + let _ = synchronise_block_stream( + active_block_stream, + indexer_config, + indexer_manager, + redis_client, + block_streams_handler, + ) + .await + .map_err(|err| { + tracing::error!( + account_id = indexer_config.account_id.as_str(), + function_name = indexer_config.function_name, + version = indexer_config.get_registry_version(), + "failed to sync block stream: {err:?}" ) - .await - .map_err(|err| { - tracing::error!( - account_id = account_id.as_str(), - function_name, - version = indexer_config.get_registry_version(), - "failed to sync block stream: {err:?}" - ) - }); - } + }); } for unregistered_block_stream in active_block_streams { @@ -69,6 +69,7 @@ pub async fn synchronise_block_streams( async fn synchronise_block_stream( active_block_stream: Option, indexer_config: &IndexerConfig, + indexer_manager: &IndexerStateManager, redis_client: &RedisClient, block_streams_handler: &BlockStreamsHandler, ) -> anyhow::Result<()> { @@ -87,66 +88,32 @@ async fn synchronise_block_stream( .await?; } - let stream_status = get_stream_status(indexer_config, redis_client).await?; + let sync_status = indexer_manager + .get_block_stream_sync_status(indexer_config) + .await?; - clear_block_stream_if_needed(&stream_status, indexer_config, redis_client).await?; + clear_block_stream_if_needed(&sync_status, indexer_config, redis_client).await?; let start_block_height = - determine_start_block_height(&stream_status, indexer_config, redis_client).await?; - - tracing::info!( - "Starting new block stream starting at block {}", - start_block_height - ); + determine_start_block_height(&sync_status, indexer_config, redis_client).await?; block_streams_handler .start(start_block_height, indexer_config) .await?; - redis_client.set_stream_version(indexer_config).await?; + indexer_manager + .set_block_stream_synced(indexer_config) + .await?; Ok(()) } -#[derive(Debug, PartialEq, Eq)] -enum StreamStatus { - /// Stream version is synchronized with the registry - Synced, - /// Stream version does not match registry - Outdated, - /// No stream version, therefore new - New, -} - -async fn get_stream_status( - indexer_config: &IndexerConfig, - redis_client: &RedisClient, -) -> anyhow::Result { - let stream_version = redis_client.get_stream_version(indexer_config).await?; - - if stream_version.is_none() { - return Ok(StreamStatus::New); - } - - let stream_version = stream_version.unwrap(); - - match indexer_config.get_registry_version().cmp(&stream_version) { - Ordering::Equal => Ok(StreamStatus::Synced), - Ordering::Greater => Ok(StreamStatus::Outdated), - Ordering::Less => { - tracing::warn!("Found stream with version greater than registry, treating as outdated"); - - Ok(StreamStatus::Outdated) - } - } -} - async fn clear_block_stream_if_needed( - stream_status: &StreamStatus, + sync_status: &SyncStatus, indexer_config: &IndexerConfig, redis_client: &RedisClient, ) -> anyhow::Result<()> { - if matches!(stream_status, StreamStatus::Synced | StreamStatus::New) + if matches!(sync_status, SyncStatus::Synced | SyncStatus::New) || indexer_config.start_block == StartBlock::Continue { return Ok(()); @@ -158,21 +125,27 @@ async fn clear_block_stream_if_needed( } async fn determine_start_block_height( - stream_status: &StreamStatus, + sync_status: &SyncStatus, indexer_config: &IndexerConfig, redis_client: &RedisClient, ) -> anyhow::Result { - if stream_status == &StreamStatus::Synced { - tracing::info!("Resuming block stream"); + if sync_status == &SyncStatus::Synced { + let height = get_continuation_block_height(indexer_config, redis_client).await?; + + tracing::info!(height, "Resuming block stream"); - return get_continuation_block_height(indexer_config, redis_client).await; + return Ok(height); } - match indexer_config.start_block { + let height = match indexer_config.start_block { StartBlock::Latest => Ok(indexer_config.get_registry_version()), StartBlock::Height(height) => Ok(height), StartBlock::Continue => get_continuation_block_height(indexer_config, redis_client).await, - } + }?; + + tracing::info!(height, "Starting block stream"); + + Ok(height) } async fn get_continuation_block_height( @@ -196,7 +169,7 @@ mod tests { use registry_types::{Rule, Status}; #[tokio::test] - async fn resumes_stream_with_matching_redis_version() { + async fn resumes_previously_synced_stream() { let indexer_config = IndexerConfig { account_id: "morgs.near".parse().unwrap(), function_name: "test".to_string(), @@ -211,27 +184,28 @@ mod tests { start_block: StartBlock::Height(100), }; - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry::from(&[( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), )]); - let mut redis_client = RedisClient::default(); - redis_client - .expect_get_stream_version() + let mut mock_indexer_manager = IndexerStateManager::default(); + mock_indexer_manager + .expect_get_block_stream_sync_status() + .with(predicate::eq(indexer_config.clone())) + .returning(|_| Ok(SyncStatus::Synced)); + mock_indexer_manager + .expect_set_block_stream_synced() .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(Some(200))) + .returning(|_| Ok(())) .once(); + + let mut redis_client = RedisClient::default(); redis_client .expect_get_last_published_block() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(Some(500))) .once(); - redis_client - .expect_set_stream_version() - .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(())) - .once(); redis_client.expect_clear_block_stream().never(); let mut block_stream_handler = BlockStreamsHandler::default(); @@ -242,9 +216,14 @@ mod tests { .returning(|_, _| Ok(())) .once(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } #[tokio::test] @@ -262,24 +241,26 @@ mod tests { updated_at_block_height: Some(200), start_block: StartBlock::Latest, }; - let indexer_registry = HashMap::from([( + + let indexer_registry = IndexerRegistry::from(&[( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), )]); - let mut redis_client = RedisClient::default(); - redis_client - .expect_get_stream_version() + let mut mock_indexer_manager = IndexerStateManager::default(); + mock_indexer_manager + .expect_get_block_stream_sync_status() .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(Some(1))) - .once(); - redis_client - .expect_clear_block_stream() + .returning(|_| Ok(SyncStatus::Outdated)); + mock_indexer_manager + .expect_set_block_stream_synced() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(())) .once(); + + let mut redis_client = RedisClient::default(); redis_client - .expect_set_stream_version() + .expect_clear_block_stream() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(())) .once(); @@ -293,9 +274,14 @@ mod tests { .returning(|_, _| Ok(())) .once(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } #[tokio::test] @@ -313,24 +299,25 @@ mod tests { updated_at_block_height: Some(200), start_block: StartBlock::Height(100), }; - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry::from(&[( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), )]); - let mut redis_client = RedisClient::default(); - redis_client - .expect_get_stream_version() + let mut mock_indexer_manager = IndexerStateManager::default(); + mock_indexer_manager + .expect_get_block_stream_sync_status() .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(Some(1))) - .once(); - redis_client - .expect_clear_block_stream() + .returning(|_| Ok(SyncStatus::Outdated)); + mock_indexer_manager + .expect_set_block_stream_synced() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(())) .once(); + + let mut redis_client = RedisClient::default(); redis_client - .expect_set_stream_version() + .expect_clear_block_stream() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(())) .once(); @@ -344,9 +331,14 @@ mod tests { .returning(|_, _| Ok(())) .once(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } #[tokio::test] @@ -364,27 +356,28 @@ mod tests { updated_at_block_height: Some(200), start_block: StartBlock::Continue, }; - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry::from(&[( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), )]); - let mut redis_client = RedisClient::default(); - redis_client - .expect_get_stream_version() + let mut mock_indexer_manager = IndexerStateManager::default(); + mock_indexer_manager + .expect_get_block_stream_sync_status() + .with(predicate::eq(indexer_config.clone())) + .returning(|_| Ok(SyncStatus::Outdated)); + mock_indexer_manager + .expect_set_block_stream_synced() .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(Some(1))) + .returning(|_| Ok(())) .once(); + + let mut redis_client = RedisClient::default(); redis_client .expect_get_last_published_block() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(Some(100))) .once(); - redis_client - .expect_set_stream_version() - .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(())) - .once(); let mut block_stream_handler = BlockStreamsHandler::default(); block_stream_handler.expect_list().returning(|| Ok(vec![])); @@ -395,17 +388,24 @@ mod tests { .returning(|_, _| Ok(())) .once(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } #[tokio::test] async fn stops_stream_not_in_registry() { - let indexer_registry = HashMap::from([]); + let indexer_registry = IndexerRegistry::from(&[]); let redis_client = RedisClient::default(); + let mock_indexer_manager = IndexerStateManager::default(); + let mut block_stream_handler = BlockStreamsHandler::default(); block_stream_handler.expect_list().returning(|| { Ok(vec![block_streamer::StreamInfo { @@ -421,35 +421,44 @@ mod tests { .returning(|_| Ok(())) .once(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } #[tokio::test] - async fn ignores_stream_with_matching_registry_version() { - let indexer_registry = HashMap::from([( + async fn ignores_synced_stream() { + let indexer_config = IndexerConfig { + account_id: "morgs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 101, + updated_at_block_height: None, + start_block: StartBlock::Latest, + }; + let indexer_registry = IndexerRegistry::from(&[( "morgs.near".parse().unwrap(), - HashMap::from([( - "test".to_string(), - IndexerConfig { - account_id: "morgs.near".parse().unwrap(), - function_name: "test".to_string(), - code: String::new(), - schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: "queryapi.dataplatform.near".to_string(), - status: Status::Any, - }, - created_at_block_height: 101, - updated_at_block_height: None, - start_block: StartBlock::Latest, - }, - )]), + HashMap::from([("test".to_string(), indexer_config.clone())]), )]); let redis_client = RedisClient::default(); + let mut mock_indexer_manager = IndexerStateManager::default(); + mock_indexer_manager + .expect_get_block_stream_sync_status() + .with(predicate::eq(indexer_config.clone())) + .returning(|_| Ok(SyncStatus::Synced)); + let mut block_stream_handler = BlockStreamsHandler::default(); block_stream_handler.expect_list().returning(|| { Ok(vec![block_streamer::StreamInfo { @@ -462,13 +471,18 @@ mod tests { block_stream_handler.expect_stop().never(); block_stream_handler.expect_start().never(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } #[tokio::test] - async fn restarts_streams_when_registry_version_differs() { + async fn restarts_unsynced_streams() { let indexer_config = IndexerConfig { account_id: "morgs.near".parse().unwrap(), function_name: "test".to_string(), @@ -482,24 +496,25 @@ mod tests { updated_at_block_height: Some(199), start_block: StartBlock::Height(1000), }; - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry::from(&[( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), )]); - let mut redis_client = RedisClient::default(); - redis_client - .expect_get_stream_version() + let mut mock_indexer_manager = IndexerStateManager::default(); + mock_indexer_manager + .expect_get_block_stream_sync_status() .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(Some(101))) - .once(); - redis_client - .expect_clear_block_stream() + .returning(|_| Ok(SyncStatus::Outdated)); + mock_indexer_manager + .expect_set_block_stream_synced() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(())) .once(); + + let mut redis_client = RedisClient::default(); redis_client - .expect_set_stream_version() + .expect_clear_block_stream() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(())) .once(); @@ -524,13 +539,18 @@ mod tests { .returning(|_, _| Ok(())) .once(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } #[tokio::test] - async fn does_not_start_stream_without_last_published_block() { + async fn skips_stream_without_last_published_block() { let indexer_config = IndexerConfig { account_id: "morgs.near".parse().unwrap(), function_name: "test".to_string(), @@ -544,17 +564,18 @@ mod tests { updated_at_block_height: Some(200), start_block: StartBlock::Continue, }; - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry::from(&[( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), )]); - let mut redis_client = RedisClient::default(); - redis_client - .expect_get_stream_version() + let mut mock_indexer_manager = IndexerStateManager::default(); + mock_indexer_manager + .expect_get_block_stream_sync_status() .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(Some(101))) - .once(); + .returning(|_| Ok(SyncStatus::Outdated)); + + let mut redis_client = RedisClient::default(); redis_client .expect_get_last_published_block() .with(predicate::eq(indexer_config.clone())) @@ -566,13 +587,18 @@ mod tests { block_stream_handler.expect_stop().never(); block_stream_handler.expect_start().never(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } #[tokio::test] - async fn starts_block_stream_for_first_time() { + async fn starts_new_stream() { let indexer_config = IndexerConfig { account_id: "morgs.near".parse().unwrap(), function_name: "test".to_string(), @@ -586,23 +612,24 @@ mod tests { updated_at_block_height: None, start_block: StartBlock::Height(50), }; - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry::from(&[( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), )]); - let mut redis_client = RedisClient::default(); - redis_client - .expect_get_stream_version() + let mut mock_indexer_manager = IndexerStateManager::default(); + mock_indexer_manager + .expect_get_block_stream_sync_status() .with(predicate::eq(indexer_config.clone())) - .returning(|_| Ok(None)) - .once(); - redis_client - .expect_set_stream_version() + .returning(|_| Ok(SyncStatus::New)); + mock_indexer_manager + .expect_set_block_stream_synced() .with(predicate::eq(indexer_config.clone())) .returning(|_| Ok(())) .once(); + let redis_client = RedisClient::default(); + let mut block_stream_handler = BlockStreamsHandler::default(); block_stream_handler.expect_list().returning(|| Ok(vec![])); block_stream_handler.expect_stop().never(); @@ -612,8 +639,13 @@ mod tests { .returning(|_, _| Ok(())) .once(); - synchronise_block_streams(&indexer_registry, &redis_client, &block_stream_handler) - .await - .unwrap(); + synchronise_block_streams( + &indexer_registry, + &mock_indexer_manager, + &redis_client, + &block_stream_handler, + ) + .await + .unwrap(); } } diff --git a/coordinator/src/executors/synchronise.rs b/coordinator/src/executors/synchronise.rs index d274c8df2..2b22c8a93 100644 --- a/coordinator/src/executors/synchronise.rs +++ b/coordinator/src/executors/synchronise.rs @@ -3,40 +3,31 @@ use crate::registry::IndexerRegistry; use super::handler::{ExecutorInfo, ExecutorsHandler}; -const V1_EXECUTOR_VERSION: u64 = 0; - pub async fn synchronise_executors( indexer_registry: &IndexerRegistry, executors_handler: &ExecutorsHandler, ) -> anyhow::Result<()> { - let active_executors = executors_handler.list().await?; - - // Ignore V1 executors - let mut active_executors: Vec<_> = active_executors - .into_iter() - .filter(|executor| executor.version != V1_EXECUTOR_VERSION) - .collect(); - - for (account_id, indexers) in indexer_registry.iter() { - for (function_name, indexer_config) in indexers.iter() { - let active_executor = active_executors - .iter() - .position(|stream| { - stream.account_id == *account_id && &stream.function_name == function_name - }) - .map(|index| active_executors.swap_remove(index)); - - let _ = synchronise_executor(active_executor, indexer_config, executors_handler) - .await - .map_err(|err| { - tracing::error!( - account_id = account_id.as_str(), - function_name, - version = indexer_config.get_registry_version(), - "failed to sync executor: {err:?}" - ) - }); - } + let mut active_executors = executors_handler.list().await?; + + for indexer_config in indexer_registry.iter() { + let active_executor = active_executors + .iter() + .position(|stream| { + stream.account_id == *indexer_config.account_id + && stream.function_name == indexer_config.function_name + }) + .map(|index| active_executors.swap_remove(index)); + + let _ = synchronise_executor(active_executor, indexer_config, executors_handler) + .await + .map_err(|err| { + tracing::error!( + account_id = indexer_config.account_id.as_str(), + function_name = indexer_config.function_name, + version = indexer_config.get_registry_version(), + "failed to sync executor: {err:?}" + ) + }); } for unregistered_executor in active_executors { @@ -113,10 +104,10 @@ mod tests { updated_at_block_height: None, start_block: StartBlock::Height(100), }; - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry(HashMap::from([( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), - )]); + )])); let mut executors_handler = ExecutorsHandler::default(); executors_handler.expect_list().returning(|| Ok(vec![])); @@ -146,10 +137,10 @@ mod tests { updated_at_block_height: Some(2), start_block: StartBlock::Height(100), }; - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry(HashMap::from([( "morgs.near".parse().unwrap(), HashMap::from([("test".to_string(), indexer_config.clone())]), - )]); + )])); let mut executors_handler = ExecutorsHandler::default(); executors_handler.expect_list().returning(|| { @@ -180,7 +171,7 @@ mod tests { #[tokio::test] async fn ignores_executor_with_matching_registry_version() { - let indexer_registry = HashMap::from([( + let indexer_registry = IndexerRegistry(HashMap::from([( "morgs.near".parse().unwrap(), HashMap::from([( "test".to_string(), @@ -198,7 +189,7 @@ mod tests { start_block: StartBlock::Height(100), }, )]), - )]); + )])); let mut executors_handler = ExecutorsHandler::default(); executors_handler.expect_list().returning(|| { @@ -221,7 +212,7 @@ mod tests { #[tokio::test] async fn stops_executor_not_in_registry() { - let indexer_registry = HashMap::from([]); + let indexer_registry = IndexerRegistry::from(&[]); let mut executors_handler = ExecutorsHandler::default(); executors_handler.expect_list().returning(|| { diff --git a/coordinator/src/indexer_config.rs b/coordinator/src/indexer_config.rs index 1b2b95e21..a827c0f85 100644 --- a/coordinator/src/indexer_config.rs +++ b/coordinator/src/indexer_config.rs @@ -30,6 +30,10 @@ impl IndexerConfig { format!("{}:version", self.get_redis_stream_key()) } + pub fn get_state_key(&self) -> String { + format!("{}:state", self.get_full_name()) + } + pub fn get_registry_version(&self) -> u64 { self.updated_at_block_height .unwrap_or(self.created_at_block_height) diff --git a/coordinator/src/indexer_state.rs b/coordinator/src/indexer_state.rs new file mode 100644 index 000000000..a8d1eddb9 --- /dev/null +++ b/coordinator/src/indexer_state.rs @@ -0,0 +1,651 @@ +#![cfg_attr(test, allow(dead_code))] + +use std::cmp::Ordering; + +use crate::indexer_config::IndexerConfig; +use crate::redis::RedisClient; +use crate::registry::IndexerRegistry; + +#[derive(Debug, PartialEq, Eq)] +pub enum SyncStatus { + Synced, + Outdated, + New, +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +struct OldIndexerState { + block_stream_synced_at: Option, +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct IndexerState { + pub block_stream_synced_at: Option, + pub enabled: bool, +} + +impl Default for IndexerState { + fn default() -> Self { + Self { + block_stream_synced_at: None, + enabled: true, + } + } +} + +#[cfg(not(test))] +pub use IndexerStateManagerImpl as IndexerStateManager; +#[cfg(test)] +pub use MockIndexerStateManagerImpl as IndexerStateManager; + +pub struct IndexerStateManagerImpl { + redis_client: RedisClient, +} + +#[cfg_attr(test, mockall::automock)] +impl IndexerStateManagerImpl { + pub fn new(redis_client: RedisClient) -> Self { + Self { redis_client } + } + + pub async fn get_state(&self, indexer_config: &IndexerConfig) -> anyhow::Result { + let raw_state = self.redis_client.get_indexer_state(indexer_config).await?; + + if let Some(raw_state) = raw_state { + return Ok(serde_json::from_str(&raw_state)?); + } + + Ok(IndexerState::default()) + } + + async fn set_state( + &self, + indexer_config: &IndexerConfig, + state: IndexerState, + ) -> anyhow::Result<()> { + let raw_state = serde_json::to_string(&state)?; + + self.redis_client + .set_indexer_state(indexer_config, raw_state) + .await + } + + pub async fn set_enabled( + &self, + indexer_config: &IndexerConfig, + enabled: bool, + ) -> anyhow::Result<()> { + let mut indexer_state = self.get_state(indexer_config).await?; + indexer_state.enabled = enabled; + + self.set_state(indexer_config, indexer_state).await?; + + Ok(()) + } + + pub async fn filter_disabled_indexers( + &self, + indexer_registry: &IndexerRegistry, + ) -> anyhow::Result { + let mut filtered_registry = IndexerRegistry::new(); + + for indexer_config in indexer_registry.iter() { + let indexer_state = self.get_state(indexer_config).await?; + + if indexer_state.enabled { + filtered_registry + .0 + .entry(indexer_config.account_id.clone()) + .or_default() + .insert(indexer_config.function_name.clone(), indexer_config.clone()); + } + } + + Ok(filtered_registry) + } + + pub async fn migrate_state_if_needed( + &self, + indexer_registry: &IndexerRegistry, + ) -> anyhow::Result<()> { + if self.redis_client.is_migration_complete().await?.is_none() { + tracing::info!("Migrating indexer state"); + + for indexer_config in indexer_registry.iter() { + if let Some(version) = self.redis_client.get_stream_version(indexer_config).await? { + self.redis_client + .set_indexer_state( + indexer_config, + serde_json::to_string(&OldIndexerState { + block_stream_synced_at: Some(version), + })?, + ) + .await?; + } + } + + tracing::info!("Indexer state migration complete"); + + self.redis_client.set_migration_complete().await?; + } + + if self + .redis_client + .get::<_, bool>("state_migration:enabled_flag") + .await? + .is_none() + { + tracing::info!("Migrating enabled flag"); + + for indexer_config in indexer_registry.iter() { + let existing_state = self.redis_client.get_indexer_state(indexer_config).await?; + + let state = match existing_state { + Some(state) => { + let old_state: OldIndexerState = serde_json::from_str(&state)?; + IndexerState { + block_stream_synced_at: old_state.block_stream_synced_at, + enabled: true, + } + } + None => IndexerState::default(), + }; + + self.set_state(indexer_config, state).await?; + } + + self.redis_client + .set("state_migration:enabled_flag", true) + .await?; + + tracing::info!("Enabled flag migration complete"); + } + + Ok(()) + } + + pub async fn get_block_stream_sync_status( + &self, + indexer_config: &IndexerConfig, + ) -> anyhow::Result { + let indexer_state = self.get_state(indexer_config).await?; + + if indexer_state.block_stream_synced_at.is_none() { + return Ok(SyncStatus::New); + } + + match indexer_config + .get_registry_version() + .cmp(&indexer_state.block_stream_synced_at.unwrap()) + { + Ordering::Equal => Ok(SyncStatus::Synced), + Ordering::Greater => Ok(SyncStatus::Outdated), + Ordering::Less => { + tracing::warn!( + "Found stream with version greater than registry, treating as outdated" + ); + + Ok(SyncStatus::Outdated) + } + } + } + + pub async fn set_block_stream_synced( + &self, + indexer_config: &IndexerConfig, + ) -> anyhow::Result<()> { + let mut indexer_state = self.get_state(indexer_config).await?; + + indexer_state.block_stream_synced_at = Some(indexer_config.get_registry_version()); + + self.set_state(indexer_config, indexer_state).await?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use std::collections::HashMap; + + use mockall::predicate; + use registry_types::{Rule, StartBlock, Status}; + + #[tokio::test] + async fn filters_disabled_indexers() { + let morgs_config = IndexerConfig { + account_id: "morgs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: Some(200), + start_block: StartBlock::Height(100), + }; + let darunrs_config = IndexerConfig { + account_id: "darunrs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: None, + start_block: StartBlock::Height(100), + }; + + let indexer_registry = IndexerRegistry::from(&[ + ( + "morgs.near".parse().unwrap(), + HashMap::from([("test".to_string(), morgs_config.clone())]), + ), + ( + "darunrs.near".parse().unwrap(), + HashMap::from([("test".to_string(), darunrs_config.clone())]), + ), + ]); + + let mut mock_redis_client = RedisClient::default(); + mock_redis_client + .expect_get_indexer_state() + .with(predicate::eq(morgs_config.clone())) + .returning(|_| { + Ok(Some( + serde_json::json!({ "block_stream_synced_at": 200, "enabled": true }) + .to_string(), + )) + }) + .once(); + mock_redis_client + .expect_get_indexer_state() + .with(predicate::eq(darunrs_config.clone())) + .returning(|_| { + Ok(Some( + serde_json::json!({ "block_stream_synced_at": 1, "enabled": false }) + .to_string(), + )) + }) + .once(); + + let indexer_manager = IndexerStateManagerImpl::new(mock_redis_client); + + let filtered_registry = indexer_manager + .filter_disabled_indexers(&indexer_registry) + .await + .unwrap(); + + assert!(filtered_registry.contains_key(&morgs_config.account_id)); + } + + #[tokio::test] + async fn migrates_enabled_flag() { + let morgs_config = IndexerConfig { + account_id: "morgs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: Some(200), + start_block: StartBlock::Height(100), + }; + let darunrs_config = IndexerConfig { + account_id: "darunrs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: None, + start_block: StartBlock::Height(100), + }; + + let indexer_registry = IndexerRegistry::from(&[ + ( + "morgs.near".parse().unwrap(), + HashMap::from([("test".to_string(), morgs_config.clone())]), + ), + ( + "darunrs.near".parse().unwrap(), + HashMap::from([("test".to_string(), darunrs_config.clone())]), + ), + ]); + + let mut mock_redis_client = RedisClient::default(); + mock_redis_client + .expect_is_migration_complete() + .returning(|| Ok(Some(true))) + .times(2); + mock_redis_client + .expect_get::<&str, bool>() + .with(predicate::eq("state_migration:enabled_flag")) + .returning(|_| Ok(None)) + .once(); + mock_redis_client + .expect_get::<&str, bool>() + .with(predicate::eq("state_migration:enabled_flag")) + .returning(|_| Ok(Some(true))) + .once(); + mock_redis_client + .expect_get_indexer_state() + .with(predicate::eq(morgs_config.clone())) + .returning(|_| { + Ok(Some( + serde_json::json!({ "block_stream_synced_at": 200 }).to_string(), + )) + }) + .once(); + mock_redis_client + .expect_get_indexer_state() + .with(predicate::eq(darunrs_config.clone())) + .returning(|_| { + Ok(Some( + serde_json::json!({ "block_stream_synced_at": 1 }).to_string(), + )) + }) + .once(); + mock_redis_client + .expect_set_indexer_state() + .with( + predicate::eq(morgs_config), + predicate::eq( + serde_json::json!({ "block_stream_synced_at": 200, "enabled": true }) + .to_string(), + ), + ) + .returning(|_, _| Ok(())) + .once(); + mock_redis_client + .expect_set_indexer_state() + .with( + predicate::eq(darunrs_config), + predicate::eq( + serde_json::json!({ "block_stream_synced_at": 1, "enabled": true }).to_string(), + ), + ) + .returning(|_, _| Ok(())) + .once(); + mock_redis_client + .expect_set::<&str, bool>() + .with( + predicate::eq("state_migration:enabled_flag"), + predicate::eq(true), + ) + .returning(|_, _| Ok(())) + .once(); + + let indexer_manager = IndexerStateManagerImpl::new(mock_redis_client); + + indexer_manager + .migrate_state_if_needed(&indexer_registry) + .await + .unwrap(); + + // ensure it is only called once + indexer_manager + .migrate_state_if_needed(&indexer_registry) + .await + .unwrap(); + } + + #[tokio::test] + async fn migrates_state_to_indexer_manager() { + let morgs_config = IndexerConfig { + account_id: "morgs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: Some(200), + start_block: StartBlock::Height(100), + }; + let darunrs_config = IndexerConfig { + account_id: "darunrs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: None, + start_block: StartBlock::Height(100), + }; + + let indexer_registry = IndexerRegistry(HashMap::from([ + ( + "morgs.near".parse().unwrap(), + HashMap::from([("test".to_string(), morgs_config.clone())]), + ), + ( + "darunrs.near".parse().unwrap(), + HashMap::from([("test".to_string(), darunrs_config.clone())]), + ), + ])); + + let mut mock_redis_client = RedisClient::default(); + mock_redis_client + .expect_is_migration_complete() + .returning(|| Ok(None)) + .once(); + mock_redis_client + .expect_is_migration_complete() + .returning(|| Ok(Some(true))) + .once(); + mock_redis_client + .expect_get::<&str, _>() + .with(predicate::eq("state_migration:enabled_flag")) + .returning(|_| Ok(Some(true))); + mock_redis_client + .expect_set_migration_complete() + .returning(|| Ok(())) + .once(); + mock_redis_client + .expect_get_stream_version() + .with(predicate::eq(morgs_config.clone())) + .returning(|_| Ok(Some(200))) + .once(); + mock_redis_client + .expect_get_stream_version() + .with(predicate::eq(darunrs_config.clone())) + .returning(|_| Ok(Some(1))) + .once(); + mock_redis_client + .expect_set_indexer_state() + .with( + predicate::eq(morgs_config), + predicate::eq(serde_json::json!({ "block_stream_synced_at": 200 }).to_string()), + ) + .returning(|_, _| Ok(())) + .once(); + mock_redis_client + .expect_set_indexer_state() + .with( + predicate::eq(darunrs_config), + predicate::eq(serde_json::json!({ "block_stream_synced_at": 1 }).to_string()), + ) + .returning(|_, _| Ok(())) + .once(); + + let indexer_manager = IndexerStateManagerImpl::new(mock_redis_client); + + indexer_manager + .migrate_state_if_needed(&indexer_registry) + .await + .unwrap(); + + // ensure it is only called once + indexer_manager + .migrate_state_if_needed(&indexer_registry) + .await + .unwrap(); + } + + #[tokio::test] + pub async fn outdated_block_stream() { + let indexer_config = IndexerConfig { + account_id: "morgs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: Some(200), + start_block: StartBlock::Continue, + }; + + let mut redis_client = RedisClient::default(); + redis_client + .expect_get_indexer_state() + .with(predicate::eq(indexer_config.clone())) + .returning(|_| { + Ok(Some( + serde_json::json!({ "block_stream_synced_at": 300, "enabled": true }) + .to_string(), + )) + }); + + let indexer_manager = IndexerStateManagerImpl::new(redis_client); + let result = indexer_manager + .get_block_stream_sync_status(&indexer_config) + .await + .unwrap(); + + assert_eq!(result, SyncStatus::Outdated); + } + + #[tokio::test] + pub async fn synced_block_stream() { + let indexer_config = IndexerConfig { + account_id: "morgs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: Some(200), + start_block: StartBlock::Continue, + }; + + let mut redis_client = RedisClient::default(); + redis_client + .expect_get_indexer_state() + .with(predicate::eq(indexer_config.clone())) + .returning(|_| { + Ok(Some( + serde_json::json!({ "block_stream_synced_at": 200, "enabled": true }) + .to_string(), + )) + }); + + let indexer_manager = IndexerStateManagerImpl::new(redis_client); + let result = indexer_manager + .get_block_stream_sync_status(&indexer_config) + .await + .unwrap(); + + assert_eq!(result, SyncStatus::Synced); + } + + #[tokio::test] + pub async fn new_block_stream() { + let indexer_config = IndexerConfig { + account_id: "morgs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: None, + start_block: StartBlock::Continue, + }; + + let mut redis_client = RedisClient::default(); + redis_client + .expect_get_indexer_state() + .with(predicate::eq(indexer_config.clone())) + .returning(|_| Ok(None)); + + let indexer_manager = IndexerStateManagerImpl::new(redis_client); + let result = indexer_manager + .get_block_stream_sync_status(&indexer_config) + .await + .unwrap(); + + assert_eq!(result, SyncStatus::New); + } + + #[tokio::test] + pub async fn disable_indexer() { + let indexer_config = IndexerConfig { + account_id: "morgs.near".parse().unwrap(), + function_name: "test".to_string(), + code: String::new(), + schema: String::new(), + rule: Rule::ActionAny { + affected_account_id: "queryapi.dataplatform.near".to_string(), + status: Status::Any, + }, + created_at_block_height: 1, + updated_at_block_height: None, + start_block: StartBlock::Continue, + }; + + let mut redis_client = RedisClient::default(); + redis_client + .expect_get_indexer_state() + .with(predicate::eq(indexer_config.clone())) + .returning(|_| { + Ok(Some( + serde_json::json!({ "block_stream_synced_at": 123, "enabled": true }) + .to_string(), + )) + }); + redis_client + .expect_set_indexer_state() + .with( + predicate::eq(indexer_config.clone()), + predicate::eq( + serde_json::json!({ "block_stream_synced_at":123, "enabled": false }) + .to_string(), + ), + ) + .returning(|_, _| Ok(())) + .once(); + + let indexer_manager = IndexerStateManagerImpl::new(redis_client); + + indexer_manager + .set_enabled(&indexer_config.into(), false) + .await + .unwrap(); + } +} diff --git a/coordinator/src/main.rs b/coordinator/src/main.rs index 44f3787d6..f19d5e5e8 100644 --- a/coordinator/src/main.rs +++ b/coordinator/src/main.rs @@ -1,3 +1,4 @@ +use std::sync::Arc; use std::time::Duration; use near_primitives::types::AccountId; @@ -6,14 +7,17 @@ use tracing_subscriber::prelude::*; use crate::block_streams::{synchronise_block_streams, BlockStreamsHandler}; use crate::executors::{synchronise_executors, ExecutorsHandler}; +use crate::indexer_state::IndexerStateManager; use crate::redis::RedisClient; use crate::registry::Registry; mod block_streams; mod executors; mod indexer_config; +mod indexer_state; mod redis; mod registry; +mod server; mod utils; const CONTROL_LOOP_THROTTLE_SECONDS: Duration = Duration::from_secs(1); @@ -34,11 +38,7 @@ async fn main() -> anyhow::Result<()> { let block_streamer_url = std::env::var("BLOCK_STREAMER_URL").expect("BLOCK_STREAMER_URL is not set"); let runner_url = std::env::var("RUNNER_URL").expect("RUNNER_URL is not set"); - - let registry = Registry::connect(registry_contract_id.clone(), &rpc_url); - let redis_client = RedisClient::connect(&redis_url).await?; - let block_streams_handler = BlockStreamsHandler::connect(&block_streamer_url)?; - let executors_handler = ExecutorsHandler::connect(&runner_url)?; + let grpc_port = std::env::var("GRPC_PORT").expect("GRPC_PORT is not set"); tracing::info!( rpc_url, @@ -49,12 +49,37 @@ async fn main() -> anyhow::Result<()> { "Starting Coordinator" ); + let registry = Arc::new(Registry::connect(registry_contract_id.clone(), &rpc_url)); + let redis_client = RedisClient::connect(&redis_url).await?; + let block_streams_handler = BlockStreamsHandler::connect(&block_streamer_url)?; + let executors_handler = ExecutorsHandler::connect(&runner_url)?; + let indexer_state_manager = Arc::new(IndexerStateManager::new(redis_client.clone())); + + tokio::spawn({ + let indexer_state_manager = indexer_state_manager.clone(); + let registry = registry.clone(); + async move { server::init(grpc_port, indexer_state_manager, registry).await } + }); + loop { let indexer_registry = registry.fetch().await?; + indexer_state_manager + .migrate_state_if_needed(&indexer_registry) + .await?; + + let indexer_registry = indexer_state_manager + .filter_disabled_indexers(&indexer_registry) + .await?; + tokio::try_join!( synchronise_executors(&indexer_registry, &executors_handler), - synchronise_block_streams(&indexer_registry, &redis_client, &block_streams_handler), + synchronise_block_streams( + &indexer_registry, + &indexer_state_manager, + &redis_client, + &block_streams_handler + ), async { sleep(CONTROL_LOOP_THROTTLE_SECONDS).await; Ok(()) diff --git a/coordinator/src/redis.rs b/coordinator/src/redis.rs index d6b635b5e..e750776f5 100644 --- a/coordinator/src/redis.rs +++ b/coordinator/src/redis.rs @@ -12,11 +12,11 @@ pub use MockRedisClientImpl as RedisClient; #[cfg(not(test))] pub use RedisClientImpl as RedisClient; +#[derive(Clone)] pub struct RedisClientImpl { connection: ConnectionManager, } -#[cfg_attr(test, mockall::automock)] impl RedisClientImpl { pub async fn connect(redis_url: &str) -> anyhow::Result { let connection = redis::Client::open(redis_url)? @@ -93,11 +93,71 @@ impl RedisClientImpl { self.del(indexer_config.get_redis_stream_key()).await } - pub async fn set_stream_version(&self, indexer_config: &IndexerConfig) -> anyhow::Result<()> { - self.set( - indexer_config.get_redis_stream_version_key(), - indexer_config.get_registry_version(), - ) - .await + pub async fn get_indexer_state( + &self, + indexer_config: &IndexerConfig, + ) -> anyhow::Result> { + self.get(indexer_config.get_state_key()).await + } + + pub async fn set_indexer_state( + &self, + indexer_config: &IndexerConfig, + state: String, + ) -> anyhow::Result<()> { + self.set(indexer_config.get_state_key(), state).await + } + + pub async fn set_migration_complete(&self) -> anyhow::Result<()> { + self.set("indexer_manager_migration_complete", true).await + } + + pub async fn is_migration_complete(&self) -> anyhow::Result> { + self.get("indexer_manager_migration_complete").await + } +} + +#[cfg(test)] +mockall::mock! { + pub RedisClientImpl { + pub async fn connect(redis_url: &str) -> anyhow::Result; + + pub async fn get_indexer_state(&self, indexer_config: &IndexerConfig) -> anyhow::Result>; + + pub async fn set_indexer_state( + &self, + indexer_config: &IndexerConfig, + state: String, + ) -> anyhow::Result<()>; + + pub async fn get_stream_version( + &self, + indexer_config: &IndexerConfig, + ) -> anyhow::Result>; + + pub async fn get_last_published_block( + &self, + indexer_config: &IndexerConfig, + ) -> anyhow::Result>; + + pub async fn clear_block_stream(&self, indexer_config: &IndexerConfig) -> anyhow::Result<()>; + + pub async fn set_migration_complete(&self) -> anyhow::Result<()>; + + pub async fn is_migration_complete(&self) -> anyhow::Result>; + + pub async fn get(&self, key: T) -> anyhow::Result> + where + T: ToRedisArgs + Debug + Send + Sync + 'static, + U: FromRedisValue + Debug + 'static; + + pub async fn set(&self, key: K, value: V) -> anyhow::Result<()> + where + K: ToRedisArgs + Debug + Send + Sync + 'static, + V: ToRedisArgs + Debug + Send + Sync + 'static; + } + + impl Clone for RedisClientImpl { + fn clone(&self) -> Self; } } diff --git a/coordinator/src/registry.rs b/coordinator/src/registry.rs index 92c45046b..8b09d8b10 100644 --- a/coordinator/src/registry.rs +++ b/coordinator/src/registry.rs @@ -1,6 +1,7 @@ #![cfg_attr(test, allow(dead_code))] use anyhow::Context; +use std::collections::hash_map::Iter; use std::collections::HashMap; use near_jsonrpc_client::methods::query::RpcQueryRequest; @@ -13,7 +14,58 @@ use registry_types::AllIndexers; use crate::indexer_config::IndexerConfig; use crate::utils::exponential_retry; -pub type IndexerRegistry = HashMap>; +pub struct IndexerRegistry(pub HashMap>); + +impl IndexerRegistry { + #[cfg(test)] + pub fn from(slice: &[(AccountId, HashMap)]) -> Self { + Self(slice.iter().cloned().collect()) + } + + pub fn new() -> Self { + Self(HashMap::new()) + } + + pub fn iter(&self) -> IndexerRegistryIter { + IndexerRegistryIter { + account_iter: self.0.iter(), + function_iter: None, + } + } +} + +pub struct IndexerRegistryIter<'a> { + account_iter: Iter<'a, AccountId, HashMap>, + function_iter: Option>, +} + +impl<'a> Iterator for IndexerRegistryIter<'a> { + type Item = &'a IndexerConfig; + + fn next(&mut self) -> Option { + loop { + if let Some(ref mut function_iter) = self.function_iter { + if let Some((_function_name, indexer_config)) = function_iter.next() { + return Some(indexer_config); + } + } + + match self.account_iter.next() { + Some((_account_id, function_iter)) => { + self.function_iter = Some(function_iter.iter()) + } + None => return None, + } + } + } +} + +impl std::ops::Deref for IndexerRegistry { + type Target = HashMap>; + fn deref(&self) -> &Self::Target { + &self.0 + } +} #[cfg(test)] pub use MockRegistryImpl as Registry; @@ -28,6 +80,7 @@ pub struct RegistryImpl { #[cfg_attr(test, mockall::automock)] impl RegistryImpl { const LIST_METHOD: &'static str = "list_all"; + const GET_METHOD: &'static str = "read_indexer_function"; pub fn connect(registry_contract_id: AccountId, rpc_url: &str) -> Self { let json_rpc_client = JsonRpcClient::connect(rpc_url); @@ -42,31 +95,33 @@ impl RegistryImpl { &self, registry: HashMap>, ) -> IndexerRegistry { - registry - .into_iter() - .map(|(account_id, indexers)| { - let indexers = indexers - .into_iter() - .map(|(function_name, indexer)| { - ( - function_name.to_owned(), - IndexerConfig { - account_id: account_id.clone(), - function_name, - code: indexer.code, - start_block: indexer.start_block, - schema: indexer.schema, - rule: indexer.rule, - updated_at_block_height: indexer.updated_at_block_height, - created_at_block_height: indexer.created_at_block_height, - }, - ) - }) - .collect::>(); - - (account_id, indexers) - }) - .collect::>() + IndexerRegistry( + registry + .into_iter() + .map(|(account_id, indexers)| { + let indexers = indexers + .into_iter() + .map(|(function_name, indexer)| { + ( + function_name.to_owned(), + IndexerConfig { + account_id: account_id.clone(), + function_name, + code: indexer.code, + start_block: indexer.start_block, + schema: indexer.schema, + rule: indexer.rule, + updated_at_block_height: indexer.updated_at_block_height, + created_at_block_height: indexer.created_at_block_height, + }, + ) + }) + .collect::>(); + + (account_id, indexers) + }) + .collect::>(), + ) } pub async fn fetch(&self) -> anyhow::Result { @@ -94,4 +149,49 @@ impl RegistryImpl { }) .await } + + pub async fn fetch_indexer( + &self, + account_id: AccountId, + function_name: String, + ) -> anyhow::Result { + let response = self + .json_rpc_client + .call(RpcQueryRequest { + block_reference: BlockReference::Finality(Finality::Final), + request: QueryRequest::CallFunction { + method_name: Self::GET_METHOD.to_string(), + account_id: self.registry_contract_id.clone(), + args: FunctionArgs::from( + serde_json::json!({ + "account_id": account_id, + "function_name": function_name, + }) + .to_string() + .as_bytes() + .to_vec(), + ), + }, + }) + .await + .context("Failed to fetch indexer")?; + + if let QueryResponseKind::CallResult(call_result) = response.kind { + let indexer: registry_types::IndexerConfig = + serde_json::from_slice(&call_result.result)?; + + return Ok(IndexerConfig { + account_id: account_id.clone(), + function_name: function_name.to_string(), + code: indexer.code, + schema: indexer.schema, + rule: indexer.rule, + start_block: indexer.start_block, + updated_at_block_height: indexer.updated_at_block_height, + created_at_block_height: indexer.created_at_block_height, + }); + } + + anyhow::bail!("Invalid registry response") + } } diff --git a/coordinator/src/server/indexer_manager_service.rs b/coordinator/src/server/indexer_manager_service.rs new file mode 100644 index 000000000..36a91ca31 --- /dev/null +++ b/coordinator/src/server/indexer_manager_service.rs @@ -0,0 +1,127 @@ +use std::sync::Arc; + +use tonic::{Request, Response, Status}; + +use crate::indexer_state::IndexerStateManager; +use crate::registry::Registry; +use crate::server::indexer_manager; + +pub struct IndexerManagerService { + indexer_state_manager: Arc, + registry: Arc, +} + +impl IndexerManagerService { + pub fn new(indexer_state_manager: Arc, registry: Arc) -> Self { + Self { + indexer_state_manager, + registry, + } + } +} + +#[tonic::async_trait] +impl indexer_manager::indexer_manager_server::IndexerManager for IndexerManagerService { + #[tracing::instrument( + skip_all, + fields( + account_id = request.get_ref().account_id, + function_name = request.get_ref().function_name + ) + )] + async fn enable( + &self, + request: Request, + ) -> Result, Status> { + let request = request.into_inner(); + + let account_id = request + .account_id + .parse() + .map_err(|_| Status::invalid_argument("Invalid account ID"))?; + + let indexer_config = self + .registry + .fetch_indexer(account_id, request.function_name) + .await + .map_err(|_| Status::not_found("Indexer not found"))?; + + self.indexer_state_manager + .set_enabled(&indexer_config, true) + .await + .map_err(|_| Status::internal("Failed to enable indexer"))?; + + tracing::info!("Enabled indexer"); + + Ok(Response::new(indexer_manager::EnableIndexerResponse { + success: true, + })) + } + + #[tracing::instrument( + skip_all, + fields( + account_id = request.get_ref().account_id, + function_name = request.get_ref().function_name + ) + )] + async fn disable( + &self, + request: Request, + ) -> Result, Status> { + let request = request.into_inner(); + + let account_id = request + .account_id + .parse() + .map_err(|_| Status::invalid_argument("Invalid account ID"))?; + + let indexer_config = self + .registry + .fetch_indexer(account_id, request.function_name) + .await + .map_err(|_| Status::not_found("Indexer not found"))?; + + self.indexer_state_manager + .set_enabled(&indexer_config, false) + .await + .map_err(|_| Status::internal("Failed to disable indexer"))?; + + tracing::info!("Disabled indexer"); + + Ok(Response::new(indexer_manager::DisableIndexerResponse { + success: true, + })) + } + + async fn list( + &self, + _request: Request, + ) -> Result, Status> { + let regsitry = self + .registry + .fetch() + .await + .map_err(|_| Status::internal("Failed to fetch registry"))?; + + let mut indexers = vec![]; + + for indexer_config in regsitry.iter() { + let state = self + .indexer_state_manager + .get_state(indexer_config) + .await + .unwrap(); + + indexers.push(indexer_manager::IndexerState { + account_id: indexer_config.account_id.to_string(), + function_name: indexer_config.function_name.clone(), + enabled: state.enabled, + }); + } + + Ok(Response::new(indexer_manager::ListIndexersResponse { + indexers, + })) + } +} diff --git a/coordinator/src/server/mod.rs b/coordinator/src/server/mod.rs new file mode 100644 index 000000000..f0922454b --- /dev/null +++ b/coordinator/src/server/mod.rs @@ -0,0 +1,32 @@ +use std::sync::Arc; + +use crate::indexer_state::IndexerStateManager; +use crate::registry::Registry; + +mod indexer_manager_service; + +pub mod indexer_manager { + tonic::include_proto!("indexer"); +} + +pub async fn init( + port: String, + indexer_state_manager: Arc, + registry: Arc, +) -> anyhow::Result<()> { + let addr = format!("0.0.0.0:{}", port).parse()?; + + tracing::info!("Starting gRPC server on {}", addr); + + let indexer_manager_service = + indexer_manager_service::IndexerManagerService::new(indexer_state_manager, registry); + + let indexer_manager_server = + indexer_manager::indexer_manager_server::IndexerManagerServer::new(indexer_manager_service); + + tonic::transport::Server::builder() + .add_service(indexer_manager_server) + .serve(addr) + .await + .map_err(Into::into) +} diff --git a/docker-compose.yml b/docker-compose.yml index 6ee04e5a0..2f181072f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -34,6 +34,7 @@ services: REGISTRY_CONTRACT_ID: dev-queryapi.dataplatform.near RUST_LOG: info RPC_URL: https://archival-rpc.mainnet.near.org + GRPC_PORT: 9003 runner: build: diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json index e09cca0f6..9a223680a 100644 --- a/frontend/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -4,6 +4,8 @@ // "plugin:react/recommended", // "plugin:react-hooks/recommended", // "next/core-web-vitals" + // "eslint:recommended", + // "plugin:@typescript-eslint/recommended" ], "parser": "@typescript-eslint/parser", "env": { @@ -24,8 +26,8 @@ "project": "./tsconfig.json" }, "rules": { - "@typescript-eslint/semi": ["error", "always"], - "@typescript-eslint/comma-dangle": ["error", "only-multiline"], + // "@typescript-eslint/semi": ["error", "always"], + // "@typescript-eslint/comma-dangle": ["error", "only-multiline"], "@typescript-eslint/strict-boolean-expressions": "off" } } diff --git a/frontend/jest.config.js b/frontend/jest.config.js index beabbcbd5..a3232b2d4 100644 --- a/frontend/jest.config.js +++ b/frontend/jest.config.js @@ -1,4 +1,4 @@ -// jest.config.js +/* eslint-disable */ module.exports = { testEnvironment: 'node', moduleNameMapper: { @@ -12,4 +12,4 @@ module.exports = { '/formatters\\.test\\.js', '/Editor\\.test\\.js', ], -}; \ No newline at end of file +}; diff --git a/frontend/package.json b/frontend/package.json index df60000d4..6e2249ef2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,7 +10,9 @@ "serve:widgets:dev": "bos-loader dev-queryapi.dataplatform.near --path widgets/src -r replacement.dev.json", "build": "next build", "start": "next start", - "lint": "next lint" + "type-check": "tsc", + "lint": "eslint .", + "lint-fix": "eslint . --fix" }, "dependencies": { "@apollo/client": "^3.8.7", @@ -19,8 +21,8 @@ "@monaco-editor/react": "^4.1.3", "@near-lake/primitives": "0.4.0", "@next/font": "13.5.3", - "@types/node": "18.18.1", - "@types/react": "18.2.23", + "@types/node": "^20.12.12", + "@types/react": "^18.3.2", "@types/react-dom": "18.0.10", "bootstrap": "^5.2.3", "buffer": "^6.0.3", @@ -51,15 +53,17 @@ "@babel/preset-env": "^7.23.9", "@babel/preset-react": "^7.23.3", "@babel/register": "^7.23.7", + "@typescript-eslint/eslint-plugin": "^7.9.0", + "@typescript-eslint/parser": "^7.9.0", "autoprefixer": "^10.4.17", "babel-jest": "^29.7.0", - "eslint": "8.50.0", + "eslint": "^8.56.0", "eslint-config-next": "13.5.3", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.7.0", "postcss": "^8.4.33", "tailwindcss": "^3.4.1", - "typescript": "4.9.5" + "typescript": "^5.4.5" } } diff --git a/frontend/primitives.d.ts b/frontend/primitives.d.ts index 0c09a35af..90299f83d 100644 --- a/frontend/primitives.d.ts +++ b/frontend/primitives.d.ts @@ -6,7 +6,7 @@ function _mergeNamespaces(n, m) { m.forEach(function (e) { e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) { if (k !== 'default' && !(k in n)) { - var d = Object.getOwnPropertyDescriptor(e, k); + const d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } @@ -281,8 +281,8 @@ type StateChangeWithCauseView = { }; type Log = { - log: String; - relatedReceiptId: String; + log: string; + relatedReceiptId: string; }; /** * This structure is an ephemeral entity to provide access to the [Events Standard](https://github.com/near/NEPs/blob/master/neps/nep-0297.md) structure and keep data about the related `Receipt` for convenience. @@ -803,7 +803,7 @@ declare class BlockHeader { declare const fromBorsh: (schema: borsh.Schema, encoded: Uint8Array) => borsh_lib_types_types.DecodeTypes; -var fromBorsh$1 = /*#__PURE__*/_mergeNamespaces({ +const fromBorsh$1 = /*#__PURE__*/_mergeNamespaces({ __proto__: null, fromBorsh: fromBorsh }, [borsher]) as { fromBorsh: typeof fromBorsh }; diff --git a/frontend/replacement.dev.json b/frontend/replacement.dev.json index bb9ba4ec9..1a233cb9d 100644 --- a/frontend/replacement.dev.json +++ b/frontend/replacement.dev.json @@ -3,4 +3,4 @@ "REPL_GRAPHQL_ENDPOINT": "https://near-queryapi.dev.api.pagoda.co", "REPL_EXTERNAL_APP_URL": "https://queryapi-frontend-vcqilefdcq-ew.a.run.app", "REPL_REGISTRY_CONTRACT_ID": "dev-queryapi.dataplatform.near" -} \ No newline at end of file +} diff --git a/frontend/src/components/Editor/BlockPicker.jsx b/frontend/src/components/Editor/BlockPicker.jsx deleted file mode 100644 index 3602d9ffe..000000000 --- a/frontend/src/components/Editor/BlockPicker.jsx +++ /dev/null @@ -1,110 +0,0 @@ -import React, { useState } from "react"; -import { - OverlayTrigger, - Tooltip, - Button, - InputGroup, - FormControl, - Dropdown, - ButtonGroup, -} from "react-bootstrap"; - -import { Play, Plus, Stop } from "react-bootstrap-icons"; - -export const BlockPicker = ({ - heights = [], - setHeights, - executeIndexerFunction, - latestHeight, - isExecuting, - stopExecution, -}) => { - const [inputValue, setInputValue] = useState(String(latestHeight)); - - const addHeight = () => { - if (heights.length < 10 && inputValue !== "") { - setHeights([...heights, inputValue]); - setInputValue(""); - } - }; - - return ( -
-
- - setInputValue(e.target.value)} - /> - {isExecuting === true && - Stop Indexer Execution} - > - - - } - {!isExecuting && (<> Add Block To Debug List} - > - - - - - { - (() => { - if (heights.length > 0) { - return "Test Indexer Function With Debug List" - } else if (inputValue) { - return "Test Indexer Function With Specific Block" - } else { - return "Follow the Tip of the Network" - } - })() - } - } - > - - - - - - executeIndexerFunction("latest")}>Follow The Network - executeIndexerFunction("debugList")}>Execute From Debug List - - - ) - } - - - -
-
- ); -}; diff --git a/frontend/src/components/Editor/Editor.jsx b/frontend/src/components/Editor/Editor.jsx index 57ff65010..bc18aa460 100644 --- a/frontend/src/components/Editor/Editor.jsx +++ b/frontend/src/components/Editor/Editor.jsx @@ -17,7 +17,9 @@ import { block_details } from "./block_details"; import ResizableLayoutEditor from "./ResizableLayoutEditor"; import { ResetChangesModal } from "../Modals/resetChanges"; import { FileSwitcher } from "./FileSwitcher"; -import EditorButtons from "./EditorButtons"; +import EditorMenuContainer from "./EditorViewContainer/EditorMenuContainer" +import DeveloperToolsContainer from "./EditorViewContainer/DeveloperToolsContainer"; + import { PublishModal } from "../Modals/PublishModal"; import { ForkIndexerModal } from "../Modals/ForkIndexerModal"; import { getLatestBlockHeight } from "../../utils/getLatestBlockHeight"; @@ -32,6 +34,7 @@ import { InfoModal } from "@/core/InfoModal"; import { useModal } from "@/contexts/ModalContext"; import { GlyphContainer } from "./GlyphContainer"; + const Editor = ({ actionButtonText }) => { const { indexerDetails, @@ -199,7 +202,7 @@ const Editor = ({ actionButtonText }) => { if (newDisposable != null) { console.log("Types successfully imported to Editor"); } - + disposableRef.current = newDisposable; } }; @@ -234,13 +237,17 @@ const Editor = ({ actionButtonText }) => { /getBlock\s*\([^)]*\)\s*{([\s\S]*)}/ )[1]; indexerName = indexerName.replaceAll(" ", "_"); + let forkedFrom = + (indexerDetails.forkedAccountId && indexerDetails.forkedIndexerName) + ? { account_id: indexerDetails.forkedAccountId, function_name: indexerDetails.forkedIndexerName } + : null; const startBlock = - indexerConfig.startBlock === "startBlockHeight" - ? { HEIGHT: indexerConfig.height } - : indexerConfig.startBlock === "startBlockLatest" - ? "LATEST" - : "CONTINUE"; + indexerConfig.startBlock === "startBlockHeight" + ? { HEIGHT: indexerConfig.height } + : indexerConfig.startBlock === "startBlockLatest" + ? "LATEST" + : "CONTINUE"; if (schemaValidationError?.type === FORMATTING_ERROR_TYPE) { setError(SCHEMA_FORMATTING_ERROR_MESSAGE); @@ -252,6 +259,7 @@ const Editor = ({ actionButtonText }) => { schema: validatedSchema, startBlock, contractFilter: indexerConfig.filter, + forkedFrom, }); return; } @@ -262,6 +270,7 @@ const Editor = ({ actionButtonText }) => { schema: validatedSchema, startBlock, contractFilter: indexerConfig.filter, + ...(forkedFrom && { forkedFrom }) }); setShowPublishModal(false); @@ -458,14 +467,17 @@ const Editor = ({ actionButtonText }) => { }} > {!indexerDetails.code && !isCreateNewIndexer && ( - - Indexer Function could not be found. Are you sure this indexer - exists? + + Indexer Function could not be found. Are you sure this indexer exists? + )} {(indexerDetails.code || isCreateNewIndexer) && ( <> - { isUserIndexer={indexerDetails.accountId === currentUserAccountId} handleDeleteIndexer={handleDeleteIndexer} /> + indexerRunner.stop()} + latestHeight={height} + isUserIndexer={indexerDetails.accountId === currentUserAccountId} + handleDeleteIndexer={handleDeleteIndexer} + + fileName={fileName} + setFileName={setFileName} + diffView={diffView} + setDiffView={setDiffView} + /> + { setError()} - className="px-3 pt-3" + className="px-4 py-3 mb-4 font-semibold text-red-700 text-sm text-center border border-red-300 bg-red-50 rounded-lg shadow-md" variant="danger" > {error} @@ -508,13 +540,12 @@ const Editor = ({ actionButtonText }) => { )} {debugMode && !debugModeInfoDisabled && ( setDebugModeInfoDisabled(true)} variant="info" > - To debug, you will need to open your browser console window in - order to see the logs. + To debug, you will need to open your browser console window in order to see the logs. )} { - - const { - indexerName, - accountId, - indexerDetails, - setShowPublishModal, - setShowResetCodeModel, - setShowForkIndexerModal, - debugMode, - isCreateNewIndexer, - setShowLogsView, - } = useContext(IndexerDetailsContext); - - const removeHeight = (index) => { - setHeights(heights.filter((_, i) => i !== index)); - }; - - return ( - <> - - - - - - - {accountId} - - {indexerName && ( - - {indexerName} - - )} - - {!isCreateNewIndexer && - Contract Filter - - - Please provide a valid contract name. - - } - - - {debugMode && ( - - )} - - - - {isUserIndexer && !isCreateNewIndexer && ( - <> - Delete Indexer} - > - - - Fork this Indexer} - > - - - - )} - - {!isCreateNewIndexer && ( - Open Logs} - > - - - )} - {(!isUserIndexer && !isCreateNewIndexer) ? ( - Fork Indexer} - > - - - ) : ( - Publish} - > - - - )} - - - - Reset Changes To Code} - > - - - Format Code} - > - - - Generate Types} - > - - - - - - - {debugMode && heights.length > 0 && ( - -
- {heights.map((height, index) => ( - - {height} - removeHeight(index)} - /> - - ))} -
-
- )} -
-
- - ); -}; - -export default EditorButtons; \ No newline at end of file diff --git a/frontend/src/components/Editor/EditorView/BlockPickerView.jsx b/frontend/src/components/Editor/EditorView/BlockPickerView.jsx new file mode 100644 index 000000000..1e0e79bb9 --- /dev/null +++ b/frontend/src/components/Editor/EditorView/BlockPickerView.jsx @@ -0,0 +1,85 @@ +import { Plus, Play, PersonWalking, Check2, Stop } from "react-bootstrap-icons"; + +const BlockPickerView = ({ + heights, + inputValue, + setInputValue, + isExecuting, + addHeight, + stopExecution, + executeIndexerFunction, +}) => ( +
+
+ setInputValue(e.target.value)} + /> + {isExecuting ? ( + + ) : ( + <> + +
+ +
+ + +
+
+ + )} +
+
+ + + +); + +export default BlockPickerView; diff --git a/frontend/src/components/Editor/EditorView/DeveloperToolsView.jsx b/frontend/src/components/Editor/EditorView/DeveloperToolsView.jsx new file mode 100644 index 000000000..cf713af07 --- /dev/null +++ b/frontend/src/components/Editor/EditorView/DeveloperToolsView.jsx @@ -0,0 +1,122 @@ +import { useState } from "react"; +import { ArrowCounterclockwise, Justify, Code } from "react-bootstrap-icons"; +import BlockPickerContainer from "../EditorViewContainer/BlockPickerContainer"; + +const DeveloperToolsView = ({ + handleFormating, + handleCodeGen, + setShowResetCodeModel, + debugMode, + setDebugMode, + heights, + setHeights, + latestHeight, + isExecuting, + stopExecution, + removeHeight, + executeIndexerFunction, + diffView, + setDiffView, +}) => { + const [hoveredIndex, setHoveredIndex] = useState(null); + + return ( +
+
+ Developer Tools +
+
+
+ + + + + +
+ +
+ Diff View + { + setDiffView(e.target.checked); + }} + /> +
+
+ Debug Mode + { + setDebugMode(e.target.checked); + }} + /> +
+
+ +
+ {debugMode && ( + <> + {typeof debugMode === 'boolean' && debugMode && ( +
+ +
+ )} + + )} +
+
+ {debugMode && heights.length > 0 && ( +
+
+

+ Selected Block Heights: [ + + {heights.map((height, index) => ( + removeHeight(index)} + onMouseEnter={() => setHoveredIndex(index)} + onMouseLeave={() => setHoveredIndex(null)} + style={{ + color: index === hoveredIndex ? "#EF4444" : "", + }} + > + {height} + {index !== heights.length - 1 && ", "} + + ))} + + ] +

+
+
+ + )} +
+ + ); +}; + +export default DeveloperToolsView; diff --git a/frontend/src/components/Editor/EditorView/EditorMenuView.jsx b/frontend/src/components/Editor/EditorView/EditorMenuView.jsx new file mode 100644 index 000000000..01e5fdb36 --- /dev/null +++ b/frontend/src/components/Editor/EditorView/EditorMenuView.jsx @@ -0,0 +1,72 @@ +import React from "react"; +import { Navbar, Container, InputGroup, Form, ButtonGroup, Button } from 'react-bootstrap'; +import { Braces, ArrowCounterclockwise, FileText, TrashFill, NodePlus } from 'react-bootstrap-icons'; + +const EditorMenuView = ({ + indexerName, + accountId, + indexerDetails, + setShowPublishModal, + setShowResetCodeModel, + setShowForkIndexerModal, + handleDeleteIndexer, + debugMode, + isCreateNewIndexer, + setShowLogsView, + isUserIndexer, + error +}) => { + return ( + + +
+ + Indexer: {accountId}/{indexerName ? indexerName : "Null"} + + + Filter: {!isCreateNewIndexer ? indexerDetails.rule.affected_account_id : + + + Please provide a valid contract name. + + } + +
+ + {isUserIndexer && !isCreateNewIndexer && ( + + )} + {isUserIndexer && !isCreateNewIndexer && ( + + )} + + {!isUserIndexer && !isCreateNewIndexer ? ( + + ) : ( + + )} + {!isCreateNewIndexer && ( + + )} + +
+
+ ); +}; + +export default EditorMenuView; diff --git a/frontend/src/components/Editor/EditorViewContainer/BlockPickerContainer.tsx b/frontend/src/components/Editor/EditorViewContainer/BlockPickerContainer.tsx new file mode 100644 index 000000000..865c625ac --- /dev/null +++ b/frontend/src/components/Editor/EditorViewContainer/BlockPickerContainer.tsx @@ -0,0 +1,43 @@ +import React, { useState } from "react"; +import BlockPickerView from "../EditorView/BlockPickerView"; + +interface BlockPickerContainerProps { + heights: string[]; + setHeights: React.Dispatch>; + executeIndexerFunction: () => void; + latestHeight: number; + isExecuting: boolean; + stopExecution: () => void; +} + +const BlockPickerContainer: React.FC = ({ + heights = [], + setHeights, + executeIndexerFunction, + latestHeight, + isExecuting, + stopExecution, +}) => { + const [inputValue, setInputValue] = useState(String(latestHeight)); + + const addHeight = () => { + if (heights.length < 10 && inputValue !== "") { + setHeights([...heights, inputValue]); + setInputValue(""); + } + }; + + return ( + + ); +}; + +export default BlockPickerContainer; diff --git a/frontend/src/components/Editor/EditorViewContainer/DeveloperToolsContainer.tsx b/frontend/src/components/Editor/EditorViewContainer/DeveloperToolsContainer.tsx new file mode 100644 index 000000000..80c122b12 --- /dev/null +++ b/frontend/src/components/Editor/EditorViewContainer/DeveloperToolsContainer.tsx @@ -0,0 +1,73 @@ +import React, { useContext } from "react"; +import DeveloperToolsView from "../EditorView/DeveloperToolsView"; +import { IndexerDetailsContext } from '../../../contexts/IndexerDetailsContext'; + +interface DeveloperToolsContainerProps { + handleFormating: () => void; + handleCodeGen: () => void; + executeIndexerFunction: () => void; + isExecuting: boolean; + stopExecution: () => void; + heights: string[]; + setHeights: React.Dispatch>; + latestHeight: number; + isUserIndexer: boolean; + handleDeleteIndexer: () => void; + error: string; + diffView: boolean; + setDiffView: React.Dispatch>; +} + +const DeveloperToolsContainer: React.FC = ({ + handleFormating, + handleCodeGen, + executeIndexerFunction, + isExecuting, + stopExecution, + heights, + setHeights, + latestHeight, + isUserIndexer, + handleDeleteIndexer, + error, + diffView, + setDiffView, +}) => { + const { + indexerName, + accountId, + indexerDetails, + setShowPublishModal, + setShowResetCodeModel, + setShowForkIndexerModal, + debugMode, + setDebugMode, + isCreateNewIndexer, + setShowLogsView, + } = useContext(IndexerDetailsContext); + + const removeHeight = (index: number) => { + setHeights(heights.filter((_, i) => i !== index)); + }; + + return ( + + ); +}; + +export default DeveloperToolsContainer; diff --git a/frontend/src/components/Editor/EditorViewContainer/EditorMenuContainer.jsx b/frontend/src/components/Editor/EditorViewContainer/EditorMenuContainer.jsx new file mode 100644 index 000000000..7e9c28902 --- /dev/null +++ b/frontend/src/components/Editor/EditorViewContainer/EditorMenuContainer.jsx @@ -0,0 +1,47 @@ +import React, { useContext } from "react"; +import EditorMenuView from "../EditorView/EditorMenuView"; +import { IndexerDetailsContext } from '../../../contexts/IndexerDetailsContext'; + +const EditorMenuContainer = (props) => { + const { + handleFormating, + handleCodeGen, + error, + executeIndexerFunction, + heights, + setHeights, + isCreateNewIndexer, + isExecuting, + stopExecution, + latestHeight, + isUserIndexer, + handleDeleteIndexer, + } = props; + const { + indexerName, + accountId, + indexerDetails, + setShowPublishModal, + setShowResetCodeModel, + setShowForkIndexerModal, + debugMode, + setShowLogsView, + } = useContext(IndexerDetailsContext); + + return ( + + ); +}; + +export default EditorMenuContainer; diff --git a/frontend/src/components/Editor/FileSwitcher.jsx b/frontend/src/components/Editor/FileSwitcher.jsx index fc0cef593..c27263705 100644 --- a/frontend/src/components/Editor/FileSwitcher.jsx +++ b/frontend/src/components/Editor/FileSwitcher.jsx @@ -1,80 +1,43 @@ -import React, { useContext, useState } from "react"; -import { InputGroup, ToggleButtonGroup, ToggleButton } from "react-bootstrap"; -import Switch from "react-switch"; +import React, { useContext } from "react"; import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; export function FileSwitcher({ fileName, setFileName, - diffView, - setDiffView, }) { - const { debugMode, setDebugMode, isCreateNewIndexer } = useContext(IndexerDetailsContext); + const { isCreateNewIndexer } = useContext(IndexerDetailsContext); return ( - <> - + + + {!isCreateNewIndexer && ( + + )} + + ); } diff --git a/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx b/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx deleted file mode 100644 index 3f178697f..000000000 --- a/frontend/src/components/Form/IndexerConfigOptionsInputGroup.jsx +++ /dev/null @@ -1,148 +0,0 @@ -import React, { useContext, useState, useEffect } from "react"; -import { InputGroup, Alert } from "react-bootstrap"; -import Form from "react-bootstrap/Form"; - -import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; -import { validateContractIds } from "../../utils/validators"; - -const GENESIS_BLOCK_HEIGHT = 9820210; - -const START_BLOCK = { - CONTINUE: "startBlockContinue", - LATEST: "startBlockLatest", - HEIGHT: "startBlockHeight", -} - -const IndexerConfigOptions = ({ updateConfig }) => { - const { indexerDetails, showPublishModal, isCreateNewIndexer, latestHeight } = useContext(IndexerDetailsContext); - const [blockHeight, setBlockHeight] = useState("0"); - const [contractFilter, setContractFilter] = useState("social.near"); - const [startBlock, setStartBlock] = useState(START_BLOCK.LATEST); - const [isContractFilterValid, setIsContractFilterValid] = useState(true); - const [indexerNameField, setIndexerNameField] = useState(indexerDetails.indexerName || ""); - const [blockHeightError, setBlockHeightError] = useState(null) - - useEffect(() => { - if (indexerDetails.rule?.affected_account_id) { - setContractFilter(indexerDetails.rule.affected_account_id) - } - - if (indexerDetails.startBlock?.HEIGHT) { - setStartBlock(START_BLOCK.HEIGHT) - setBlockHeight(indexerDetails.startBlock.HEIGHT) - return; - } - - if (indexerDetails.startBlock == "LATEST") { - setStartBlock(START_BLOCK.LATEST) - return; - } - - if (indexerDetails.startBlock == "CONTINUE") { - setStartBlock(START_BLOCK.CONTINUE) - return; - } - }, [indexerDetails]) - - const onChangeStartBlock = (e) => { - setStartBlock(e.target.value) - - if (e.target.value === START_BLOCK.CONTINUE) { - handleSetContractFilter(indexerDetails.rule.affected_account_id) - } - } - - function handleSetContractFilter(contractFilter) { - setContractFilter(contractFilter); - const isContractFilterValid = validateContractIds(contractFilter); - setIsContractFilterValid(isContractFilterValid); - } - - useEffect(() => { - if (startBlock == START_BLOCK.HEIGHT && blockHeight <= GENESIS_BLOCK_HEIGHT) { - setBlockHeightError(() => `Choose a block height greater than the Genesis BlockHeight ${GENESIS_BLOCK_HEIGHT}. Latest Block Height is ${latestHeight}`) - return - } - setBlockHeightError(() => null) - updateConfig(indexerNameField, contractFilter, blockHeight, startBlock) - }, - [indexerNameField, contractFilter, startBlock, blockHeight] - ) - - return ( - <> - - Indexer Name - setIndexerNameField(e.target.value.toLowerCase().trim())} - /> - - - - Start from latest block - - {!isCreateNewIndexer && ( - - - Continue from last processed block - - )} - - - Start from block height - setBlockHeight(parseInt(e.target.value))} - type="number" - /> - {blockHeightError && ( - - {blockHeightError} - - )} - - - Contract Filter - handleSetContractFilter(e.target.value)} - isValid={isContractFilterValid} - type="text" - placeholder="social.near" - required={true} - disabled={startBlock === START_BLOCK.CONTINUE} - /> - - Please provide a valid contract name. - - {startBlock === START_BLOCK.CONTINUE && ( - - Contract filter cannot be changed for "Continue" option. - - )} - - - ); -}; - -export default IndexerConfigOptions; diff --git a/frontend/src/components/Logs/GraphQL/Query.ts b/frontend/src/components/Logs/GraphQL/Query.ts new file mode 100644 index 000000000..7af2056c1 --- /dev/null +++ b/frontend/src/components/Logs/GraphQL/Query.ts @@ -0,0 +1,55 @@ +export const Query = (tableName: string) => ` + query getLogsQuery( + $limit: Int, + $offset: Int, + $order_by_timestamp: order_by, + $level: String_comparison_exp = {}, + $type: String_comparison_exp= {}, + $timestamp: timestamp_comparison_exp = {}, + $message: String_comparison_exp = {}, + $block_height: numeric_comparison_exp = {} + ) { + ${tableName}( + limit: $limit, + offset: $offset, + order_by: {timestamp: $order_by_timestamp}, + where: { + message: $message, + _or: [ + { message: $message }, + { block_height: $block_height }, + ], + _and: [ + {level: $level}, + {type: $type}, + {timestamp: $timestamp} + ] + } + ) { + block_height + level + message + timestamp + type + } + ${tableName}_aggregate( + where: { + message: $message, + _or: [ + { message: $message }, + { block_height: $block_height }, + ], + _and: [ + {level: $level}, + {type: $type}, + {timestamp: $timestamp} + ] + } + ) { + aggregate { + count + } + } + } +`; + diff --git a/frontend/src/components/Logs/GraphQL/QueryValidation.ts b/frontend/src/components/Logs/GraphQL/QueryValidation.ts new file mode 100644 index 000000000..bc2868e20 --- /dev/null +++ b/frontend/src/components/Logs/GraphQL/QueryValidation.ts @@ -0,0 +1,46 @@ +import { calculateTimestamp } from '../../../utils/calculateTimestamp'; + +interface Variables { + limit: number; + offset: number; + order_by_timestamp: 'asc' | 'desc'; + level?: string; + type?: string; + timestamp?: string; + keyword?: string; +} + +interface QueryFilter { + _eq?: string | number; + _ilike?: string; + _gte?: string; +} + +type LevelFormat = { level: QueryFilter }; +type TypeFormat = { type: QueryFilter }; +type TimestampFormat = { timestamp: QueryFilter }; + +export const QueryValidation = ({ limit, offset, order_by_timestamp, level, type, timestamp, keyword }: Variables) => { + + const levelFormat: LevelFormat | undefined = level ? { level: { _eq: level } } as const : undefined; + const typeFormat: TypeFormat | undefined = type ? { type: { _eq: type } } as const : undefined; + const timestampFormat: TimestampFormat | undefined = timestamp + ? { timestamp: { _gte: calculateTimestamp(timestamp) } } as const + : undefined; + + const messageFormat = keyword ? { message: { _ilike: `%${keyword}%` } } as const : undefined; + const blockHeightFormat = keyword && !isNaN(Number(keyword)) + ? { block_height: { _eq: Number(keyword) } } as const + : undefined; + + return { + limit, + offset, + order_by_timestamp, + ...levelFormat, + ...typeFormat, + ...timestampFormat, + ...messageFormat, + ...blockHeightFormat, + }; +}; diff --git a/frontend/src/components/Logs/IndexerLogs.jsx b/frontend/src/components/Logs/IndexerLogs.jsx deleted file mode 100644 index 67f13e0cd..000000000 --- a/frontend/src/components/Logs/IndexerLogs.jsx +++ /dev/null @@ -1,213 +0,0 @@ -import React, { useContext, useState, useEffect, useRef } from "react"; -import { useQuery, gql } from "@apollo/client"; -import { Grid, html } from "gridjs"; -import "gridjs/dist/theme/mermaid.css"; -import { IndexerDetailsContext } from "../../contexts/IndexerDetailsContext"; -import LogButtons from "./LogButtons"; -import { useInitialPayload } from "near-social-bridge"; -import Status from "./Status"; - -const IndexerLogsComponent = () => { - const { indexerDetails, latestHeight } = useContext(IndexerDetailsContext); - const { currentUserAccountId } = useInitialPayload(); - const PAGINATION_LIMIT = 50; - - const sanitizedAccountId = indexerDetails.accountId.replace(/[^a-zA-Z0-9]/g, '_').replace(/^([0-9])/, '_$1'); - const sanitizedIndexerName = indexerDetails.indexerName.replace(/[^a-zA-Z0-9]/g, '_').replace(/^([0-9])/, '_$1'); - const functionName = `${indexerDetails.accountId}/${indexerDetails.indexerName}`; - const schemaName = `${sanitizedAccountId}_${sanitizedIndexerName}`; - const tableName = `${schemaName}_sys_logs`; - - const GET_INDEXER_LOGS = gql` - query GetIndexerLogs($limit: Int, $offset: Int) { - ${tableName}(limit: $limit, offset: $offset, order_by: {timestamp: desc}) { - block_height - date - id - level - message - timestamp - type - } - ${tableName}_aggregate { - aggregate { - count - } - } - } - `; - - const EMPTY_LOGS_DATA = [ - { - block_height: 0, - date: "ERROR", - id: 1, - level: "ERROR", - message: "Query for logs failed. See console for more details. Table may not exist or indexer has not run yet.", - timestamp: "ERROR", - type: "system" - }, - ]; - - const [currentPage, setCurrentPage] = useState(1); - const [totalLogsCount, setTotalLogsCount] = useState(0); - const [isGridRendered, setIsGridRendered] = useState(false); - const gridContainerRef = useRef(null); - const gridRef = useRef(null); - const totalPages = Math.ceil(totalLogsCount / PAGINATION_LIMIT); - - const { loading, error, data, refetch } = useQuery(GET_INDEXER_LOGS, { - variables: { limit: PAGINATION_LIMIT, offset: (currentPage - 1) * PAGINATION_LIMIT }, - context: { headers: { "x-hasura-role": sanitizedAccountId } }, - fetchPolicy: "network-only", - }); - - useEffect(() => { - if (!loading && !error && data && !isGridRendered) { - setTotalLogsCount(data[`${tableName}_aggregate`]?.aggregate.count || 0); - renderGrid(data[tableName]); - setIsGridRendered(true); - } else if (!loading && error && !data && !isGridRendered) { - console.error('Failed to query sys_logs table for logs:', error); - setTotalLogsCount(0); - renderGrid(EMPTY_LOGS_DATA); - setIsGridRendered(true); - } - }, [data, error, loading, tableName, isGridRendered]); - - const getGridConfig = (logs) => { - return { - columns: [ - "Height", - "Timestamp", - "Date", - "Type", - "Level", - { - name: "Message", - formatter: (cell) => html(`
${cell}
`), - sort: false, - }, - ], - data: logs.map((log) => [ - log.block_height, - log.timestamp, - log.date, - log.type, - log.level, - log.message, - ]), - search: true, - sort: true, - resizable: true, - fixedHeader: true, - pagination: false, - resetPageOnUpdate: true, - style: { - container: { - fontFamily: "Roboto Mono, monospace", - }, - table: {}, - th: { - width: "auto", - fontSize: "14px", - textAlign: "center", - }, - td: { - width: "auto", - fontSize: "12px", - padding: "5px", - }, - language: { - search: { - placeholder: "🔍 Search by Block Height...", - }, - }, - }, - }; - }; - - const renderGrid = (logs) => { - const gridConfig = getGridConfig(logs); - if (gridRef.current) { - gridRef.current.destroy(); - } - const grid = new Grid(gridConfig); - grid.render(gridContainerRef.current); - gridRef.current = grid; - }; - - const reloadData = () => { - handlePagination(1); - }; - - const handlePagination = (pageNumber) => { - setCurrentPage(pageNumber); - refetch(); - }; - - useEffect(() => { - if (gridRef.current && data && isGridRendered) { - renderGrid(data[tableName]); - } - }, [data, tableName]); - - return ( -
- - - {loading ? ( -

Loading...

- ) : ( -
-
- {totalLogsCount > PAGINATION_LIMIT && ( -

- {`Showing logs ${(currentPage - 1) * PAGINATION_LIMIT + 1} to ${Math.min( - currentPage * PAGINATION_LIMIT, - totalLogsCount - )} of ${totalLogsCount}`} -

- )} -
- {Array.from({ length: totalPages }, (_, i) => ( - - ))} -
-
- )} -
- ); -}; - -export default IndexerLogsComponent; diff --git a/frontend/src/components/Logs/LogButtons.jsx b/frontend/src/components/Logs/LogButtons.jsx deleted file mode 100644 index 49963a8b8..000000000 --- a/frontend/src/components/Logs/LogButtons.jsx +++ /dev/null @@ -1,151 +0,0 @@ -import React, { useContext } from "react"; -import { - Breadcrumb, - Button, - Form, - InputGroup, - Navbar, - Container, - Col, - Row, - ButtonGroup, - OverlayTrigger, - Tooltip, - Badge, -} from "react-bootstrap"; -import { - ArrowCounterclockwise, - Justify, - TrashFill, - XCircle, - NodePlus, - Code, -} from "react-bootstrap-icons"; -import { IndexerDetailsContext } from "../../contexts/IndexerDetailsContext"; - -const LogButtons = ({ - currentUserAccountId, - heights, - setHeights, - latestHeight, - isUserIndexer, - reloadData -}) => { - const { - indexerName, - accountId, - indexerDetails, - debugMode, - setShowLogsView, - showLogsView, - } = useContext(IndexerDetailsContext); - - const removeHeight = (index) => { - setHeights(heights.filter((_, i) => i !== index)); - }; - - return ( - <> - - - - - - - {accountId} - - {indexerName && ( - - {indexerName} - - )} - - { - - Contract Filter - - - } - - - - <> - Reload Data} - > - - - Open Editor} - > - - - - - - - {debugMode && heights.length > 0 && ( - -
- {heights.map((height, index) => ( - - {height} - removeHeight(index)} - /> - - ))} -
-
- )} -
-
- - ); -}; - -export default LogButtons; diff --git a/frontend/src/components/Logs/LogsMenu.tsx b/frontend/src/components/Logs/LogsMenu.tsx new file mode 100644 index 000000000..c71e887bb --- /dev/null +++ b/frontend/src/components/Logs/LogsMenu.tsx @@ -0,0 +1,122 @@ +import React, { useState, useEffect, useContext } from "react"; +import { useQuery, gql } from "@apollo/client"; +import { Button, Navbar, Container, ButtonGroup, Spinner } from "react-bootstrap"; +import { ArrowCounterclockwise, Code } from "react-bootstrap-icons"; +import { IndexerDetailsContext } from "../../contexts/IndexerDetailsContext"; +import { calculateBlockTimeDifference } from "../../utils/calculateBlockTimeDifference"; + +interface LogsMenuProps { + currentUserAccountId: string; + heights: any[]; + setHeights: React.Dispatch>; + latestHeight: string; + isUserIndexer: boolean; + accountId: string; + reloadData: () => void; + functionName: string; +} + +const LogsMenu: React.FC = ({ + currentUserAccountId, + heights, + setHeights, + latestHeight, + isUserIndexer, + accountId, + reloadData: reloadDataProp, + functionName, +}) => { + const { indexerName, indexerDetails, debugMode, setShowLogsView, showLogsView } = useContext(IndexerDetailsContext); + const hasuraRole = accountId.replace(/[^a-zA-Z0-9]/g, '_').replace(/^([0-9])/, '_$1'); + const queryName = `${functionName.replace(/[^a-zA-Z0-9]/g, '_')}_sys_metadata`; + + const GET_METADATA = gql` + query getMetadata { + ${queryName} { + attribute + value + } + } + `; + + const { loading, error, data, refetch } = useQuery(GET_METADATA, { + context: { + headers: { + "x-hasura-role": hasuraRole, + }, + }, + }); + + const [blockHeight, setBlockHeight] = useState(null); + const [status, setStatus] = useState(null); + const [attributeMap, setAttributeMap] = useState>(new Map()); + + useEffect(() => { + if (!loading && data) { + const newAttributeMap = new Map(data[queryName].map((item: any) => [item.attribute, item.value])); + setAttributeMap(newAttributeMap); + } + }, [data, queryName, loading]); + + useEffect(() => { + if (attributeMap.has("LAST_PROCESSED_BLOCK_HEIGHT")) { + setBlockHeight(attributeMap.get("LAST_PROCESSED_BLOCK_HEIGHT") ?? "N/A"); + } + if (attributeMap.has("STATUS")) { + setStatus(attributeMap.get("STATUS") ?? "UNKNOWN"); + } + }, [attributeMap]); + + const handleReload = async () => { + try { + const { data: refetchedData } = await refetch(); + if (refetchedData) { + const newAttributeMap = new Map(refetchedData[queryName].map((item: any) => [item.attribute, item.value])); + setAttributeMap(newAttributeMap); + } + reloadDataProp(); + } catch (error) { + console.error('Error reloading data:', error); + } + }; + + return ( + + +
+ + Indexer: {functionName} + + + Filter: {indexerDetails.rule.affected_account_id} + + + Height: {loading ? : blockHeight ?? "N/A"} + + + Status: {loading ? : status ?? "UNKNOWN"} + + {!loading && blockHeight && latestHeight && ( +
+ + Indexer is {Number(latestHeight) - Number(blockHeight)} blocks or {calculateBlockTimeDifference(Number(latestHeight), Number(blockHeight))} behind tip. + +
+ )} +
+ + + + +
+
+ ); +}; + +export default LogsMenu; diff --git a/frontend/src/components/Logs/LogsView/ClearButtonView.jsx b/frontend/src/components/Logs/LogsView/ClearButtonView.jsx new file mode 100644 index 000000000..776007dfb --- /dev/null +++ b/frontend/src/components/Logs/LogsView/ClearButtonView.jsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { Button } from 'react-bootstrap'; +import { ClearIcon } from '../LogsView/Icons/ClearIcon'; + +const ClearButtonView = ({ onClick }) => { + return ( + + ); +}; + +export default ClearButtonView; diff --git a/frontend/src/components/Logs/LogsView/DateSelectorView.jsx b/frontend/src/components/Logs/LogsView/DateSelectorView.jsx new file mode 100644 index 000000000..6aa407883 --- /dev/null +++ b/frontend/src/components/Logs/LogsView/DateSelectorView.jsx @@ -0,0 +1,14 @@ +import React from 'react'; +import OptionSelectorContainer from '../LogsViewContainer/OptionSelectorContainer'; + +const DateSelectorView = ({ options, selectedOption, onOptionChange }) => { + return ( + + ); +}; + +export default DateSelectorView; diff --git a/frontend/src/components/Logs/LogsView/Icons/CheckMarkIcon.js b/frontend/src/components/Logs/LogsView/Icons/CheckMarkIcon.js new file mode 100644 index 000000000..e4e0597b1 --- /dev/null +++ b/frontend/src/components/Logs/LogsView/Icons/CheckMarkIcon.js @@ -0,0 +1,7 @@ +export const CheckmarkIcon = () => ( + + + + + +); diff --git a/frontend/src/components/Logs/LogsView/Icons/ClearIcon.js b/frontend/src/components/Logs/LogsView/Icons/ClearIcon.js new file mode 100644 index 000000000..6609b9a6f --- /dev/null +++ b/frontend/src/components/Logs/LogsView/Icons/ClearIcon.js @@ -0,0 +1,16 @@ +export const ClearIcon = () => { + return ( + + + + ); +} diff --git a/frontend/src/components/Logs/LogsView/IndexerLogsView.jsx b/frontend/src/components/Logs/LogsView/IndexerLogsView.jsx new file mode 100644 index 000000000..d115cf49c --- /dev/null +++ b/frontend/src/components/Logs/LogsView/IndexerLogsView.jsx @@ -0,0 +1,92 @@ +import { Container, Row, Col } from 'react-bootstrap'; +import LogsMenu from '../LogsMenu'; +import LogFieldCardView from "./LogFieldCardView"; +import "gridjs/dist/theme/mermaid.css"; +import styled from "styled-components"; + +const CustomGridContainer = styled.div` + .gridjs-wrapper{ + border-radius: 0 !important; + box-shadow: none !important; + border: 1px solid #d2d2d2 !important; + border-collapse: collapse !important; + } + .gridjs-container{ + padding: 0 2px !important; + } + .gridjs-table { + border-collapse: collapse; + } + .gridjs-td { + border: none; + } + .gridjs-search { + width: 100% !important; + } + .gridjs-search-input{ + width: 100% !important; + padding: 18px !important; + border-radius: 4px 4px 0px 0 !important; + border: 1px solid #d2d2d2 !important; + } + .gridjs-head{ + padding:0 !important; + margin:0 !important; + } +`; + + +const IndexerLogsView = ({ + severity, + setSeverity, + logType, + setLogType, + startTime, + setStartTime, + functionName, + tableName, + latestHeight, + currentIndexerDetails, + currentUserAccountId, + getIndexerLogsConfig, + getSearchConfig, + getPaginationConfig, + getGridStyle, + getGridConfig, + reloadData, + gridContainerRef +}) => { + return ( + <> + + + + + + + + + + + + + + ); +}; + +export default IndexerLogsView; diff --git a/frontend/src/components/Logs/LogsView/LogFieldCardView.jsx b/frontend/src/components/Logs/LogsView/LogFieldCardView.jsx new file mode 100644 index 000000000..a19d3fc27 --- /dev/null +++ b/frontend/src/components/Logs/LogsView/LogFieldCardView.jsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { Card, Accordion } from 'react-bootstrap'; +import SeveritySelectorContainer from '../LogsViewContainer/SeveritySelectorContainer'; +import LogTypeSelectorContainer from '../LogsViewContainer/LogTypeSelectorContainer'; +import DateSelectorContainer from '../LogsViewContainer/DateSelectorContainer' +import styled from 'styled-components'; + +const CustomAccordianWrapper = styled.div` + .accordion-button { + background-color: #f8f8f8 !important; + } + .accordion-item:first-of-type { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + border-collapse: collapse !important;; + } + .accordion-item:first-of-type>.accordion-header .accordion-button { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + } + .accordian{ + .--bs-accordion-border-width : 0 !important; + } +`; + +const LogFieldCardView = ({ severity, handleSeverityChange, logType, handleLogTypeChange, dateFilter, handleDateFilter }) => { + return ( + + Filters + + + + + Severity + + + + + + + Log Type + + + + + + + Date + + + + + + + + + ); +}; + +export default LogFieldCardView; diff --git a/frontend/src/components/Logs/LogsView/LogTypeSelectorView.jsx b/frontend/src/components/Logs/LogsView/LogTypeSelectorView.jsx new file mode 100644 index 000000000..4453a4606 --- /dev/null +++ b/frontend/src/components/Logs/LogsView/LogTypeSelectorView.jsx @@ -0,0 +1,14 @@ +import React from 'react'; +import OptionSelectorContainer from '../LogsViewContainer/OptionSelectorContainer'; + +const LogTypeSelectorView = ({ options, selectedOption, onOptionChange }) => { + return ( + + ); +} + +export default LogTypeSelectorView; diff --git a/frontend/src/components/Logs/LogsView/OptionSelectorView.jsx b/frontend/src/components/Logs/LogsView/OptionSelectorView.jsx new file mode 100644 index 000000000..60a4a62ab --- /dev/null +++ b/frontend/src/components/Logs/LogsView/OptionSelectorView.jsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { Row, Col, Form, Button } from 'react-bootstrap'; +import { CheckmarkIcon } from './Icons/CheckMarkIcon'; +import ClearButtonContainer from '../LogsViewContainer/ClearButtonContainer'; + +const OptionSelectorView = ({ options, selectedOption, onOptionChange, handleOptionChange, handleClearSelection }) => { + return ( +
+ + {options.map((option, index) => ( + +
handleOptionChange(option)} + > + + {selectedOption === option && } +
{option}
+
+ {selectedOption === option && ( + + )} +
+ + ))} +
+
+ ); +}; + +export default OptionSelectorView; diff --git a/frontend/src/components/Logs/LogsView/SeveritySelectorView.jsx b/frontend/src/components/Logs/LogsView/SeveritySelectorView.jsx new file mode 100644 index 000000000..12df8a9d2 --- /dev/null +++ b/frontend/src/components/Logs/LogsView/SeveritySelectorView.jsx @@ -0,0 +1,14 @@ +import React from 'react'; +import OptionSelectorContainer from '../LogsViewContainer/OptionSelectorContainer'; + +const SeveritySelectorView = ({ options, selectedOption, onOptionChange }) => { + return ( + + ); +}; + +export default SeveritySelectorView; diff --git a/frontend/src/components/Logs/LogsViewContainer/ClearButtonContainer.tsx b/frontend/src/components/Logs/LogsViewContainer/ClearButtonContainer.tsx new file mode 100644 index 000000000..bce2eff8d --- /dev/null +++ b/frontend/src/components/Logs/LogsViewContainer/ClearButtonContainer.tsx @@ -0,0 +1,17 @@ +import React, { MouseEvent, FC } from 'react'; +import ClearButtonView from '../LogsView/ClearButtonView'; + +interface ClearButtonProps { + onClick: () => void; +} + +const ClearButton: FC = ({ onClick }) => { + const handleClick = (event: MouseEvent) => { + event.stopPropagation(); + onClick(); + }; + + return ; +}; + +export default ClearButton; diff --git a/frontend/src/components/Logs/LogsViewContainer/DateSelectorContainer.tsx b/frontend/src/components/Logs/LogsViewContainer/DateSelectorContainer.tsx new file mode 100644 index 000000000..1da4556ac --- /dev/null +++ b/frontend/src/components/Logs/LogsViewContainer/DateSelectorContainer.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import DateSelectorView from '../LogsView/DateSelectorView'; +import { TIME_INTERVALS_MAP } from '../../../constants/DurationMap'; + +interface DateSelectorProps { + selectedDate: string; + onDateChange: (selectedDate: Date) => void; +} + +const DateSelectorContainer: React.FC = ({ selectedDate, onDateChange }) => { + const dateOptions: string[] = Array.from(TIME_INTERVALS_MAP.values()); + + return ( + + ); +}; + +export default DateSelectorContainer; diff --git a/frontend/src/components/Logs/LogsViewContainer/IndexerLogsContainer.tsx b/frontend/src/components/Logs/LogsViewContainer/IndexerLogsContainer.tsx new file mode 100644 index 000000000..3ec704bea --- /dev/null +++ b/frontend/src/components/Logs/LogsViewContainer/IndexerLogsContainer.tsx @@ -0,0 +1,199 @@ +import React, { useContext, useState, useEffect, useRef } from "react"; +import { useInitialPayload } from "near-social-bridge"; +import { sanitizeString } from "../../../utils/helpers"; +import { IndexerDetailsContext } from "../../../contexts/IndexerDetailsContext"; +import IndexerLogsView from "../LogsView/IndexerLogsView"; +import { Grid } from "gridjs"; + +import { QueryValidation } from "../GraphQL/QueryValidation"; +import { Query } from '../GraphQL/Query' +import { formatTimestamp } from "@/utils/formatTimestamp"; + +interface GridConfig { + columns: string[]; + search: any; + pagination: any; + server: any; + style: any; + sort: boolean; +} + +interface InitialPayload { + currentUserAccountId: string; +} + +const GRAPHQL_ENDPOINT: string | undefined = `${process.env.NEXT_PUBLIC_HASURA_ENDPOINT}/v1/graphql`; +const LOGS_PER_PAGE: number = 75; + +const IndexerLogsContainer: React.FC = () => { + const { indexerDetails, latestHeight } = useContext(IndexerDetailsContext); + const { currentUserAccountId } = useInitialPayload(); + + const sanitizedAccountId: string = sanitizeString(indexerDetails.accountId); + const sanitizedIndexerName: string = sanitizeString(indexerDetails.indexerName); + + const functionName: string = `${indexerDetails.accountId}/${indexerDetails.indexerName}`; + const schemaName: string = `${sanitizedAccountId}_${sanitizedIndexerName}`; + const tableName: string = `${schemaName}_sys_logs`; + + const [severity, setSeverity] = useState(''); + const [logType, setLogType] = useState(''); + const [startTime, setStartTime] = useState(''); + // const [endTime, setEndTime] = useState(''); //todo: for custom time range + + const gridContainerRef = useRef(null); + const gridRef = useRef(null); + + const getIndexerLogsConfig: any = () => { + return { + url: GRAPHQL_ENDPOINT, + method: 'POST', + headers: { + ['x-hasura-role']: sanitizedAccountId, + ['Content-Type']: 'application/json', + }, + body: JSON.stringify({ + query: Query(tableName), + variables: QueryValidation({ limit: LOGS_PER_PAGE, offset: 0, order_by_timestamp: 'desc', level: severity, type: logType, timestamp: startTime }) + }), + then: ({ data }: any) => ( + data[tableName].map((log: any) => [ + log.level, + log.type, + formatTimestamp(log.timestamp) ?? log.timestamp, + log.block_height, + log.message + ]) + ), + total: ({ data }: any) => (data[`${tableName}_aggregate`].aggregate.count), + }; + }; + + const getSearchConfig: any = () => { + return { + debounceTimeout: 500, + server: { + url: (prev: string, keyword: string) => prev, + body: (prev: string, keyword: string) => { + return JSON.stringify({ + query: Query(tableName), + variables: QueryValidation({ limit: LOGS_PER_PAGE, offset: 0, order_by_timestamp: 'desc', level: severity, type: logType, timestamp: startTime, keyword: keyword }) + }); + }, + then: ({ data }: any) => ( + data[tableName].map((log: any) => [ + log.level, + log.type, + formatTimestamp(log.timestamp) ?? log.timestamp, + log.block_height, + log.message + ]) + ), + total: ({ data }: any) => (data[`${tableName}_aggregate`].aggregate.count), + }, + }; + }; + + const getPaginationConfig: any = () => { + return { + prevButton: false, + nextButton: false, + limit: LOGS_PER_PAGE, + buttonsCount: 0 + }; + }; + + const getGridStyle: any = () => { + return { + container: { + fontFamily: "Roboto Mono, monospace", + }, + table: { + borderCollapse: "collapse", + width: "100%", + }, + th: { + backgroundColor: "#f8f8f8", + fontSize: "14px", + textAlign: "left", + fontWeight: "bold", + }, + td: { + padding: "2px 10px", + textAlign: "left", + fontSize: "14px", + }, + }; + }; + + const getLanguageConfig: any = () => { + return { + search: { + 'placeholder': '🔍 Search by Message or Block Height', + }, + }; + } + + const renderGrid = () => { + const gridConfig: GridConfig = getGridConfig(); + const grid: Grid = new Grid(gridConfig); + grid.render(gridContainerRef.current as Element); + gridRef.current = grid; + }; + + const getGridConfig: any = () => { + return { + columns: [ + { name: 'LEVEL', width: '100px' }, + { name: 'TYPE', width: '100px' }, + { name: 'TIMESTAMP', width: '225px' }, + { name: 'HEIGHT', width: '100px' }, + { name: 'MESSAGE', width: 'auto' }, + ], + search: getSearchConfig(), + pagination: getPaginationConfig(), + server: getIndexerLogsConfig(), + style: getGridStyle(), + language: getLanguageConfig(), + // sort: true, + }; + }; + + const reloadData = () => { + if (gridRef.current) gridRef.current.destroy(); + renderGrid(); + }; + + useEffect(() => { + renderGrid(); + }, []); + + useEffect(() => { + reloadData(); + }, [severity, logType, startTime]); + + return ( + + ); +}; + +export default IndexerLogsContainer; diff --git a/frontend/src/components/Logs/LogsViewContainer/LogTypeSelectorContainer.tsx b/frontend/src/components/Logs/LogsViewContainer/LogTypeSelectorContainer.tsx new file mode 100644 index 000000000..8d5286a92 --- /dev/null +++ b/frontend/src/components/Logs/LogsViewContainer/LogTypeSelectorContainer.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import LogTypeSelectorView from '../LogsView/LogTypeSelectorView' + +interface LogTypeSelectorContainerProps { + selectedLogType: string; + onLogTypeChange: (logType: string) => void; +} + +const LogTypeSelectorContainer: React.FC = ({ selectedLogType, onLogTypeChange }) => { + const logTypeOptions: string[] = ['system', 'user']; + + return ( + + ); +} + +export default LogTypeSelectorContainer; diff --git a/frontend/src/components/Logs/LogsViewContainer/OptionSelectorContainer.tsx b/frontend/src/components/Logs/LogsViewContainer/OptionSelectorContainer.tsx new file mode 100644 index 000000000..762da7594 --- /dev/null +++ b/frontend/src/components/Logs/LogsViewContainer/OptionSelectorContainer.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import OptionSelectorView from '../LogsView/OptionSelectorView'; +interface OptionSelectorContainerProps { + options: string[]; + selectedOption: string; + onOptionChange: (option: string) => void; +} + +const OptionSelectorContainer: React.FC = ({ options, selectedOption, onOptionChange }) => { + const handleOptionChange = (value: string) => { + onOptionChange(value); + }; + + const handleClearSelection = () => { + onOptionChange(""); + }; + + return ( + + ); +}; + +export default OptionSelectorContainer; diff --git a/frontend/src/components/Logs/LogsViewContainer/SeveritySelectorContainer.tsx b/frontend/src/components/Logs/LogsViewContainer/SeveritySelectorContainer.tsx new file mode 100644 index 000000000..a8a45c37b --- /dev/null +++ b/frontend/src/components/Logs/LogsViewContainer/SeveritySelectorContainer.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import SeverityRadioButtonGroupView from '../LogsView/SeveritySelectorView'; + +interface SeveritySelectorProps { + selectedSeverity: string; + onSeverityChange: (severity: string) => void; +} + +const SeveritySelectorContainer: React.FC = ({ selectedSeverity, onSeverityChange }) => { + // Refactor to fetch fields from graphql + const severityOptions: string[] = ['INFO', 'DEBUG', 'WARNING', 'ERROR']; + + return ( + + ); +}; + +export default SeveritySelectorContainer; diff --git a/frontend/src/components/Logs/Status.jsx b/frontend/src/components/Logs/Status.jsx deleted file mode 100644 index 5dbb40c6b..000000000 --- a/frontend/src/components/Logs/Status.jsx +++ /dev/null @@ -1,96 +0,0 @@ -import React from "react"; -import { - Card, - Badge, - ListGroup, - OverlayTrigger, - Tooltip, -} from "react-bootstrap"; -import { useQuery, gql } from "@apollo/client"; - -const Status = ({ accountId, functionName, latestHeight }) => { - const hasuraRole = accountId.replace(/[^a-zA-Z0-9]/g, '_').replace(/^([0-9])/, '_$1'); - const queryName = `${functionName.replace(/[^a-zA-Z0-9]/g, '_')}_sys_metadata`; - const GET_METADATA = gql` - query getMetadata { - ${queryName} { - attribute - value - } - } - `; - const { loading, error, data } = useQuery(GET_METADATA, { - context: { - headers: { - "x-hasura-role": hasuraRole, - }, - } - }); - - if (loading) return

Loading...

; - if (data || error) { - if (error) { - console.error('Failed to query sys_metadata table for status:', error); - } - const attributeMap = error ? new Map() : data[queryName].reduce((acc, item) => { - acc.set(item.attribute, item.value); - return acc; - }, new Map()); - return ( -
- {attributeMap && ( - - - Indexer Status for {functionName} - - - { - attributeMap.get("LAST_PROCESSED_BLOCK_HEIGHT") - ? `Current Block Height of Near is ${latestHeight}. Your indexer has a gap of ${latestHeight - attributeMap.get("LAST_PROCESSED_BLOCK_HEIGHT")} Blocks` - : 'Indexer needs to run to update block height' } } - > - - Current Block Height:{" "} - {attributeMap.get("LAST_PROCESSED_BLOCK_HEIGHT") ?? "N/A"} - - - - {attributeMap.get("STATUS") === "RUNNING" ? "Indexer is operating normally" : "Indexer stopped due to errors. Check Logs for more details."}} - > - <> - Status:{" "} - - {attributeMap.get("STATUS") ?? "UNKNOWN"} - - - - - - - )} -
- ); - } - -}; - -export default Status; diff --git a/frontend/src/components/Modals/ForkIndexerModal.jsx b/frontend/src/components/Modals/ForkIndexerModal.jsx index 59a9ec49c..92bf2349d 100644 --- a/frontend/src/components/Modals/ForkIndexerModal.jsx +++ b/frontend/src/components/Modals/ForkIndexerModal.jsx @@ -1,6 +1,5 @@ import React, { useContext, useState } from "react"; -import { Button, Modal, Alert, InputGroup, Form } from "react-bootstrap"; -import IndexerConfigOptions from "../Form/IndexerConfigOptionsInputGroup"; +import { Button, Modal, Alert, InputGroup, Form } from "react-bootstrap"; import { IndexerDetailsContext } from "../../contexts/IndexerDetailsContext"; export const ForkIndexerModal = ({ registerFunction, forkIndexer }) => { @@ -10,6 +9,8 @@ export const ForkIndexerModal = ({ registerFunction, forkIndexer }) => { setShowForkIndexerModal, setIsCreateNewIndexer, setIndexerName, + setForkedAccountId, + setForkedIndexerName, setIndexerConfig, isCreateNewIndexer, } = useContext(IndexerDetailsContext); @@ -24,13 +25,15 @@ export const ForkIndexerModal = ({ registerFunction, forkIndexer }) => { if (indexerName === indexerDetails.indexerName) { setError( - "Please provide a different Indexer Name than the orginal Indexer" + "Please provide a different Indexer Name than the original Indexer" ); return; } setError(null); setIndexerName(indexerName); + setForkedAccountId(indexerDetails.accountId); + setForkedIndexerName(indexerDetails.indexerName); setIsCreateNewIndexer(true); forkIndexer(indexerName); setShowForkIndexerModal(false); @@ -41,35 +44,49 @@ export const ForkIndexerModal = ({ registerFunction, forkIndexer }) => { centered={true} show={showForkIndexerModal} onHide={() => setShowForkIndexerModal(false)} + className="bg-gray-50" > - - Enter Indexer Details + + + Enter Indexer Details + - - - Indexer Name + + + + Indexer Name + setIndexerNameField(e.target.value.trim().toLowerCase())} + className="focus:border-gray-500 focus:ring focus:ring-gray-200 focus:ring-opacity-50" /> {error && ( - + {error} )} - + - diff --git a/frontend/src/components/Modals/ModalsContainer/PublishFormContainer.tsx b/frontend/src/components/Modals/ModalsContainer/PublishFormContainer.tsx new file mode 100644 index 000000000..887bde1e1 --- /dev/null +++ b/frontend/src/components/Modals/ModalsContainer/PublishFormContainer.tsx @@ -0,0 +1,97 @@ +import React, { useContext, useState, useEffect, ChangeEvent } from "react"; +import { IndexerDetailsContext } from '../../../contexts/IndexerDetailsContext'; +import { validateContractIds } from "../../../utils/validators"; +import PublishFormView from "../ModalsView/PublishFormView"; + +interface Props { + updateConfig: (indexerName: string, contractFilter: string, blockHeight: string, startBlock: string) => void; +} + +const GENESIS_BLOCK_HEIGHT: number = 9820210; + +enum START_BLOCK { + CONTINUE = "startBlockContinue", + LATEST = "startBlockLatest", + HEIGHT = "startBlockHeight", +} + +const ViewContainer: React.FC = ({ updateConfig }) => { + const { indexerDetails, showPublishModal, isCreateNewIndexer, latestHeight } = useContext(IndexerDetailsContext); + const [blockHeight, setBlockHeight] = useState("0"); + const [contractFilter, setContractFilter] = useState("social.near"); + const [startBlock, setStartBlock] = useState(START_BLOCK.LATEST); + const [isContractFilterValid, setIsContractFilterValid] = useState(true); + const [indexerNameField, setIndexerNameField] = useState(indexerDetails.indexerName || ""); + const [blockHeightError, setBlockHeightError] = useState(null); + + useEffect(() => { + if (indexerDetails.rule?.affected_account_id) { + setContractFilter(indexerDetails.rule.affected_account_id); + } + + if (typeof indexerDetails.startBlock === 'object' && indexerDetails.startBlock !== null) { + const startBlock = indexerDetails.startBlock as { HEIGHT: string }; + if (startBlock.HEIGHT) { + setStartBlock(START_BLOCK.HEIGHT); + setBlockHeight(startBlock.HEIGHT); + return; + } + } + + if (indexerDetails.startBlock === "LATEST") { + setStartBlock(START_BLOCK.LATEST); + return; + } + + if (indexerDetails.startBlock === "CONTINUE") { + setStartBlock(START_BLOCK.CONTINUE); + return; + } + }, [indexerDetails]); + + const onChangeStartBlock = (e: ChangeEvent) => { + const value = e.target.value as START_BLOCK; + setStartBlock(value); + + if (value === START_BLOCK.CONTINUE) { + handleSetContractFilter(indexerDetails.rule.affected_account_id); + } + }; + + function handleSetContractFilter(contractFilter: string) { + setContractFilter(contractFilter); + const isContractFilterValid = validateContractIds(contractFilter); + setIsContractFilterValid(isContractFilterValid); + } + + useEffect(() => { + if (startBlock === START_BLOCK.HEIGHT && parseInt(blockHeight) <= GENESIS_BLOCK_HEIGHT) { + setBlockHeightError(`Choose a block height greater than the Genesis BlockHeight ${GENESIS_BLOCK_HEIGHT}. Latest Block Height is ${latestHeight}`); + return; + } + setBlockHeightError(null); + updateConfig(indexerNameField, contractFilter, blockHeight, startBlock); + }, [indexerNameField, contractFilter, startBlock, blockHeight, latestHeight]); + + return ( + + ); +}; + +export default ViewContainer; diff --git a/frontend/src/components/Modals/ModalsView/PublishFormView.jsx b/frontend/src/components/Modals/ModalsView/PublishFormView.jsx new file mode 100644 index 000000000..8b60b1aee --- /dev/null +++ b/frontend/src/components/Modals/ModalsView/PublishFormView.jsx @@ -0,0 +1,117 @@ +import React from "react"; + +const PublishFormView = ({ + indexerNameField, + isCreateNewIndexer, + showPublishModal, + startBlock, + blockHeight, + contractFilter, + latestHeight, + blockHeightError, + isContractFilterValid, + onChangeStartBlock, + setIndexerNameField, + setBlockHeight, + handleSetContractFilter, + updateConfig, + indexerDetails, +}) => ( +
+
+ + setIndexerNameField(e.target.value.toLowerCase().trim())} + className="px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-gray-500" + /> +
+ +
+ + +
+ + {!isCreateNewIndexer && ( +
+ + +
+ )} + +
+ + + setBlockHeight(parseInt(e.target.value))} + className="ml-3 px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-gray-500" + /> +
+ {blockHeightError && ( +
+ {blockHeightError} +
+ )} + +
+ + handleSetContractFilter(e.target.value)} + required + disabled={startBlock === "startBlockContinue"} + className={`px-3 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-gray-500 focus:border-gray-500 ${isContractFilterValid ? 'border-gray-300' : 'border-red-500'}`} + /> + {!isContractFilterValid && ( +
+ Please provide a valid contract name. +
+ )} + {startBlock === "startBlockContinue" && ( +
+ Contract filter cannot be changed for "Continue" option. +
+ )} +
+
+); + +export default PublishFormView; diff --git a/frontend/src/components/Modals/PublishModal.jsx b/frontend/src/components/Modals/PublishModal.jsx index 3a262afba..8f5a4df1e 100644 --- a/frontend/src/components/Modals/PublishModal.jsx +++ b/frontend/src/components/Modals/PublishModal.jsx @@ -1,6 +1,6 @@ import React, { useContext, useState } from "react"; import { Button, Modal, Alert } from "react-bootstrap"; -import IndexerConfigOptions from "../Form/IndexerConfigOptionsInputGroup"; +import PublishFormContainer from "./ModalsContainer/PublishFormContainer" import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; import { validateContractIds } from "../../utils/validators"; @@ -9,6 +9,7 @@ export const PublishModal = ({ actionButtonText, }) => { const { + indexerDetails, showPublishModal, setShowPublishModal, } = useContext(IndexerDetailsContext); @@ -23,12 +24,12 @@ export const PublishModal = ({ const register = async () => { if (indexerName === undefined || indexerName === "") { - setError( () => "Please provide an Indexer Name") + setError(() => "Please provide an Indexer Name") return } if (!validateContractIds(indexerConfig.filter)) { - setError( () => "Please provide a valid contract name") + setError(() => "Please provide a valid contract name") return } setError(null) @@ -41,24 +42,37 @@ export const PublishModal = ({ centered={true} show={showPublishModal} onHide={() => setShowPublishModal(false)} + className="bg-gray-50" > - - Enter Indexer Details + + + Enter Indexer Details + - - + + {error && ( - + {error} )} - - - - diff --git a/frontend/src/constants/DurationMap.ts b/frontend/src/constants/DurationMap.ts new file mode 100644 index 000000000..60aef510e --- /dev/null +++ b/frontend/src/constants/DurationMap.ts @@ -0,0 +1,46 @@ +export const TIME_INTERVALS_MAP = new Map([ + ["15s", "Last 15 seconds (15s)"], + ["30s", "Last 30 seconds (30s)"], + ["1m", "Last 1 minute (1m)"], + ["5m", "Last 5 minutes (5m)"], + ["10m", "Last 10 minutes (10m)"], + ["15m", "Last 15 minutes (15m)"], + ["30m", "Last 30 minutes (30m)"], + ["45m", "Last 45 minutes (45m)"], + ["1h", "Last 1 hour (1h)"], + ["3h", "Last 3 hours (3h)"], + ["6h", "Last 6 hours (6h)"], + ["12h", "Last 12 hours (12h)"], + ["1d", "Last 1 day (1d)"], + ["2d", "Last 2 days (2d)"], + ["7d", "Last 7 days (7d)"], + ["14d", "Last 14 days (14d)"], + ["30d", "Last 30 days (30d)"] +]); + +export const DURATION_MAP: { [key: string]: number } = {}; + +TIME_INTERVALS_MAP.forEach((description: string, key: string) => { + let duration: number; + const unit: string = key.slice(-1); + const value: number = parseInt(key.slice(0, -1), 10); + + switch (unit) { + case 's': + duration = value * 1000; + break; + case 'm': + duration = value * 60 * 1000; + break; + case 'h': + duration = value * 60 * 60 * 1000; + break; + case 'd': + duration = value * 24 * 60 * 60 * 1000; + break; + default: + throw new Error(`Unknown unit: ${unit}`); + } + + DURATION_MAP[description] = duration; +}); \ No newline at end of file diff --git a/frontend/src/contexts/IndexerDetailsContext.js b/frontend/src/contexts/IndexerDetailsContext.js index bce401961..d6596dda6 100644 --- a/frontend/src/contexts/IndexerDetailsContext.js +++ b/frontend/src/contexts/IndexerDetailsContext.js @@ -22,7 +22,7 @@ import { getLatestBlockHeight } from "../utils/getLatestBlockHeight"; // } export const IndexerDetailsContext = React.createContext({ - indexerDetails: { code: undefined, schema: undefined, rule: { affected_account_id: "social.near" }, startBlock: "LATEST", accountId: "", indexerName: "" }, + indexerDetails: { code: undefined, schema: undefined, rule: { affected_account_id: "social.near" }, startBlock: "LATEST", accountId: "", indexerName: "", forkedAccountId: null, forkedIndexerName: null }, showResetCodeModel: false, setShowResetCodeModel: () => { }, showPublishModal: false, @@ -39,6 +39,10 @@ export const IndexerDetailsContext = React.createContext({ setAccountId: () => { }, indexerName: undefined, setIndexerName: () => { }, + forkedAccountId: undefined, + setForkedAccountId: () => { }, + forkedIndexerName: undefined, + setForkedIndexerName: () => { }, setIndexerDetails: () => { }, showLogsView: false, setShowLogsView: () => { }, @@ -47,7 +51,9 @@ export const IndexerDetailsContext = React.createContext({ export const IndexerDetailsProvider = ({ children }) => { const [accountId, setAccountId] = useState(undefined); const [indexerName, setIndexerName] = useState(undefined); - const [indexerDetails, setIndexerDetails] = useState({ code: undefined, schema: undefined, rule: { affected_account_id: "social.near" }, startBlock: "LATEST", accountId: accountId, indexerName: indexerName }) + const [forkedAccountId, setForkedAccountId] = useState(undefined); + const [forkedIndexerName, setForkedIndexerName] = useState(undefined); + const [indexerDetails, setIndexerDetails] = useState({ code: undefined, schema: undefined, rule: { affected_account_id: "social.near" }, startBlock: "LATEST", accountId: accountId, indexerName: indexerName, forkedAccountId: forkedAccountId, forkedIndexerName: forkedIndexerName }) const [showResetCodeModel, setShowResetCodeModel] = useState(false); const [showPublishModal, setShowPublishModal] = useState(false); const [showForkIndexerModal, setShowForkIndexerModal] = useState(false); @@ -68,6 +74,8 @@ export const IndexerDetailsProvider = ({ children }) => { const details = { accountId: accountId, indexerName: indexerName, + forkedAccountId: data.forked_from?.account_id, + forkedIndexerName: data.forked_from?.function_name, code: wrapCode(data.code), schema: data.schema, startBlock: data.start_block, @@ -89,6 +97,8 @@ export const IndexerDetailsProvider = ({ children }) => { ...prevDetails, accountId: accountId, indexerName: indexerName, + forkedAccountId: forkedAccountId, + forkedIndexerName: forkedIndexerName, })); return } @@ -97,6 +107,8 @@ export const IndexerDetailsProvider = ({ children }) => { const details = { accountId: indexer.accountId, indexerName: indexer.indexerName, + forkedAccountId: indexer.forkedAccountId, + forkedIndexerName: indexer.forkedIndexerName, code: indexer.code, schema: indexer.schema, startBlock: indexer.startBlock, @@ -105,7 +117,7 @@ export const IndexerDetailsProvider = ({ children }) => { setIndexerDetails(details); })(); - }, [accountId, indexerName, isCreateNewIndexer]); + }, [accountId, indexerName, forkedAccountId, forkedIndexerName, isCreateNewIndexer]); return ( { indexerName, setAccountId, setIndexerName, + setForkedAccountId, + setForkedIndexerName, indexerDetails, showResetCodeModel, setShowResetCodeModel, diff --git a/frontend/src/pages/_app.jsx b/frontend/src/pages/_app.jsx index 000fbe924..952c40e19 100644 --- a/frontend/src/pages/_app.jsx +++ b/frontend/src/pages/_app.jsx @@ -10,9 +10,10 @@ import { IndexerDetailsProvider } from '../contexts/IndexerDetailsContext'; import 'regenerator-runtime/runtime'; import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client'; overrideLocalStorage(); +import "./global.css"; export default function App({ Component, pageProps }) { - + const client = new ApolloClient({ uri: `${process.env.NEXT_PUBLIC_HASURA_ENDPOINT}/v1/graphql`, cache: new InMemoryCache() diff --git a/frontend/src/pages/global.css b/frontend/src/pages/global.css index bcf21ebb3..130048544 100644 --- a/frontend/src/pages/global.css +++ b/frontend/src/pages/global.css @@ -1,5 +1,8 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; +/* Override Tailwind CSS collapse class */ +.accordion-collapse.collapse { + @apply visible; + } diff --git a/frontend/src/pages/query-api-editor/index.js b/frontend/src/pages/query-api-editor/index.js index 097d94c9d..a733ce2d3 100644 --- a/frontend/src/pages/query-api-editor/index.js +++ b/frontend/src/pages/query-api-editor/index.js @@ -3,7 +3,7 @@ import Editor from "../../components/Editor"; import { withRouter } from 'next/router' import { Alert } from 'react-bootstrap'; import { IndexerDetailsContext } from '../../contexts/IndexerDetailsContext'; -import IndexerLogs from "../../components/Logs/IndexerLogs"; +import IndexerLogsContainer from '../../components/Logs/LogsViewContainer/IndexerLogsContainer' const QueryApiEditorPage = ({ router }) => { const { accountId, indexerName } = router.query @@ -29,7 +29,7 @@ const QueryApiEditorPage = ({ router }) => { return ( <> {showLogsView ? ( - + ) : ( )} diff --git a/frontend/src/utils/calculateBlockTimeDifference.ts b/frontend/src/utils/calculateBlockTimeDifference.ts new file mode 100644 index 000000000..e0c375f5b --- /dev/null +++ b/frontend/src/utils/calculateBlockTimeDifference.ts @@ -0,0 +1,25 @@ +export const calculateBlockTimeDifference = (latestBlockHeight: number, currentBlockHeight: number): string => { + const averageBlockTimeSeconds: number = 1.3; + const blocksDifference: number = Math.abs(currentBlockHeight - latestBlockHeight); + + const timeDifferenceSeconds: number = blocksDifference * averageBlockTimeSeconds; + + const days: number = Math.floor(timeDifferenceSeconds / (3600 * 24)); + const hours: number = Math.floor((timeDifferenceSeconds % (3600 * 24)) / 3600); + const minutes: number = Math.floor((timeDifferenceSeconds % 3600) / 60); + const seconds: number = Math.floor(timeDifferenceSeconds % 60); + + let timeDifferenceString: string = ''; + if (days > 0) { + timeDifferenceString += `${days}day${days > 1 ? 's' : ''} `; + } + if (hours > 0) { + timeDifferenceString += `${hours}hr${hours > 1 ? 's' : ''} `; + } + if (minutes > 0 || hours > 0) { + timeDifferenceString += `${minutes}min${minutes > 1 ? 's' : ''} `; + } + timeDifferenceString += `${seconds}s`; + + return timeDifferenceString.trim(); +} diff --git a/frontend/src/utils/calculateTimestamp.ts b/frontend/src/utils/calculateTimestamp.ts new file mode 100644 index 000000000..cfd9c1bc1 --- /dev/null +++ b/frontend/src/utils/calculateTimestamp.ts @@ -0,0 +1,12 @@ +import { DURATION_MAP } from '../constants/DurationMap'; + +export const calculateTimestamp = (selectedOption: string): string => { + const currentTime: number = Date.now(); + const duration: number | undefined = DURATION_MAP[selectedOption]; + if (duration !== undefined) { + return new Date(currentTime - duration).toISOString(); + } else { + console.log('invalid option'); + return ""; + } +}; diff --git a/frontend/src/utils/formatTimestamp.ts b/frontend/src/utils/formatTimestamp.ts new file mode 100644 index 000000000..dfb49cb70 --- /dev/null +++ b/frontend/src/utils/formatTimestamp.ts @@ -0,0 +1,15 @@ +export const formatTimestamp = (timestamp: string): string => { + const date = new Date(timestamp); + + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + + const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); + + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`; +}; diff --git a/frontend/src/utils/helpers.ts b/frontend/src/utils/helpers.ts new file mode 100644 index 000000000..f226814ed --- /dev/null +++ b/frontend/src/utils/helpers.ts @@ -0,0 +1 @@ +export const sanitizeString = (str: string) => str.replace(/[^a-zA-Z0-9]/g, '_').replace(/^([0-9])/, '_$1'); diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index 4b009fdd7..e259076c2 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -1,17 +1,71 @@ +/* eslint-disable */ module.exports = { - content: ["./src/**/*.{js,jsx,ts,tsx}"], + purge: ['./src/**/*.{js,jsx,ts,tsx}'], + darkMode: false, theme: { extend: { colors: { - primary: "#f7f9fb", //light white - near: "#6be79f", - nightmode: { - primary: "#1e1e1e", //monaco editor dark - secondary: "#bb85fb", //some light purple - secondaryhover: "#3700b3" //some dark purple - } + transparent: 'transparent', + current: 'currentColor', + green: { + 50: '#f0fdf4', + 100: '#dcfce7', + 900: '#22543d', + }, + black: '#000000', + white: '#ffffff', + gray: { + 50: '#fafafa', + 100: '#f3f4f6', + 900: '#111827', + }, + primary: { + light: '#6ee7b7', + DEFAULT: '#38b2ac', + dark: '#0d9488', + }, + secondary: { + light: '#d6bcfa', + DEFAULT: '#a78bfa', + dark: '#6a4f9e', + }, + }, + fontFamily: { + sans: ['Inter', 'sans-serif'], + serif: ['Georgia', 'serif'], + }, + fontSize: { + xs: '0.75rem', + sm: '0.875rem', + base: '1rem', + lg: '1.125rem', + xl: '1.25rem', + '2xl': '1.5rem', + '3xl': '1.875rem', + '4xl': '2.25rem', + '5xl': '3rem', + '6xl': '4rem', + '7xl': '5rem', + }, + spacing: { + px: '1px', + 0: '0', + 1: '0.25rem', + 2: '0.5rem', + 3: '0.75rem', + 4: '1rem', + 5: '1.25rem', + 6: '1.5rem', + 8: '2rem', + 10: '2.5rem', + }, + transformOrigin: { + 'top-left': 'top left', }, }, }, + variants: { + extend: {}, + }, plugins: [], -}; \ No newline at end of file +}; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 52ff25187..92476e89f 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -16,8 +20,12 @@ "incremental": true, "baseUrl": ".", "paths": { - "@/*": ["./src/*"], - "@mui/styled-engine": ["./node_modules/@mui/styled-engine-sc"] + "@/*": [ + "./src/*" + ], + "@mui/styled-engine": [ + "./node_modules/@mui/styled-engine-sc" + ] } }, "include": [ @@ -25,5 +33,7 @@ "**/*.ts", "**/*.tsx" ], - "exclude": ["node_modules"] -} + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/frontend/widgets/examples/feed/src/QueryApi.Feed.ActivityPage.jsx b/frontend/widgets/examples/feed/src/QueryApi.Feed.ActivityPage.jsx index 52b2afc52..41fdfe6f3 100644 --- a/frontend/widgets/examples/feed/src/QueryApi.Feed.ActivityPage.jsx +++ b/frontend/widgets/examples/feed/src/QueryApi.Feed.ActivityPage.jsx @@ -21,7 +21,7 @@ if (props.tab && props.tab !== state.selectedTab) { }); } -const activityUrl = `/#/${APP_OWNER}/widget/QueryApi.Feed`; +const activityUrl = `/${APP_OWNER}/widget/QueryApi.Feed`; const Wrapper = styled.div` margin-top: calc(var(--body-top-padding) * -1); diff --git a/frontend/widgets/src/QueryApi.Dashboard.jsx b/frontend/widgets/src/QueryApi.Dashboard.jsx index 6fff8d4a2..5b39a4b29 100644 --- a/frontend/widgets/src/QueryApi.Dashboard.jsx +++ b/frontend/widgets/src/QueryApi.Dashboard.jsx @@ -324,8 +324,8 @@ const selectIndexerPage = (viewName) => { }); }; const indexerView = (accountId, indexerName) => { - const editUrl = `https://near.org/#/${REPL_ACCOUNT_ID}/widget/QueryApi.App?selectedIndexerPath=${accountId}/${indexerName}`; - const statusUrl = `https://near.org/#/${REPL_ACCOUNT_ID}/widget/QueryApi.App?selectedIndexerPath=${accountId}/${indexerName}&view=indexer&activeIndexerView=status`; + const editUrl = `https://dev.near.org/${REPL_ACCOUNT_ID}/widget/QueryApi.App?selectedIndexerPath=${accountId}/${indexerName}`; + const statusUrl = `https://dev.near.org/${REPL_ACCOUNT_ID}/widget/QueryApi.App?selectedIndexerPath=${accountId}/${indexerName}&view=indexer&activeIndexerView=status`; const playgroundLink = `https://cloud.hasura.io/public/graphiql?endpoint=${REPL_GRAPHQL_ENDPOINT}/v1/graphql&header=x-hasura-role%3A${accountId.replaceAll( ".", "_" @@ -406,7 +406,7 @@ return (
selectTab("explore")} > @@ -429,7 +429,7 @@ return (
{ State.update({ diff --git a/frontend/widgets/src/QueryApi.Editor.jsx b/frontend/widgets/src/QueryApi.Editor.jsx index e7ab3f47c..73544babe 100644 --- a/frontend/widgets/src/QueryApi.Editor.jsx +++ b/frontend/widgets/src/QueryApi.Editor.jsx @@ -18,7 +18,7 @@ const initialPayload = { const registerFunctionHandler = (request, response) => { const gas = 200000000000000; - const { indexerName, code, schema, startBlock, contractFilter } = + const { indexerName, code, schema, startBlock, contractFilter, forkedFrom } = request.payload; const jsonFilter = `{"indexer_rule_kind":"Action","matching_rule":{"rule":"ACTION_ANY","affected_account_id":"${contractFilter || "social.near"}","status":"SUCCESS"}}` @@ -35,7 +35,8 @@ const registerFunctionHandler = (request, response) => { kind: "ACTION_ANY", affected_account_id: contractFilter, status: "SUCCESS" - } + }, + ...(forkedFrom && { forked_from: forkedFrom }), }, gas ); diff --git a/frontend/widgets/src/QueryApi.IndexerCard.jsx b/frontend/widgets/src/QueryApi.IndexerCard.jsx index 191f688a1..89a781017 100644 --- a/frontend/widgets/src/QueryApi.IndexerCard.jsx +++ b/frontend/widgets/src/QueryApi.IndexerCard.jsx @@ -1,7 +1,7 @@ const accountId = props.accountId || context.accountId; const indexerName = props.indexerName; -const editUrl = `https://near.org/#/${REPL_ACCOUNT_ID}/widget/QueryApi.App?selectedIndexerPath=${accountId}/${indexerName}`; -const statusUrl = `https://near.org/#/${REPL_ACCOUNT_ID}/widget/QueryApi.App?selectedIndexerPath=${accountId}/${indexerName}&view=indexer&activeIndexerView=status`; +const editUrl = `https://dev.near.org/${REPL_ACCOUNT_ID}/widget/QueryApi.App?selectedIndexerPath=${accountId}/${indexerName}`; +const statusUrl = `https://dev.near.org/${REPL_ACCOUNT_ID}/widget/QueryApi.App?selectedIndexerPath=${accountId}/${indexerName}&view=indexer&activeIndexerView=status`; const playgroundLink = `https://cloud.hasura.io/public/graphiql?endpoint=${REPL_GRAPHQL_ENDPOINT}/v1/graphql&header=x-hasura-role%3A${accountId.replaceAll( ".", "_" diff --git a/frontend/widgets/src/QueryApi.IndexerExplorer.jsx b/frontend/widgets/src/QueryApi.IndexerExplorer.jsx index 8f4e0529f..f21490d72 100644 --- a/frontend/widgets/src/QueryApi.IndexerExplorer.jsx +++ b/frontend/widgets/src/QueryApi.IndexerExplorer.jsx @@ -254,7 +254,7 @@ return (

To learn more about QueryAPI, visit - + QueryAPI Docs

diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 8c57c6c84..91c666f53 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@alloc/quick-lru@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" @@ -21,9 +16,9 @@ "@jridgewell/trace-mapping" "^0.3.24" "@apollo/client@^3.8.7": - version "3.9.11" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.9.11.tgz#737e5c35c21d6f3b78423033ad81837a8a6992e0" - integrity sha512-H7e9m7cRcFO93tokwzqrsbnfKorkpV24xU30hFH5u2g6B+c1DMo/ouyF/YrBPdrTzqxQCjTUmds/FLmJ7626GA== + version "3.10.4" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.10.4.tgz#1abc488c79cf37dc63edf041aee6f9dc5aabc692" + integrity sha512-51gk0xOwN6Ls1EbTG5svFva1kdm2APHYTzmFhaAdvUQoJFDxfc0UwQgDxGptzH84vkPlo1qunY1FuboyF9LI3Q== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/caches" "^1.0.0" @@ -33,103 +28,103 @@ hoist-non-react-statics "^3.3.2" optimism "^0.18.0" prop-types "^15.7.2" - rehackt "0.0.6" + rehackt "^0.1.0" response-iterator "^0.2.6" symbol-observable "^4.0.0" ts-invariant "^0.10.3" tslib "^2.3.0" zen-observable-ts "^1.2.5" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" + integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== dependencies: - "@babel/highlight" "^7.24.2" + "@babel/highlight" "^7.24.6" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.6.tgz#b3600217688cabb26e25f8e467019e66d71b7ae2" + integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717" - integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg== + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.6.tgz#8650e0e4b03589ebe886c4e4a60398db0a7ec787" + integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.24.4" - "@babel/parser" "^7.24.4" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helpers" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/template" "^7.24.6" + "@babel/traverse" "^7.24.6" + "@babel/types" "^7.24.6" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.1", "@babel/generator@^7.24.4", "@babel/generator@^7.7.2": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" - integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== +"@babel/generator@^7.24.6", "@babel/generator@^7.7.2": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.6.tgz#dfac82a228582a9d30c959fe50ad28951d4737a7" + integrity sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg== dependencies: - "@babel/types" "^7.24.0" + "@babel/types" "^7.24.6" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +"@babel/helper-annotate-as-pure@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz#517af93abc77924f9b2514c407bbef527fb8938d" + integrity sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.6" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz#19e9089ee87b0d0928012c83961a8deef4b0223f" + integrity sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.24.6" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz#4a51d681f7680043d38e212715e2a7b1ad29cb51" + integrity sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" + "@babel/compat-data" "^7.24.6" + "@babel/helper-validator-option" "^7.24.6" browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3" - integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" +"@babel/helper-create-class-features-plugin@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz#c50b86fa1c4ca9b7a890dc21884f097b6c4b5286" + integrity sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.6" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-function-name" "^7.24.6" + "@babel/helper-member-expression-to-functions" "^7.24.6" + "@babel/helper-optimise-call-expression" "^7.24.6" + "@babel/helper-replace-supers" "^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz#47d382dec0d49e74ca1b6f7f3b81f5968022a3c8" + integrity sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.6" regexpu-core "^5.3.1" semver "^6.3.1" @@ -144,181 +139,180 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz#ac7ad5517821641550f6698dd5468f8cef78620d" + integrity sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g== + +"@babel/helper-function-name@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz#cebdd063386fdb95d511d84b117e51fc68fec0c8" + integrity sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" -"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== +"@babel/helper-hoist-variables@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz#8a7ece8c26756826b6ffcdd0e3cf65de275af7f9" + integrity sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA== dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" + "@babel/types" "^7.24.6" -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== +"@babel/helper-member-expression-to-functions@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz#86084f3e0e4e2169a134754df3870bc7784db71e" + integrity sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.6" + +"@babel/helper-module-imports@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz#65e54ffceed6a268dc4ce11f0433b82cfff57852" + integrity sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g== + dependencies: + "@babel/types" "^7.24.6" -"@babel/helper-member-expression-to-functions@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" - integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== +"@babel/helper-module-transforms@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz#22346ed9df44ce84dee850d7433c5b73fab1fe4e" + integrity sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA== dependencies: - "@babel/types" "^7.23.0" - -"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-module-imports" "^7.24.6" + "@babel/helper-simple-access" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a" - integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== - -"@babel/helper-remap-async-to-generator@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" - integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.23.4": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helper-wrap-function@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" - integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== - dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.15" - "@babel/types" "^7.22.19" - -"@babel/helpers@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6" - integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== +"@babel/helper-optimise-call-expression@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz#f7836e3ccca3dfa02f15d2bc8b794efe75a5256e" + integrity sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA== dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.1" - "@babel/types" "^7.24.0" - -"@babel/highlight@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" - integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/types" "^7.24.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.6", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz#fa02a32410a15a6e8f8185bcbf608f10528d2a24" + integrity sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg== + +"@babel/helper-remap-async-to-generator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz#c96ceb9846e877d806ce82a1521230ea7e0fc354" + integrity sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.6" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-wrap-function" "^7.24.6" + +"@babel/helper-replace-supers@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz#3ea87405a2986a49ab052d10e540fe036d747c71" + integrity sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-member-expression-to-functions" "^7.24.6" + "@babel/helper-optimise-call-expression" "^7.24.6" + +"@babel/helper-simple-access@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz#1d6e04d468bba4fc963b4906f6dac6286cfedff1" + integrity sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g== + dependencies: + "@babel/types" "^7.24.6" + +"@babel/helper-skip-transparent-expression-wrappers@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz#c47e9b33b7ea50d1073e125ebc26661717cb7040" + integrity sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q== + dependencies: + "@babel/types" "^7.24.6" + +"@babel/helper-split-export-declaration@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz#e830068f7ba8861c53b7421c284da30ae656d7a3" + integrity sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw== + dependencies: + "@babel/types" "^7.24.6" + +"@babel/helper-string-parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz#28583c28b15f2a3339cfafafeaad42f9a0e828df" + integrity sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q== + +"@babel/helper-validator-identifier@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" + integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== + +"@babel/helper-validator-option@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz#59d8e81c40b7d9109ab7e74457393442177f460a" + integrity sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ== + +"@babel/helper-wrap-function@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz#c27af1006e310683fdc76b668a0a1f6003e36217" + integrity sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ== + dependencies: + "@babel/helper-function-name" "^7.24.6" + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + +"@babel/helpers@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.6.tgz#cd124245299e494bd4e00edda0e4ea3545c2c176" + integrity sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA== + dependencies: + "@babel/template" "^7.24.6" + "@babel/types" "^7.24.6" + +"@babel/highlight@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.6.tgz#6d610c1ebd2c6e061cade0153bf69b0590b7b3df" + integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== + dependencies: + "@babel/helper-validator-identifier" "^7.24.6" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" - integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" + integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1" - integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz#283a74ef365b1e954cda6b2724c678a978215e88" + integrity sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" - integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz#f9f5ae4d6fb72f5950262cb6f0b2482c3bc684ef" + integrity sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" - integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz#ab9be6edfffa127bd5ec4317c76c5af0f8fc7e6c" + integrity sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.6" + "@babel/plugin-transform-optional-chaining" "^7.24.6" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" - integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz#0faf879249ec622d7f1c42eaebf7d11197401b2c" + integrity sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -367,19 +361,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" - integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== +"@babel/plugin-syntax-import-assertions@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz#52521c1c1698fc2dd9cf88f7a4dd86d4d041b9e1" + integrity sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" - integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== +"@babel/plugin-syntax-import-attributes@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz#12aba325534129584672920274fefa4dc2d5f68e" + integrity sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -395,12 +389,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== +"@babel/plugin-syntax-jsx@^7.24.6", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz#bcca2964150437f88f65e3679e3d68762287b9c8" + integrity sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -459,11 +453,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz#769daf2982d60308bc83d8936eaecb7582463c87" + integrity sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -473,447 +467,447 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" - integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== +"@babel/plugin-transform-arrow-functions@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz#93607d1ef5b81c70af174aff3532d57216367492" + integrity sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" - integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== +"@babel/plugin-transform-async-generator-functions@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz#fa4a9e5c3a7f60f697ba36587b6c41b04f507d84" + integrity sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-remap-async-to-generator" "^7.24.6" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" - integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== +"@babel/plugin-transform-async-to-generator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz#eb11434b11d73d8c0cf9f71a6f4f1e6ba441df35" + integrity sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g== dependencies: - "@babel/helper-module-imports" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-module-imports" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-remap-async-to-generator" "^7.24.6" -"@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" - integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== +"@babel/plugin-transform-block-scoped-functions@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz#975555b5bfa9870b1218da536d1528735f1f8c56" + integrity sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-block-scoping@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012" - integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== +"@babel/plugin-transform-block-scoping@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz#a03ec8a4591c2b43cf7798bc633e698293fda179" + integrity sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" - integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== +"@babel/plugin-transform-class-properties@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz#d9f394e97e88ef905d5a1e5e7a16238621b7982e" + integrity sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== +"@babel/plugin-transform-class-static-block@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz#f43f29286f6f0dca33d18fd5033b817d6c3fa816" + integrity sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1" - integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.22.6" +"@babel/plugin-transform-classes@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz#0cc198c02720d4eeb091004843477659c6b37977" + integrity sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.6" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-function-name" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-replace-supers" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" - integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== +"@babel/plugin-transform-computed-properties@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz#7a1765c01cdfe59c320d2d0f37a4dc4aecd14df1" + integrity sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/template" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/template" "^7.24.6" -"@babel/plugin-transform-destructuring@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345" - integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== +"@babel/plugin-transform-destructuring@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz#bdd1a6c90ffb2bfd13b6007b13316eeafc97cb53" + integrity sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" - integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== +"@babel/plugin-transform-dotall-regex@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz#5a6b3148ec5f4f274ff48cebea90565087cad126" + integrity sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" - integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== +"@babel/plugin-transform-duplicate-keys@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz#2716301227cf7cd4fdadcbe4353ce191f8b3dc8a" + integrity sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" - integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== +"@babel/plugin-transform-dynamic-import@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz#b477177761d56b15a4ba42a83be31cf72d757acf" + integrity sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" - integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== +"@babel/plugin-transform-exponentiation-operator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz#011e9e1a429f91b024af572530873ca571f9ef06" + integrity sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-export-namespace-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" - integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== +"@babel/plugin-transform-export-namespace-from@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz#b64ded74d9afb3db5d47d93996c4df69f15ac97c" + integrity sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" - integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== +"@babel/plugin-transform-for-of@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz#7f31780bd0c582b546372c0c0da9d9d56731e0a2" + integrity sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.6" -"@babel/plugin-transform-function-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" - integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== +"@babel/plugin-transform-function-name@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz#60d1de3f6fd816a3e3bf9538578a64527e1b9c97" + integrity sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-function-name" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" - integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== +"@babel/plugin-transform-json-strings@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz#a84639180ea1f9001bb5e6dc01921235ab05ad8b" + integrity sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" - integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== +"@babel/plugin-transform-literals@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz#7f44f2871d7a4456030b0540858046f0b7bc6b18" + integrity sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" - integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== +"@babel/plugin-transform-logical-assignment-operators@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz#9cc7baa5629866566562c159dc1eae7569810f33" + integrity sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" - integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== +"@babel/plugin-transform-member-expression-literals@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz#5d3681ca201ac6909419cc51ac082a6ba4c5c756" + integrity sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" - integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== +"@babel/plugin-transform-modules-amd@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz#09aeac7acb7913496aaaafdc64f40683e0db7e41" + integrity sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-modules-commonjs@^7.23.3", "@babel/plugin-transform-modules-commonjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" - integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== +"@babel/plugin-transform-modules-commonjs@^7.23.3", "@babel/plugin-transform-modules-commonjs@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz#1b8269902f25bd91ca6427230d4735ddd1e1283e" + integrity sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-simple-access" "^7.24.6" -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" - integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== +"@babel/plugin-transform-modules-systemjs@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz#c54eb53fe16f9b82d320abd76762d0320e3f9393" + integrity sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w== dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-hoist-variables" "^7.24.6" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" - integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== +"@babel/plugin-transform-modules-umd@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz#c4ef8b6d4da230b8dc87e81cd66986728952f89b" + integrity sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz#352ee2861ab8705320029f80238cf26a92ba65d5" + integrity sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" - integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== +"@babel/plugin-transform-new-target@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz#fc024294714705113720d5e3dc0f9ad7abdbc289" + integrity sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" - integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz#12b83b3cdfd1cd2066350e36e4fb912ab194545e" + integrity sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" - integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== +"@babel/plugin-transform-numeric-separator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz#d9115669cc85aa91fbfb15f88f2226332cf4946a" + integrity sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff" - integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== +"@babel/plugin-transform-object-rest-spread@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz#68d763f69955f9e599c405c6c876f5be46b47d8a" + integrity sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.1" + "@babel/plugin-transform-parameters" "^7.24.6" -"@babel/plugin-transform-object-super@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" - integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== +"@babel/plugin-transform-object-super@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz#9cbe6f995bed343a7ab8daf0416dac057a9c3e27" + integrity sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-replace-supers" "^7.24.6" -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" - integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== +"@babel/plugin-transform-optional-catch-binding@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz#c81e90a971aad898e56f2b75a358e6c4855aeba3" + integrity sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6" - integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== +"@babel/plugin-transform-optional-chaining@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz#3d636b3ed8b5a506f93e4d4675fc95754d7594f5" + integrity sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.6" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510" - integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== +"@babel/plugin-transform-parameters@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz#7aee86dfedd2fc0136fecbe6f7649fc02d86ab22" + integrity sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-private-methods@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" - integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== +"@babel/plugin-transform-private-methods@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz#258e1f859a52ff7b30ad556598224c192defcda7" + integrity sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-private-property-in-object@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a" - integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== +"@babel/plugin-transform-private-property-in-object@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz#59ff09a099f62213112cf348e96b6b11957d1f28" + integrity sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.24.6" + "@babel/helper-create-class-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" - integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== +"@babel/plugin-transform-property-literals@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz#243c4faabe811c405e9443059a58e834bf95dfd1" + integrity sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-react-display-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" - integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== +"@babel/plugin-transform-react-display-name@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.6.tgz#2a10c732c2c87a8f06e4413fb4a14e76e6c67a99" + integrity sha512-/3iiEEHDsJuj9QU09gbyWGSUxDboFcD7Nj6dnHIlboWSodxXAoaY/zlNMHeYAC0WsERMqgO9a7UaM77CsYgWcg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== +"@babel/plugin-transform-react-jsx-development@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.6.tgz#e662058e8795b5fccd24c5bdd2b328728aef3305" + integrity sha512-F7EsNp5StNDouSSdYyDSxh4J+xvj/JqG+Cb6s2fA+jCyHOzigG5vTwgH8tU2U8Voyiu5zCG9bAK49wTr/wPH0w== dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.24.6" -"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== +"@babel/plugin-transform-react-jsx@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.6.tgz#4ca3660ca663d20095455571615d6263986cdfe4" + integrity sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" + "@babel/helper-annotate-as-pure" "^7.24.6" + "@babel/helper-module-imports" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/plugin-syntax-jsx" "^7.24.6" + "@babel/types" "^7.24.6" -"@babel/plugin-transform-react-pure-annotations@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" - integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== +"@babel/plugin-transform-react-pure-annotations@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.6.tgz#d2bad8d70c3635cb63a69ee66c9c891f9392435c" + integrity sha512-0HoDQlFJJkXRyV2N+xOpUETbKHcouSwijRQbKWVtxsPoq5bbB30qZag9/pSc5xcWVYjTHlLsBsY+hZDnzQTPNw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" - integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== +"@babel/plugin-transform-regenerator@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz#ed10cf0c13619365e15459f88d1b915ac57ffc24" + integrity sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" - integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== +"@babel/plugin-transform-reserved-words@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz#9eb16cbf339fcea0a46677716c775afb5ef14245" + integrity sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-shorthand-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" - integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== +"@babel/plugin-transform-shorthand-properties@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz#ef734ebccc428d2174c7bb36015d0800faf5381e" + integrity sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" - integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== +"@babel/plugin-transform-spread@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz#a56cecbd8617675531d1b79f5b755b7613aa0822" + integrity sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.6" -"@babel/plugin-transform-sticky-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" - integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== +"@babel/plugin-transform-sticky-regex@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz#1a78127731fea87d954bed193840986a38f04327" + integrity sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-template-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" - integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== +"@babel/plugin-transform-template-literals@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz#aaf2ae157acd0e5c9265dba8ac0a439f8d2a6303" + integrity sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-typeof-symbol@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7" - integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== +"@babel/plugin-transform-typeof-symbol@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz#3d02da23ebcc8f1982ddcd1f2581cf3ee4e58762" + integrity sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" - integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== +"@babel/plugin-transform-unicode-escapes@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz#c8ddca8fd5bacece837a4e27bd3b7ed64580d1a8" + integrity sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" - integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== +"@babel/plugin-transform-unicode-property-regex@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz#e66297d5d452db0b0be56515e3d0e10b7d33fb32" + integrity sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-unicode-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" - integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== +"@babel/plugin-transform-unicode-regex@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz#2001e7d87ed709eea145e0b65fb5f93c3c0e225b" + integrity sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" - integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== +"@babel/plugin-transform-unicode-sets-regex@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz#f18b7292222aee85c155258ceb345a146a070a46" + integrity sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" "@babel/preset-env@^7.23.9": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b" - integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== - dependencies: - "@babel/compat-data" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.6.tgz#a5a55bc70e5ff1ed7f872067e2a9d65ff917ad6f" + integrity sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg== + dependencies: + "@babel/compat-data" "^7.24.6" + "@babel/helper-compilation-targets" "^7.24.6" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-validator-option" "^7.24.6" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.6" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.6" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" + "@babel/plugin-syntax-import-assertions" "^7.24.6" + "@babel/plugin-syntax-import-attributes" "^7.24.6" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -925,54 +919,54 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.4" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.1" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.1" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.1" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.1" - "@babel/plugin-transform-parameters" "^7.24.1" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.1" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.1" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/plugin-transform-arrow-functions" "^7.24.6" + "@babel/plugin-transform-async-generator-functions" "^7.24.6" + "@babel/plugin-transform-async-to-generator" "^7.24.6" + "@babel/plugin-transform-block-scoped-functions" "^7.24.6" + "@babel/plugin-transform-block-scoping" "^7.24.6" + "@babel/plugin-transform-class-properties" "^7.24.6" + "@babel/plugin-transform-class-static-block" "^7.24.6" + "@babel/plugin-transform-classes" "^7.24.6" + "@babel/plugin-transform-computed-properties" "^7.24.6" + "@babel/plugin-transform-destructuring" "^7.24.6" + "@babel/plugin-transform-dotall-regex" "^7.24.6" + "@babel/plugin-transform-duplicate-keys" "^7.24.6" + "@babel/plugin-transform-dynamic-import" "^7.24.6" + "@babel/plugin-transform-exponentiation-operator" "^7.24.6" + "@babel/plugin-transform-export-namespace-from" "^7.24.6" + "@babel/plugin-transform-for-of" "^7.24.6" + "@babel/plugin-transform-function-name" "^7.24.6" + "@babel/plugin-transform-json-strings" "^7.24.6" + "@babel/plugin-transform-literals" "^7.24.6" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.6" + "@babel/plugin-transform-member-expression-literals" "^7.24.6" + "@babel/plugin-transform-modules-amd" "^7.24.6" + "@babel/plugin-transform-modules-commonjs" "^7.24.6" + "@babel/plugin-transform-modules-systemjs" "^7.24.6" + "@babel/plugin-transform-modules-umd" "^7.24.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.6" + "@babel/plugin-transform-new-target" "^7.24.6" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.6" + "@babel/plugin-transform-numeric-separator" "^7.24.6" + "@babel/plugin-transform-object-rest-spread" "^7.24.6" + "@babel/plugin-transform-object-super" "^7.24.6" + "@babel/plugin-transform-optional-catch-binding" "^7.24.6" + "@babel/plugin-transform-optional-chaining" "^7.24.6" + "@babel/plugin-transform-parameters" "^7.24.6" + "@babel/plugin-transform-private-methods" "^7.24.6" + "@babel/plugin-transform-private-property-in-object" "^7.24.6" + "@babel/plugin-transform-property-literals" "^7.24.6" + "@babel/plugin-transform-regenerator" "^7.24.6" + "@babel/plugin-transform-reserved-words" "^7.24.6" + "@babel/plugin-transform-shorthand-properties" "^7.24.6" + "@babel/plugin-transform-spread" "^7.24.6" + "@babel/plugin-transform-sticky-regex" "^7.24.6" + "@babel/plugin-transform-template-literals" "^7.24.6" + "@babel/plugin-transform-typeof-symbol" "^7.24.6" + "@babel/plugin-transform-unicode-escapes" "^7.24.6" + "@babel/plugin-transform-unicode-property-regex" "^7.24.6" + "@babel/plugin-transform-unicode-regex" "^7.24.6" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.6" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.4" @@ -990,21 +984,21 @@ esutils "^2.0.2" "@babel/preset-react@^7.23.3": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" - integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.6.tgz#92eace66dce577e5263113eb82235a0d45096cae" + integrity sha512-8mpzh1bWvmINmwM3xpz6ahu57mNaWavMm+wBNjQ4AFu1nghKBiIRET7l/Wmj4drXany/BBGjJZngICcD98F1iw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-react-display-name" "^7.24.1" - "@babel/plugin-transform-react-jsx" "^7.23.4" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.6" + "@babel/helper-validator-option" "^7.24.6" + "@babel/plugin-transform-react-display-name" "^7.24.6" + "@babel/plugin-transform-react-jsx" "^7.24.6" + "@babel/plugin-transform-react-jsx-development" "^7.24.6" + "@babel/plugin-transform-react-pure-annotations" "^7.24.6" "@babel/register@^7.23.7": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.23.7.tgz#485a5e7951939d21304cae4af1719fdb887bc038" - integrity sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ== + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.24.6.tgz#59e21dcc79e1d04eed5377633b0f88029a6bef9e" + integrity sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -1018,44 +1012,44 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.13.10", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.6.tgz#5b76eb89ad45e2e4a0a8db54c456251469a3358e" + integrity sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" - integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== - dependencies: - "@babel/code-frame" "^7.24.1" - "@babel/generator" "^7.24.1" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.24.1" - "@babel/types" "^7.24.0" +"@babel/template@^7.24.6", "@babel/template@^7.3.3": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.6.tgz#048c347b2787a6072b24c723664c8d02b67a44f9" + integrity sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" + +"@babel/traverse@^7.24.6": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.6.tgz#0941ec50cdeaeacad0911eb67ae227a4f8424edc" + integrity sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw== + dependencies: + "@babel/code-frame" "^7.24.6" + "@babel/generator" "^7.24.6" + "@babel/helper-environment-visitor" "^7.24.6" + "@babel/helper-function-name" "^7.24.6" + "@babel/helper-hoist-variables" "^7.24.6" + "@babel/helper-split-export-declaration" "^7.24.6" + "@babel/parser" "^7.24.6" + "@babel/types" "^7.24.6" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" - integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" + integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ== dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.24.6" + "@babel/helper-validator-identifier" "^7.24.6" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1063,10 +1057,10 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@emotion/is-prop-valid@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== +"@emotion/is-prop-valid@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337" + integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== dependencies: "@emotion/memoize" "^0.8.1" @@ -1087,24 +1081,24 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== -"@emotion/unitless@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== +"@emotion/unitless@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" + integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== -"@eslint/eslintrc@^2.1.2": +"@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== @@ -1119,37 +1113,37 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.50.0": - version "8.50.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.50.0.tgz#9e93b850f0f3fa35f5fa59adfd03adae8488e484" - integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@floating-ui/core@^1.0.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" - integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + version "1.6.2" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.2.tgz#d37f3e0ac1f1c756c7de45db13303a266226851a" + integrity sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg== dependencies: - "@floating-ui/utils" "^0.2.1" + "@floating-ui/utils" "^0.2.0" -"@floating-ui/dom@^1.6.1": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef" - integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw== +"@floating-ui/dom@^1.0.0": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.5.tgz#323f065c003f1d3ecf0ff16d2c2c4d38979f4cb9" + integrity sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw== dependencies: "@floating-ui/core" "^1.0.0" "@floating-ui/utils" "^0.2.0" "@floating-ui/react-dom@^2.0.0": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.8.tgz#afc24f9756d1b433e1fe0d047c24bd4d9cefaa5d" - integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.0.tgz#4f0e5e9920137874b2405f7d6c862873baf4beff" + integrity sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA== dependencies: - "@floating-ui/dom" "^1.6.1" + "@floating-ui/dom" "^1.0.0" -"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" - integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== +"@floating-ui/utils@^0.2.0": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.2.tgz#d8bae93ac8b815b2bd7a98078cf91e2724ef11e5" + integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== "@graphiql/plugin-code-exporter@0.3.5": version "0.3.5" @@ -1207,7 +1201,7 @@ "@tanstack/react-virtual" "^3.0.0-beta.60" client-only "^0.0.1" -"@humanwhocodes/config-array@^0.11.11": +"@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== @@ -1493,13 +1487,13 @@ "@monaco-editor/loader" "^1.4.0" "@motionone/animation@^10.12.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.17.0.tgz#7633c6f684b5fee2b61c405881b8c24662c68fca" - integrity sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg== + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.18.0.tgz#868d00b447191816d5d5cf24b1cafa144017922b" + integrity sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw== dependencies: - "@motionone/easing" "^10.17.0" - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" + "@motionone/easing" "^10.18.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" tslib "^2.3.1" "@motionone/dom@10.12.0": @@ -1514,34 +1508,34 @@ hey-listen "^1.0.8" tslib "^2.3.1" -"@motionone/easing@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.17.0.tgz#d66cecf7e3ee30104ad00389fb3f0b2282d81aa9" - integrity sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg== +"@motionone/easing@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.18.0.tgz#7b82f6010dfee3a1bb0ee83abfbaff6edae0c708" + integrity sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg== dependencies: - "@motionone/utils" "^10.17.0" + "@motionone/utils" "^10.18.0" tslib "^2.3.1" "@motionone/generators@^10.12.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.17.0.tgz#878d292539c41434c13310d5f863a87a94e6e689" - integrity sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ== + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.18.0.tgz#fe09ab5cfa0fb9a8884097feb7eb60abeb600762" + integrity sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg== dependencies: - "@motionone/types" "^10.17.0" - "@motionone/utils" "^10.17.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" tslib "^2.3.1" -"@motionone/types@^10.12.0", "@motionone/types@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.0.tgz#179571ce98851bac78e19a1c3974767227f08ba3" - integrity sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA== +"@motionone/types@^10.12.0", "@motionone/types@^10.17.1": + version "10.17.1" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.1.tgz#cf487badbbdc9da0c2cb86ffc1e5d11147c6e6fb" + integrity sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A== -"@motionone/utils@^10.12.0", "@motionone/utils@^10.17.0": - version "10.17.0" - resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.17.0.tgz#cc0ba8acdc6848ff48d8c1f2d0d3e7602f4f942e" - integrity sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg== +"@motionone/utils@^10.12.0", "@motionone/utils@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.18.0.tgz#a59ff8932ed9009624bca07c56b28ef2bb2f885e" + integrity sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw== dependencies: - "@motionone/types" "^10.17.0" + "@motionone/types" "^10.17.1" hey-listen "^1.0.8" tslib "^2.3.1" @@ -1942,9 +1936,9 @@ "@babel/runtime" "^7.13.10" "@react-aria/ssr@^3.5.0": - version "3.9.2" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.2.tgz#01b756965cd6e32b95217f968f513eb3bd6ee44b" - integrity sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw== + version "3.9.4" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.4.tgz#9da8b10342c156e816dbfa4c9e713b21f274d7ab" + integrity sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ== dependencies: "@swc/helpers" "^0.5.0" @@ -1956,9 +1950,9 @@ dequal "^2.0.3" "@restart/ui@^1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.8.tgz#61b73503d4690e2f0f58992d4d6ae1e89c276791" - integrity sha512-6ndCv3oZ7r9vuP1Ok9KH55TM1/UkdBnP/fSraW0DFDMbPMzWKhVKeFAIEUCRCSdzayjZDcFYK6xbMlipN9dmMA== + version "1.6.9" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.9.tgz#05ec905a56486fa39b62f29c09b3917e57acd62f" + integrity sha512-mUbygUsJcRurjZCt1f77gg4DpheD1D+Sc7J3JjAkysUj7t8m4EBJVOqWC9788Qtbc69cJ+HlJc6jBguKwS8Mcw== dependencies: "@babel/runtime" "^7.21.0" "@popperjs/core" "^2.11.6" @@ -1971,9 +1965,9 @@ warning "^4.0.3" "@rushstack/eslint-patch@^1.3.3": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" - integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw== + version "1.10.3" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" + integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -2002,23 +1996,23 @@ tslib "^2.4.0" "@swc/helpers@^0.5.0": - version "0.5.10" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.10.tgz#5720082d007197cd85743dd599198097126a3f6e" - integrity sha512-CU+RF9FySljn7HVSkkjiB84hWkvTaI3rtLvF433+jRSBL2hMu3zX5bGhHS8C80SM++h4xy8hBSnUHFQHmRXSBw== + version "0.5.11" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7" + integrity sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A== dependencies: tslib "^2.4.0" "@tanstack/react-virtual@^3.0.0-beta.60": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.4.0.tgz#5dcc0ac7c9e35d5db12c3bbe4cbc075bad684d93" - integrity sha512-GZN4xn/Tg5w7gvYeVcMVCeL4pEyUhvg+Cp6KX2Z01C4FRNxIWMgIQ9ibgMarNQfo+gt0PVLcEER4A9sNv/jlow== + version "3.5.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.5.0.tgz#873b5b77cf78af563a4a11e6251ed51ee8868132" + integrity sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw== dependencies: - "@tanstack/virtual-core" "3.4.0" + "@tanstack/virtual-core" "3.5.0" -"@tanstack/virtual-core@3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.4.0.tgz#afd72bc5a839b71c2cda87a738eb4eb18451b80a" - integrity sha512-75jXqXxqq5M5Veb9KP1STi8kA5u408uOOAefk2ftHDGCpUk3RP6zX++QqfbmHJTBiU72NQ+ghgCZVts/Wocz8Q== +"@tanstack/virtual-core@3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.5.0.tgz#108208d0f1d75271300bc5560cf9a85a1fa01e89" + integrity sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg== "@types/babel__core@^7.1.14": version "7.20.5" @@ -2047,9 +2041,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" @@ -2108,18 +2102,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/node@*": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== +"@types/node@*", "@types/node@^20.12.12": + version "20.14.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.1.tgz#2434dbcb1f039e31f2c0e9969da93f52cf6348f3" + integrity sha512-T2MzSGEu+ysB/FkWfqmhV3PLyQlowdptmmgD20C6QxsS8Fmv5SjpZ1ayXaEC0S21/h5UJ9iA6W/5vSNU5l00OA== dependencies: undici-types "~5.26.4" -"@types/node@18.18.1": - version "18.18.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.1.tgz#80b22f3df719f15c9736207980e95f35d01ec1aa" - integrity sha512-3G42sxmm0fF2+Vtb9TJQpnjmP+uKlWvFa8KoEGquh4gqRmoUG/N0ufuhikw6HEsdG2G2oIKhog1GCTfz9v5NdQ== - "@types/pegjs@^0.10.0": version "0.10.6" resolved "https://registry.yarnpkg.com/@types/pegjs/-/pegjs-0.10.6.tgz#bc20fc4809fed4cddab8d0dbee0e568803741a82" @@ -2144,37 +2133,23 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@>=16.9.11": - version "18.2.79" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.79.tgz#c40efb4f255711f554d47b449f796d1c7756d865" - integrity sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w== +"@types/react@*", "@types/react@>=16.9.11", "@types/react@^18.3.2": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== dependencies: "@types/prop-types" "*" csstype "^3.0.2" -"@types/react@18.2.23": - version "18.2.23" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.23.tgz#60ad6cf4895e93bed858db0e03bcc4ff97d0410e" - integrity sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.23.0.tgz#0a6655b3e2708eaabca00b7372fafd7a792a7b09" - integrity sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw== - "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -"@types/stylis@4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" - integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== +"@types/stylis@4.2.5": + version "4.2.5" + resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.5.tgz#1daa6456f40959d06157698a653a9ab0a70281df" + integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw== "@types/tern@*": version "0.23.9" @@ -2200,6 +2175,21 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^7.9.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.12.0.tgz#f87a32e8972b8a60024f2f8f12205e7c8108bc41" + integrity sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.12.0" + "@typescript-eslint/type-utils" "7.12.0" + "@typescript-eslint/utils" "7.12.0" + "@typescript-eslint/visitor-keys" "7.12.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/parser@^5.4.2 || ^6.0.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" @@ -2211,6 +2201,17 @@ "@typescript-eslint/visitor-keys" "6.21.0" debug "^4.3.4" +"@typescript-eslint/parser@^7.9.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.12.0.tgz#8761df3345528b35049353db80010b385719b1c3" + integrity sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ== + dependencies: + "@typescript-eslint/scope-manager" "7.12.0" + "@typescript-eslint/types" "7.12.0" + "@typescript-eslint/typescript-estree" "7.12.0" + "@typescript-eslint/visitor-keys" "7.12.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" @@ -2219,11 +2220,34 @@ "@typescript-eslint/types" "6.21.0" "@typescript-eslint/visitor-keys" "6.21.0" +"@typescript-eslint/scope-manager@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz#259c014362de72dd34f995efe6bd8dda486adf58" + integrity sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg== + dependencies: + "@typescript-eslint/types" "7.12.0" + "@typescript-eslint/visitor-keys" "7.12.0" + +"@typescript-eslint/type-utils@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.12.0.tgz#9dfaaa1972952f395ec5be4f5bbfc4d3cdc63908" + integrity sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA== + dependencies: + "@typescript-eslint/typescript-estree" "7.12.0" + "@typescript-eslint/utils" "7.12.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== +"@typescript-eslint/types@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.12.0.tgz#bf208f971a8da1e7524a5d9ae2b5f15192a37981" + integrity sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg== + "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" @@ -2238,6 +2262,30 @@ semver "^7.5.4" ts-api-utils "^1.0.1" +"@typescript-eslint/typescript-estree@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz#e6c1074f248b3db6573ab6a7c47a39c4cd498ff9" + integrity sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ== + dependencies: + "@typescript-eslint/types" "7.12.0" + "@typescript-eslint/visitor-keys" "7.12.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.12.0.tgz#c6e58fd7f724cdccc848f71e388ad80cbdb95dd0" + integrity sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.12.0" + "@typescript-eslint/types" "7.12.0" + "@typescript-eslint/typescript-estree" "7.12.0" + "@typescript-eslint/visitor-keys@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" @@ -2246,6 +2294,19 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" +"@typescript-eslint/visitor-keys@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz#c053b55a996679528beeedd8e565710ce1ae1ad3" + integrity sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ== + dependencies: + "@typescript-eslint/types" "7.12.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@wry/caches@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@wry/caches/-/caches-1.0.1.tgz#8641fd3b6e09230b86ce8b93558d44cf1ece7e52" @@ -2399,7 +2460,7 @@ array-buffer-byte-length@^1.0.1: call-bind "^1.0.5" is-array-buffer "^3.0.4" -array-includes@^3.1.6, array-includes@^3.1.7: +array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -2416,7 +2477,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlast@^1.2.4: +array.prototype.findlast@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== @@ -2471,14 +2532,14 @@ array.prototype.toreversed@^1.1.2: es-shim-unscopables "^1.0.0" array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" + es-abstract "^1.23.3" + es-errors "^1.3.0" es-shim-unscopables "^1.0.2" arraybuffer.prototype.slice@^1.0.3: @@ -2694,12 +2755,12 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browserslist@^4.22.2, browserslist@^4.23.0: version "4.23.0" @@ -2782,9 +2843,9 @@ camelize@^1.0.0: integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001612" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz#d34248b4ec1f117b70b24ad9ee04c90e0b8a14ae" - integrity sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g== + version "1.0.30001627" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001627.tgz#8071c42d468e06ed2fb2c545efe79a663fd326ab" + integrity sha512-4zgNiB8nTyV/tHhwZrFs88ryjls/lHiqFhrxCW4qSTeuRByBVnPYpDInchOIySWknznucaf31Z4KYqjfbrecVw== capability@^0.2.5: version "0.2.5" @@ -2834,9 +2895,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + version "1.3.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== classnames@^2.3.2: version "2.5.1" @@ -2877,12 +2938,12 @@ co@^4.6.0: integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== codemirror-graphql@^2.0.10: - version "2.0.11" - resolved "https://registry.yarnpkg.com/codemirror-graphql/-/codemirror-graphql-2.0.11.tgz#2581266f72d91e4d6af90b478dbf6fe2bf1e170d" - integrity sha512-j1QDDXKVkpin2VsyS0ke2nAhKal6/N1UJtgnBGrPe3gj9ZSP6/K8Xytft94k0xW6giIU/JhZjvW0GwwERNzbFA== + version "2.0.12" + resolved "https://registry.yarnpkg.com/codemirror-graphql/-/codemirror-graphql-2.0.12.tgz#75492b41f271a64eb207c923a4a536c3134d05c9" + integrity sha512-5UCqhWzck1jClCmRewFb8aSiabnAqiaRfsvIPfmbf6WJvOb8oiefJeHilclPPiZBzY8v/Et6EBMtOeKnWCoyng== dependencies: "@types/codemirror" "^0.0.90" - graphql-language-service "5.2.0" + graphql-language-service "5.2.1" codemirror@^5.65.3: version "5.65.16" @@ -2951,9 +3012,9 @@ copy-to-clipboard@^3.0.8, copy-to-clipboard@^3.2.0: toggle-selection "^1.0.6" core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" - integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== dependencies: browserslist "^4.23.0" @@ -2998,12 +3059,7 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -csstype@^3.0.2: +csstype@3.1.3, csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -3048,9 +3104,9 @@ debug@^3.2.7: ms "^2.1.1" debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" @@ -3078,7 +3134,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -3167,9 +3223,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.668: - version "1.4.746" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz#787213e75f6c7bccb55dfe8b68170555c548d093" - integrity sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg== + version "1.4.789" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.789.tgz#fec941cb753ee139da562a5a8ff31fc3e828b411" + integrity sha512-0VbyiaXoT++Fi2vHGo2ThOeS6X3vgRCWrjPeO2FeIAWL6ItiSJ9BqlH8LfCXe3X1IdcG+S0iLoNaxQWhfZoGzQ== emittery@^0.13.1: version "0.13.1" @@ -3192,9 +3248,9 @@ emojis-list@^3.0.0: integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + version "5.17.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" + integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -3220,7 +3276,7 @@ error-polyfill@^0.1.3: o3 "^1.0.3" u3 "^0.1.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -3279,19 +3335,19 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.3" es-errors "^1.3.0" es-set-tostringtag "^2.0.3" function-bind "^1.1.2" @@ -3336,7 +3392,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1: +escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== @@ -3446,33 +3502,33 @@ eslint-plugin-jsx-a11y@^6.7.1: object.fromentries "^2.0.7" "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705", eslint-plugin-react-hooks@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.33.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + version "7.34.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz#2780a1a35a51aca379d86d29b9a72adc6bfe6b66" + integrity sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw== dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.toreversed "^1.1.2" array.prototype.tosorted "^1.1.3" doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" + es-iterator-helpers "^1.0.19" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.hasown "^1.1.4" + object.values "^1.2.0" prop-types "^15.8.1" resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.10" + string.prototype.matchall "^4.0.11" eslint-scope@^7.2.2: version "7.2.2" @@ -3487,18 +3543,19 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@8.50.0: - version "8.50.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.50.0.tgz#2ae6015fee0240fcd3f83e1e25df0287f487d6b2" - integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg== +eslint@^8.56.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.50.0" - "@humanwhocodes/config-array" "^0.11.11" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -3646,10 +3703,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -3816,9 +3873,9 @@ get-symbol-description@^1.0.2: get-intrinsic "^1.2.4" get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + version "4.7.5" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" + integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== dependencies: resolve-pkg-maps "^1.0.0" @@ -3854,15 +3911,15 @@ glob@7.1.7: path-is-absolute "^1.0.0" glob@^10.3.10: - version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" - integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== + version "10.4.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" + integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.10.2" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + path-scurry "^1.11.1" glob@^7.1.3, glob@^7.1.4: version "7.2.3" @@ -3889,11 +3946,12 @@ globals@^13.19.0: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^11.1.0: version "11.1.0" @@ -3946,10 +4004,10 @@ graphiql@3.0.6: graphql-language-service "^5.2.0" markdown-it "^12.2.0" -graphql-language-service@5.2.0, graphql-language-service@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/graphql-language-service/-/graphql-language-service-5.2.0.tgz#cfe22b2e911292d724451580632c67d908e5606a" - integrity sha512-o/ZgTS0pBxWm3hSF4+6GwiV1//DxzoLWEbS38+jqpzzy1d/QXBidwQuVYTOksclbtOJZ3KR/tZ8fi/tI6VpVMg== +graphql-language-service@5.2.1, graphql-language-service@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/graphql-language-service/-/graphql-language-service-5.2.1.tgz#8929cf93deadecc0fbb78fe8a0c55d178ffa7833" + integrity sha512-8ewD6otGO43vg2TiEGjoLz3CweTwfaf4ZnqfNREqZXS2JSJGXtsRBOMMknCxMfFVh4x14ql3jyDrXcyAAtbmkQ== dependencies: nullthrows "^1.0.0" vscode-languageserver-types "^3.17.1" @@ -4062,7 +4120,7 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: +ignore@^5.2.0, ignore@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== @@ -4405,10 +4463,10 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" -jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +jackspeak@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.2.3.tgz#33e8c44f7858d199fc5684f4ab62d1fd873eb10d" + integrity sha512-htOzIMPbpLid/Gq9/zaz9SfExABxqRe1sSCdxntlO/aMD6u0issZQiY25n2GKQUtJ02j7z5sfptlAOMpWWOmvw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -4872,9 +4930,9 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== language-tags@^1.0.9: version "1.0.9" @@ -4967,9 +5025,9 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== lru-cache@^5.1.1: version "5.1.1" @@ -4978,13 +5036,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -5039,11 +5090,11 @@ meros@^1.1.4: integrity sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w== micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mimic-fn@^2.1.0: @@ -5065,7 +5116,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1: +minimatch@^9.0.4: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== @@ -5077,10 +5128,10 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== monaco-editor@^0.45.0: version "0.45.0" @@ -5206,9 +5257,9 @@ node-sql-parser@^4.4.0: big-integer "^1.6.48" node-sql-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/node-sql-parser/-/node-sql-parser-5.0.0.tgz#435e4a6494a19d4c2cfd0850a53527a1b23d1e51" - integrity sha512-hkNU1gIT8BNe8vmcsU7uYie0gzow/6AIj5KnGRBJQSZlgEu1NNuLVS11it5gAEdpmvJHelc34BwR439Iela+zQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/node-sql-parser/-/node-sql-parser-5.2.0.tgz#efdca806d36f19921764c66a26ded3d2f55d77bc" + integrity sha512-lO/9ox0fLl47ksqlwGrorXm8BD+5UbxvUhj6T1XiCXnvoVwWWn7gC2l396p9OXNii19dc4MkyTN3XeJGNUZ8jw== dependencies: "@types/pegjs" "^0.10.0" big-integer "^1.6.48" @@ -5272,7 +5323,7 @@ object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.7: +object.entries@^1.1.7, object.entries@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -5281,7 +5332,7 @@ object.entries@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: +object.fromentries@^2.0.7, object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -5300,7 +5351,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.hasown@^1.1.3: +object.hasown@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== @@ -5309,7 +5360,7 @@ object.hasown@^1.1.3: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.values@^1.1.6, object.values@^1.1.7: +object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -5343,16 +5394,16 @@ optimism@^0.18.0: tslib "^2.3.0" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" @@ -5436,10 +5487,10 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" - integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -5449,10 +5500,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -5535,9 +5586,9 @@ postcss-nested@^6.0.1: postcss-selector-parser "^6.0.11" postcss-selector-parser@^6.0.11: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -5556,7 +5607,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.23, postcss@^8.4.33: +postcss@8.4.38, postcss@^8.4.23, postcss@^8.4.33: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -5566,9 +5617,9 @@ postcss@^8.4.23, postcss@^8.4.33: source-map-js "^1.2.0" preact@^10.11.3: - version "10.20.2" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.20.2.tgz#0b343299a8c020562311cc25db93b3d832ec5e71" - integrity sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg== + version "10.22.0" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.22.0.tgz#a50f38006ae438d255e2631cbdaf7488e6dd4e16" + integrity sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw== prelude-ls@^1.2.1: version "1.2.1" @@ -5698,9 +5749,9 @@ react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -5844,10 +5895,10 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -rehackt@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.0.6.tgz#7a0a2247f2295e7548915417e44fbbf03bf004f4" - integrity sha512-l3WEzkt4ntlEc/IB3/mF6SRgNHA6zfQR7BlGOgBTOmx7IJJXojDASav+NsgXHFjHn+6RmwqsGPFgZpabWpeOdw== +rehackt@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.1.0.tgz#a7c5e289c87345f70da8728a7eb878e5d03c696b" + integrity sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw== require-directory@^2.1.1: version "2.1.1" @@ -5953,9 +6004,9 @@ safe-regex-test@^1.0.3: is-regex "^1.1.4" scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -5978,12 +6029,10 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" +semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== set-function-length@^1.2.1: version "1.2.2" @@ -6143,16 +6192,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6170,7 +6210,7 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.10: +string.prototype.matchall@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== @@ -6216,14 +6256,7 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -6266,19 +6299,19 @@ style-value-types@5.0.0: tslib "^2.1.0" styled-components@^6.1.8: - version "6.1.8" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.8.tgz#c109d36aeea52d8f049e12de2f3be39a6fc86201" - integrity sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw== + version "6.1.11" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.11.tgz#01948e5195bf1d39e57e0a85b41958c80e40cfb8" + integrity sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA== dependencies: - "@emotion/is-prop-valid" "1.2.1" - "@emotion/unitless" "0.8.0" - "@types/stylis" "4.2.0" + "@emotion/is-prop-valid" "1.2.2" + "@emotion/unitless" "0.8.1" + "@types/stylis" "4.2.5" css-to-react-native "3.2.0" - csstype "3.1.2" - postcss "8.4.31" + csstype "3.1.3" + postcss "8.4.38" shallowequal "1.1.0" - stylis "4.3.1" - tslib "2.5.0" + stylis "4.3.2" + tslib "2.6.2" styled-jsx@5.1.1: version "5.1.1" @@ -6287,10 +6320,10 @@ styled-jsx@5.1.1: dependencies: client-only "0.0.1" -stylis@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" - integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== +stylis@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444" + integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== sucrase@^3.32.0: version "3.35.0" @@ -6434,7 +6467,7 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -ts-api-utils@^1.0.1: +ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== @@ -6461,12 +6494,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: +tslib@2.6.2, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -6542,10 +6570,10 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.4.5: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== u3@^0.1.1: version "0.1.1" @@ -6611,12 +6639,12 @@ unicode-property-aliases-ecmascript@^2.0.0: integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" uri-js@^4.2.2: version "4.4.1" @@ -6633,9 +6661,9 @@ use-callback-ref@^1.3.0: tslib "^2.0.0" use-debounce@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-10.0.0.tgz#5091b18d6c16292605f588bae3c0d2cfae756ff2" - integrity sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A== + version "10.0.1" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-10.0.1.tgz#adc42e7f7b08a237f5bbf0ea6cadee5813863cdc" + integrity sha512-0uUXjOfm44e6z4LZ/woZvkM8FwV1wiuoB6xnrrOmeAEjRDDzTLQNRFtYHvqUsJdrz1X37j0rVGIVp144GLHGKg== use-sidecar@^1.1.2: version "1.1.2" @@ -6756,16 +6784,12 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -6806,15 +6830,10 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^2.3.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== + version "2.4.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.3.tgz#0777516b8c7880bcaa0f426a5410e8d6b0be1f3d" + integrity sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg== yargs-parser@^21.1.1: version "21.1.1" diff --git a/registry/contract/src/lib.rs b/registry/contract/src/lib.rs index db82dc289..d3d5d8023 100644 --- a/registry/contract/src/lib.rs +++ b/registry/contract/src/lib.rs @@ -5,8 +5,7 @@ use near_sdk::store::UnorderedMap; use near_sdk::{env, log, near_bindgen, serde_json, AccountId, BorshStorageKey, CryptoHash}; use registry_types::{ - AccountIndexers, AllIndexers, IndexerConfig, IndexerRuleKind, MatchingRule, - OldAccountOrAllIndexers, OldIndexerConfig, OldIndexerRule, Rule, StartBlock, Status, + AccountIndexers, AccountOrAllIndexers, AllIndexers, IndexerConfig, IndexerIdentity, OldIndexerConfig, Rule, StartBlock, Status, }; type FunctionName = String; @@ -17,9 +16,9 @@ pub struct OldContract { account_roles: Vec, } -pub type OldIndexersByAccount = UnorderedMap; +type OldIndexersByAccount = UnorderedMap; -pub type OldIndexerConfigByFunctionName = UnorderedMap; +type OldIndexerConfigByFunctionName = UnorderedMap; // Define the contract structure #[near_bindgen] @@ -44,6 +43,8 @@ enum StorageKeys { AccountV2(CryptoHash), RegistryV3, AccountV3(CryptoHash), + RegistryV4, + AccountV4(CryptoHash), } /// These roles are used to control access across the various contract methods. @@ -72,7 +73,7 @@ pub struct AccountRole { impl Default for Contract { fn default() -> Self { Self { - registry: IndexersByAccount::new(StorageKeys::RegistryV3), + registry: IndexersByAccount::new(StorageKeys::RegistryV4), account_roles: vec![ AccountRole { account_id: "morgs.near".parse().unwrap(), @@ -115,15 +116,17 @@ impl Contract { pub fn migrate() -> Self { let state: OldContract = env::state_read().expect("failed to parse existing state"); - let mut registry = IndexersByAccount::new(StorageKeys::RegistryV3); + let mut registry = IndexersByAccount::new(StorageKeys::RegistryV4); for (account_id, indexers) in state.registry.iter() { let mut new_indexers: IndexerConfigByFunctionName = IndexerConfigByFunctionName::new( - StorageKeys::AccountV3(env::sha256_array(account_id.as_bytes())), + StorageKeys::AccountV4(env::sha256_array(account_id.as_bytes())), ); + for (function_name, indexer_config) in indexers.iter() { - new_indexers.insert(function_name.to_string(), indexer_config.clone().into()); + let new_config: IndexerConfig = indexer_config.clone().into(); + new_indexers.insert(function_name.to_string(), new_config); } registry.insert(account_id.clone(), new_indexers); @@ -135,28 +138,11 @@ impl Contract { } } - pub fn near_social_indexer_rule() -> OldIndexerRule { - let contract = "social.near"; - let method = "set"; - let matching_rule = MatchingRule::ActionFunctionCall { - affected_account_id: contract.to_string(), - function: method.to_string(), - status: Status::Any, - }; - OldIndexerRule { - indexer_rule_kind: IndexerRuleKind::Action, - matching_rule, - id: None, - name: None, - } - } - - // Public method - returns a function previously registered under this name or empty string pub fn read_indexer_function( &self, function_name: String, account_id: Option, - ) -> OldIndexerConfig { + ) -> IndexerConfig { let account_id = match account_id { Some(account_id) => account_id.parse::().unwrap_or_else(|_| { env::panic_str(&format!("Account ID {} is invalid", account_id)); @@ -178,7 +164,7 @@ impl Contract { ) }); - config.clone().into() + config.clone() } pub fn assert_roles(&self, permitted_roles: Vec) { @@ -259,12 +245,24 @@ impl Contract { pub fn register( &mut self, function_name: String, + forked_from: Option, code: String, schema: String, rule: Rule, start_block: StartBlock, + account_id: Option, ) { - let account_id = env::signer_account_id(); + let account_id = match account_id { + Some(account_id) => { + if env::signer_account_id() != account_id { + self.assert_roles(vec![Role::Owner]); + } + account_id + } + None => { + env::signer_account_id() + } + }; log!( "Registering function {} for account {}", @@ -281,7 +279,7 @@ impl Contract { affected_account_id, .. } => { - if affected_account_id == "*" { + if affected_account_id.split(',').any(|account_id| ["*", "*.near", "*.kaiching", "*.tg"].contains(&account_id.trim())) { self.assert_roles(vec![Role::Owner]); } } @@ -305,6 +303,7 @@ impl Contract { start_block, updated_at_block_height: Some(env::block_height()), created_at_block_height: indexer.created_at_block_height, + forked_from, }); } near_sdk::store::unordered_map::Entry::Vacant(entry) => { @@ -315,101 +314,7 @@ impl Contract { start_block, updated_at_block_height: None, created_at_block_height: env::block_height(), - }); - } - } - } - - // Public method - registers indexer code under then function_name - pub fn register_indexer_function( - &mut self, - function_name: String, - code: String, - start_block_height: Option, - schema: Option, - account_id: Option, - filter_json: Option, - ) { - let account_id = match account_id { - Some(account_id) => { - self.assert_roles(vec![Role::Owner]); - - account_id.parse::().unwrap_or_else(|_| { - env::panic_str(&format!("Account ID {} is invalid", account_id)); - }) - } - None => { - self.assert_roles(vec![Role::Owner, Role::User]); - env::signer_account_id() - } - }; - - let filter: OldIndexerRule = match filter_json { - Some(filter_json) => { - let filter_rule: OldIndexerRule = serde_json::from_str(&filter_json) - .unwrap_or_else(|e| { - env::panic_str(&format!("Invalid filter JSON {}", e)); - }); - - match &filter_rule.matching_rule { - MatchingRule::ActionAny { - affected_account_id, - .. - } - | MatchingRule::ActionFunctionCall { - affected_account_id, - .. - } => { - if affected_account_id == "*" { - self.assert_roles(vec![Role::Owner]); - } - } - _ => {} - } - - filter_rule - } - None => Contract::near_social_indexer_rule(), - }; - - log!( - "Registering function {} for account {}", - &function_name, - &account_id - ); - - let account_indexers = - self.registry - .entry(account_id.clone()) - .or_insert(IndexerConfigByFunctionName::new(StorageKeys::AccountV3( - env::sha256_array(account_id.as_bytes()), - ))); - - let start_block = match start_block_height { - Some(height) => StartBlock::Height(height), - None => StartBlock::Latest, - }; - - match account_indexers.entry(function_name) { - near_sdk::store::unordered_map::Entry::Occupied(mut entry) => { - let indexer = entry.get(); - entry.insert(IndexerConfig { - code, - start_block, - schema: schema.unwrap_or(String::new()), - rule: filter.matching_rule.into(), - updated_at_block_height: Some(env::block_height()), - created_at_block_height: indexer.created_at_block_height, - }); - } - near_sdk::store::unordered_map::Entry::Vacant(entry) => { - entry.insert(IndexerConfig { - code, - start_block, - schema: schema.unwrap_or(String::new()), - rule: filter.matching_rule.into(), - updated_at_block_height: None, - created_at_block_height: env::block_height(), + forked_from, }); } } @@ -455,44 +360,16 @@ impl Contract { } } - pub fn list_indexer_functions(&self, account_id: Option) -> OldAccountOrAllIndexers { + pub fn list_indexer_functions(&self, account_id: Option) -> AccountOrAllIndexers { match account_id { Some(account_id) => { let account_id = account_id.parse::().unwrap_or_else(|_| { env::panic_str(&format!("Account ID {} is invalid", account_id)); }); - let account_indexers = self.registry.get(&account_id).unwrap_or_else(|| { - env::panic_str( - format!("Account {} has no registered functions", account_id).as_str(), - ) - }); - - OldAccountOrAllIndexers::Account( - account_indexers - .iter() - .map(|(function_name, config)| { - (function_name.clone(), config.clone().into()) - }) - .collect(), - ) + AccountOrAllIndexers::AccountIndexers(self.list_by_account(account_id)) } - None => OldAccountOrAllIndexers::All( - self.registry - .iter() - .map(|(account_id, account_indexers)| { - ( - account_id.clone(), - account_indexers - .iter() - .map(|(function_name, config)| { - (function_name.clone(), config.clone().into()) - }) - .collect(), - ) - }) - .collect(), - ), + None => AccountOrAllIndexers::AllIndexers(self.list_all()) } } @@ -531,9 +408,9 @@ mod tests { #[test] fn migrate() { - let mut registry = OldIndexersByAccount::new(StorageKeys::RegistryV2); + let mut registry = OldIndexersByAccount::new(StorageKeys::RegistryV3); let account_id = "morgs.near".parse::().unwrap(); - let mut functions = OldIndexerConfigByFunctionName::new(StorageKeys::AccountV2( + let mut functions = OldIndexerConfigByFunctionName::new(StorageKeys::AccountV3( env::sha256_array(account_id.as_bytes()), )); @@ -541,30 +418,29 @@ mod tests { "test".to_string(), OldIndexerConfig { code: "return block;".to_string(), - start_block_height: None, - schema: None, - filter: Contract::near_social_indexer_rule(), - created_at_block_height: 10, + start_block: StartBlock::Latest, + schema: String::new(), + rule: Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set") + }, updated_at_block_height: None, + created_at_block_height: 10, }, ); functions.insert( "test2".to_string(), OldIndexerConfig { code: "return block2;".to_string(), - start_block_height: Some(100), - schema: Some(String::from("create table blah")), - filter: OldIndexerRule { - id: None, - name: None, - indexer_rule_kind: IndexerRuleKind::Action, - matching_rule: MatchingRule::ActionAny { - affected_account_id: String::from("social.near"), - status: Status::Success, - }, + schema: String::from("create table blah"), + start_block: StartBlock::Height(100), + rule: Rule::ActionAny { + affected_account_id: String::from("social.near"), + status: Status::Success }, - created_at_block_height: 10, updated_at_block_height: Some(20), + created_at_block_height: 10, }, ); registry.insert(account_id.clone(), functions); @@ -594,6 +470,7 @@ mod tests { }, updated_at_block_height: None, created_at_block_height: 10, + forked_from: None, } ); assert_eq!( @@ -613,6 +490,7 @@ mod tests { }, updated_at_block_height: Some(20), created_at_block_height: 10, + forked_from: None, } ); assert_eq!(contract.account_roles, Contract::default().account_roles); @@ -847,26 +725,36 @@ mod tests { role: Role::User, }], }; - let config = OldIndexerConfig { + let config = IndexerConfig { code: "var x= 1;".to_string(), - start_block_height: Some(43434343), - schema: None, - filter: Contract::near_social_indexer_rule(), + start_block: StartBlock::Height(43434343), + schema: String::new(), + rule: Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set") + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; - contract.register_indexer_function( - "test".to_string(), + contract.register( + "test_function".to_string(), + None, config.code.clone(), - config.start_block_height, config.schema.clone(), - None, + Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, + config.start_block.clone(), None, ); assert_eq!( - contract.read_indexer_function("test".to_string(), None), + contract.read_indexer_function("test_function".to_string(), None), config ); } @@ -880,46 +768,94 @@ mod tests { role: Role::Owner, }], }; - let config = OldIndexerConfig { + let config = IndexerConfig { code: "var x= 1;".to_string(), - start_block_height: Some(43434343), - schema: None, - filter: Contract::near_social_indexer_rule(), + start_block: StartBlock::Height(43434343), + schema: String::new(), + rule: Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), }; - contract.register_indexer_function( - "test".to_string(), + contract.register( + "test_function".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), config.code.clone(), - config.start_block_height, config.schema.clone(), - None, + Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, + config.start_block.clone(), None, ); assert_eq!( - contract.read_indexer_function("test".to_string(), None), + contract.read_indexer_function("test_function".to_string(), None), config ); } #[test] - #[should_panic(expected = "Account bob.near does not have any roles")] - fn anonymous_cannot_register_functions_for_themselves() { + fn anonymous_can_register_functions_for_themselves() { let mut contract = Contract { registry: IndexersByAccount::new(StorageKeys::Registry), account_roles: vec![], }; - contract.register_indexer_function( - "test".to_string(), - "var x= 1;".to_string(), - Some(43434343), - None, - None, + contract.register( + "test_function".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), + String::new(), + String::new(), + Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, + StartBlock::Latest, None, ); } + #[test] + fn anonymous_can_register_functions_using_their_own_account_parameter() { + let mut contract = Contract { + registry: IndexersByAccount::new(StorageKeys::Registry), + account_roles: vec![], + }; + + contract.register( + "test_function".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), + String::new(), + String::new(), + Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, + StartBlock::Latest, + Some("bob.near".parse().unwrap()), + ); + } + #[test] #[should_panic(expected = "Account bob.near does not have any roles")] fn anonymous_cannot_register_functions_for_others() { @@ -928,13 +864,21 @@ mod tests { account_roles: vec![], }; - contract.register_indexer_function( - "test".to_string(), - "var x= 1;".to_string(), - Some(43434343), - None, - Some("alice.near".to_string()), - None, + contract.register( + "test_function".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), + String::new(), + String::new(), + Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, + StartBlock::Latest, + Some("alice.near".parse().unwrap()), ); } @@ -949,13 +893,21 @@ mod tests { }], }; - contract.register_indexer_function( - "test".to_string(), - "var x = 1;".to_string(), - Some(434343), - None, - Some("alice.near".to_string()), - None, + contract.register( + "test_function".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), + String::new(), + String::new(), + Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, + StartBlock::Latest, + Some("alice.near".parse().unwrap()), ); } @@ -969,25 +921,33 @@ mod tests { }], }; - contract.register_indexer_function( - "test".to_string(), - "var x = 1;".to_string(), - Some(434343), - None, - Some("alice.near".to_string()), - None, + contract.register( + "test_function".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), + String::new(), + String::new(), + Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, + StartBlock::Latest, + Some("alice.near".parse().unwrap()), ); assert!(contract .registry .get(&"alice.near".parse::().unwrap()) .unwrap() - .get("test") + .get("test_function") .is_some()); } #[test] - fn register_indexer_function_for_new_account() { + fn sets_updated_at_and_created_at_for_new_account() { let mut contract = Contract { registry: IndexersByAccount::new(StorageKeys::Registry), account_roles: vec![AccountRole { @@ -995,54 +955,31 @@ mod tests { role: Role::User, }], }; - let config = OldIndexerConfig { + let config = IndexerConfig { code: "var x= 1;".to_string(), - start_block_height: None, - schema: None, - filter: Contract::near_social_indexer_rule(), + start_block: StartBlock::Height(43434343), + schema: String::new(), + rule: Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set") + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; - contract.register_indexer_function( - "test".to_string(), + contract.register( + "test_function".to_string(), + None, config.code.clone(), - config.start_block_height, config.schema.clone(), - None, - None, - ); - - assert_eq!( - OldIndexerConfig::from( - contract - .registry - .get(&"bob.near".parse::().unwrap()) - .unwrap() - .get("test") - .unwrap() - .clone() - ), - config - ); - } - - #[test] - fn sets_updated_at_and_created_at_for_new_account() { - let mut contract = Contract { - registry: IndexersByAccount::new(StorageKeys::Registry), - account_roles: vec![AccountRole { - account_id: "bob.near".parse().unwrap(), - role: Role::User, - }], - }; - - contract.register_indexer_function( - "test".to_string(), - "".to_string(), - Some(100), - Some("".to_string()), - None, + Rule::ActionFunctionCall { + affected_account_id: String::from("social.near"), + status: Status::Any, + function: String::from("set"), + }, + config.start_block.clone(), None, ); @@ -1050,7 +987,7 @@ mod tests { .registry .get(&"bob.near".parse::().unwrap()) .unwrap() - .get("test") + .get("test_function") .unwrap(); assert_eq!(indexer_config.updated_at_block_height, None); @@ -1066,170 +1003,44 @@ mod tests { role: Role::User, }], }; - let config = OldIndexerConfig { + let config = IndexerConfig { + start_block: StartBlock::Latest, code: "var x= 1;".to_string(), - start_block_height: None, - schema: None, - filter: OldIndexerRule { - indexer_rule_kind: IndexerRuleKind::Action, - matching_rule: MatchingRule::ActionFunctionCall { - affected_account_id: "test".to_string(), - function: "test".to_string(), - status: Status::Fail, - }, - id: None, - name: None, + schema: String::new(), + rule: Rule:: ActionFunctionCall { + affected_account_id: "test".to_string(), + function: "test".to_string(), + status: Status::Fail, }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; - contract.register_indexer_function( - "test".to_string(), - config.code.clone(), - config.start_block_height, - config.schema.clone(), + contract.register( + "test_function".to_string(), None, - Some(r#"{"indexer_rule_kind":"Action","matching_rule":{"rule":"ACTION_FUNCTION_CALL","affected_account_id":"test","function":"test","status":"FAIL"}}"#.to_string()), - ); - - assert_eq!( - OldIndexerConfig::from( - contract - .registry - .get(&"bob.near".parse::().unwrap()) - .unwrap() - .get("test") - .unwrap() - .clone() - ), - config - ); - } - - #[test] - fn register_indexer_function_with_filter() { - let mut contract = Contract { - registry: IndexersByAccount::new(StorageKeys::Registry), - account_roles: vec![AccountRole { - account_id: "bob.near".parse().unwrap(), - role: Role::User, - }], - }; - let config = OldIndexerConfig { - code: "var x= 1;".to_string(), - start_block_height: None, - schema: None, - filter: OldIndexerRule { - indexer_rule_kind: IndexerRuleKind::Action, - matching_rule: MatchingRule::ActionAny { - affected_account_id: "test".to_string(), - status: Status::Success, - }, - id: None, - name: None, - }, - updated_at_block_height: None, - created_at_block_height: 0, - }; - - contract.register_indexer_function( - "test".to_string(), config.code.clone(), - config.start_block_height, config.schema.clone(), - None, - Some(r#"{"indexer_rule_kind":"Action","matching_rule":{"rule":"ACTION_ANY","affected_account_id":"test","status":"SUCCESS"}}"#.to_string()), - ); - - assert_eq!( - OldIndexerConfig::from( - contract - .registry - .get(&"bob.near".parse::().unwrap()) - .unwrap() - .get("test") - .unwrap() - .clone() - ), - config - ); - } - - #[test] - #[should_panic(expected = "Invalid filter JSON")] - fn register_indexer_function_with_invalid_filter() { - let mut contract = Contract { - registry: IndexersByAccount::new(StorageKeys::Registry), - account_roles: vec![AccountRole { - account_id: "bob.near".parse().unwrap(), - role: Role::User, - }], - }; - - let filter_json_missing_rule_type = r#"{"indexer_rule_kind":"Action","matching_rule":{"affected_account_id":"test","function":"test","status":"FAIL"}}"#; - - contract.register_indexer_function( - "test".to_string(), - "var x= 1;".to_string(), - None, - None, - None, - Some(filter_json_missing_rule_type.to_string()), - ); - } - - #[test] - fn sets_updated_at_and_created_at_for_existing_account() { - let account_id = "bob.near".parse::().unwrap(); - let mut account_indexers = IndexerConfigByFunctionName::new(StorageKeys::Account( - env::sha256_array(account_id.as_bytes()), - )); - account_indexers.insert( - "test".to_string(), - IndexerConfig { - code: "var x= 1;".to_string(), - start_block: StartBlock::Latest, - schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), - status: Status::Success, - }, - updated_at_block_height: None, - created_at_block_height: 100, + Rule::ActionFunctionCall { + affected_account_id: String::from("test"), + status: Status::Fail, + function: String::from("test"), }, - ); - let mut registry = IndexersByAccount::new(StorageKeys::Registry); - registry.insert(account_id, account_indexers); - let mut contract = Contract { - registry, - account_roles: vec![AccountRole { - account_id: "bob.near".parse().unwrap(), - role: Role::User, - }], - }; - - contract.register_indexer_function( - "test".to_string(), - "".to_string(), - Some(100), - Some("".to_string()), - None, + config.start_block.clone(), None, ); - let indexer_config = contract - .registry - .get(&"bob.near".parse::().unwrap()) - .unwrap() - .get("test") - .unwrap(); - assert_eq!( - indexer_config.updated_at_block_height, - Some(env::block_height()) + contract + .registry + .get(&"bob.near".parse::().unwrap()) + .unwrap() + .get("test_function") + .unwrap() + .clone(), + config ); - assert_eq!(indexer_config.created_at_block_height, 100); } #[test] @@ -1239,17 +1050,19 @@ mod tests { env::sha256_array(account_id.as_bytes()), )); account_indexers.insert( - "test".to_string(), + "test_function".to_string(), IndexerConfig { - code: "var x= 1;".to_string(), start_block: StartBlock::Latest, + code: "var x= 1;".to_string(), schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), - status: Status::Success, + rule: Rule:: ActionFunctionCall { + affected_account_id: "test".to_string(), + function: "test".to_string(), + status: Status::Fail, }, updated_at_block_height: None, - created_at_block_height: 100, + created_at_block_height: 0, + forked_from: None, }, ); let mut registry = IndexersByAccount::new(StorageKeys::Registry); @@ -1261,21 +1074,31 @@ mod tests { role: Role::User, }], }; - let config = OldIndexerConfig { + let config = IndexerConfig { + start_block: StartBlock::Latest, code: "var x= 1;".to_string(), - start_block_height: None, - schema: None, - filter: Contract::near_social_indexer_rule(), + schema: String::new(), + rule: Rule:: ActionFunctionCall { + affected_account_id: "test".to_string(), + function: "test".to_string(), + status: Status::Fail, + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; - contract.register_indexer_function( - "test2".to_string(), - config.code.clone(), - config.start_block_height, - config.schema, + contract.register( + "test_function2".to_string(), None, + config.code.clone(), + config.schema.clone(), + Rule::ActionFunctionCall { + affected_account_id: String::from("test"), + status: Status::Fail, + function: String::from("test"), + }, + config.start_block.clone(), None, ); @@ -1298,13 +1121,42 @@ mod tests { role: Role::User, }); - contract.register_indexer_function( - String::from("name"), - String::from("code"), - Some(0), - Some(String::from("schema")), + contract.register( + "test_function".to_string(), + None, + String::new(), + String::new(), + Rule::ActionFunctionCall { + affected_account_id: String::from("*"), + status: Status::Fail, + function: String::from("test"), + }, + StartBlock::Latest, + None, + ); + } + + #[test] + #[should_panic(expected = "Account bob.near does not have one of required roles [Owner]")] + fn prevents_non_owners_from_using_wildcard_near() { + let mut contract = Contract::default(); + contract.account_roles.push(AccountRole { + account_id: "bob.near".parse().unwrap(), + role: Role::User, + }); + + contract.register( + "test_function".to_string(), + None, + String::new(), + String::new(), + Rule::ActionFunctionCall { + affected_account_id: String::from("*.near"), + status: Status::Fail, + function: String::from("test"), + }, + StartBlock::Latest, None, - Some(r#"{"indexer_rule_kind":"Action","matching_rule":{"rule":"ACTION_ANY","affected_account_id":"*","status":"SUCCESS"}}"#.to_string()), ); } @@ -1316,13 +1168,17 @@ mod tests { role: Role::Owner, }); - contract.register_indexer_function( - String::from("name"), - String::from("code"), - Some(0), - Some(String::from("schema")), + contract.register( + "test_function".to_string(), + None, + String::new(), + String::new(), + Rule::ActionAny { + affected_account_id: String::from("*"), + status: Status::Success, + }, + StartBlock::Latest, None, - Some(r#"{"indexer_rule_kind":"Action","matching_rule":{"rule":"ACTION_ANY","affected_account_id":"*","status":"SUCCESS"}}"#.to_string()), ); assert_eq!(contract.registry.len(), 1); @@ -1337,15 +1193,16 @@ mod tests { account_indexers.insert( "test".to_string(), IndexerConfig { - code: "var x= 1;".to_string(), start_block: StartBlock::Latest, + code: "var x= 1;".to_string(), schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Success, }, updated_at_block_height: None, - created_at_block_height: 100, + created_at_block_height: 0, + forked_from: None, }, ); let mut registry = IndexersByAccount::new(StorageKeys::Registry); @@ -1375,15 +1232,16 @@ mod tests { account_indexers.insert( "test".to_string(), IndexerConfig { - code: "var x= 1;".to_string(), start_block: StartBlock::Latest, + code: "var x= 1;".to_string(), schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Success, }, updated_at_block_height: None, - created_at_block_height: 100, + created_at_block_height: 0, + forked_from: None, }, ); let mut registry = IndexersByAccount::new(StorageKeys::Registry); @@ -1414,15 +1272,16 @@ mod tests { account_indexers.insert( "test".to_string(), IndexerConfig { - code: "var x= 1;".to_string(), start_block: StartBlock::Latest, + code: "var x= 1;".to_string(), schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Success, }, updated_at_block_height: None, - created_at_block_height: 100, + created_at_block_height: 0, + forked_from: None, }, ); let mut registry = IndexersByAccount::new(StorageKeys::Registry); @@ -1447,15 +1306,16 @@ mod tests { account_indexers.insert( "test".to_string(), IndexerConfig { - code: "var x= 1;".to_string(), start_block: StartBlock::Latest, + code: "var x= 1;".to_string(), schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Success, }, updated_at_block_height: None, - created_at_block_height: 100, + created_at_block_height: 0, + forked_from: None, }, ); let mut registry = IndexersByAccount::new(StorageKeys::Registry); @@ -1486,15 +1346,16 @@ mod tests { account_indexers.insert( "test".to_string(), IndexerConfig { - code: "var x= 1;".to_string(), start_block: StartBlock::Latest, + code: "var x= 1;".to_string(), schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Success, }, updated_at_block_height: None, - created_at_block_height: 100, + created_at_block_height: 0, + forked_from: None, }, ); let mut registry = IndexersByAccount::new(StorageKeys::Registry); @@ -1516,29 +1377,31 @@ mod tests { account_indexers.insert( "test".to_string(), IndexerConfig { - code: "var x= 1;".to_string(), start_block: StartBlock::Latest, + code: "var x= 1;".to_string(), schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Success, }, updated_at_block_height: None, - created_at_block_height: 100, + created_at_block_height: 0, + forked_from: None, }, ); account_indexers.insert( "test2".to_string(), IndexerConfig { - code: "var x= 1;".to_string(), start_block: StartBlock::Latest, + code: "var x= 1;".to_string(), schema: String::new(), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Success, }, updated_at_block_height: None, - created_at_block_height: 100, + created_at_block_height: 0, + forked_from: None, }, ); let mut registry = IndexersByAccount::new(StorageKeys::Registry); @@ -1582,13 +1445,17 @@ mod tests { #[test] fn read_indexer_function() { - let config = OldIndexerConfig { + let config = IndexerConfig { + start_block: StartBlock::Latest, code: "var x= 1;".to_string(), - start_block_height: None, - schema: None, - filter: Contract::near_social_indexer_rule(), + schema: String::new(), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), + status: Status::Success, + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; let account_id = "bob.near".parse::().unwrap(); @@ -1611,13 +1478,17 @@ mod tests { #[test] fn read_indexer_function_from_other_account() { - let config = OldIndexerConfig { + let config = IndexerConfig { + start_block: StartBlock::Latest, code: "var x= 1;".to_string(), - start_block_height: None, - schema: None, - filter: Contract::near_social_indexer_rule(), + schema: String::new(), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), + status: Status::Success, + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; let account_id = "alice.near".parse::().unwrap(); let mut account_indexers = IndexerConfigByFunctionName::new(StorageKeys::Account( @@ -1647,13 +1518,17 @@ mod tests { #[test] fn list_indexer_functions() { - let config = OldIndexerConfig { + let config = IndexerConfig { + start_block: StartBlock::Latest, code: "var x= 1;".to_string(), - start_block_height: Some(43434343), - schema: None, - filter: Contract::near_social_indexer_rule(), + schema: String::new(), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), + status: Status::Success, + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; let account_id = "bob.near".parse::().unwrap(); let mut account_indexers = IndexerConfigByFunctionName::new(StorageKeys::Account( @@ -1669,7 +1544,7 @@ mod tests { assert_eq!( contract.list_indexer_functions(None), - OldAccountOrAllIndexers::All(HashMap::from([( + AccountOrAllIndexers::AllIndexers(HashMap::from([( "bob.near".parse().unwrap(), HashMap::from([("test".to_string(), config)]) )])) @@ -1678,13 +1553,17 @@ mod tests { #[test] fn list_account_indexer_functions() { - let config = OldIndexerConfig { + let config = IndexerConfig { + start_block: StartBlock::Latest, code: "var x= 1;".to_string(), - start_block_height: Some(43434343), - schema: None, - filter: Contract::near_social_indexer_rule(), + schema: String::new(), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), + status: Status::Success, + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; let account_id = "bob.near".parse::().unwrap(); let mut account_indexers = IndexerConfigByFunctionName::new(StorageKeys::Account( @@ -1700,30 +1579,23 @@ mod tests { assert_eq!( contract.list_indexer_functions(Some("bob.near".to_string())), - OldAccountOrAllIndexers::Account(HashMap::from([("test".to_string(), config)])) + AccountOrAllIndexers::AccountIndexers(HashMap::from([("test".to_string(), config)])) ); } - #[test] - #[should_panic(expected = "Account bob.near has no registered functions")] - fn list_account_empty_indexer_functions() { - let contract = Contract { - registry: IndexersByAccount::new(StorageKeys::Registry), - account_roles: vec![], - }; - - contract.list_indexer_functions(Some("bob.near".to_string())); - } - #[test] fn list_other_account_indexer_functions() { - let config = OldIndexerConfig { + let config = IndexerConfig { + start_block: StartBlock::Latest, code: "var x= 1;".to_string(), - start_block_height: Some(43434343), - schema: None, - filter: Contract::near_social_indexer_rule(), + schema: String::new(), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), + status: Status::Success, + }, updated_at_block_height: None, created_at_block_height: 0, + forked_from: None, }; let account_id = "alice.near".parse::().unwrap(); let mut account_indexers = IndexerConfigByFunctionName::new(StorageKeys::Account( @@ -1739,7 +1611,7 @@ mod tests { assert_eq!( contract.list_indexer_functions(Some("alice.near".to_string())), - OldAccountOrAllIndexers::Account(HashMap::from([("test".to_string(), config)])) + AccountOrAllIndexers::AccountIndexers(HashMap::from([("test".to_string(), config)])) ); } @@ -1748,7 +1620,11 @@ mod tests { let mut contract = Contract::default(); contract.register( - String::from("test"), + "test".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), String::from("code"), String::from("schema"), Rule::ActionAny { @@ -1756,6 +1632,7 @@ mod tests { status: Status::Any, }, StartBlock::Latest, + None, ); assert_eq!( @@ -1765,16 +1642,20 @@ mod tests { HashMap::from([( String::from("test"), IndexerConfig { + start_block: StartBlock::Latest, code: String::from("code"), schema: String::from("schema"), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Any, }, - start_block: StartBlock::Latest, updated_at_block_height: None, - created_at_block_height: env::block_height(), - } + created_at_block_height: 0, + forked_from: Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), + }, )]) )]) ); @@ -1785,7 +1666,11 @@ mod tests { let mut contract = Contract::default(); contract.register( - String::from("test"), + "test".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), String::from("code"), String::from("schema"), Rule::ActionAny { @@ -1793,6 +1678,7 @@ mod tests { status: Status::Any, }, StartBlock::Latest, + None, ); assert_eq!( @@ -1806,7 +1692,11 @@ mod tests { let mut contract = Contract::default(); contract.register( - String::from("test"), + "test".to_string(), + Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), String::from("code"), String::from("schema"), Rule::ActionAny { @@ -1814,6 +1704,7 @@ mod tests { status: Status::Any, }, StartBlock::Latest, + None, ); assert_eq!( @@ -1821,16 +1712,20 @@ mod tests { HashMap::from([( String::from("test"), IndexerConfig { + start_block: StartBlock::Latest, code: String::from("code"), schema: String::from("schema"), - rule: Rule::ActionAny { - affected_account_id: String::from("social.near"), + rule: Rule:: ActionAny { + affected_account_id: "social.near".to_string(), status: Status::Any, }, - start_block: StartBlock::Latest, updated_at_block_height: None, - created_at_block_height: env::block_height(), - } + created_at_block_height: 0, + forked_from: Some(IndexerIdentity { + account_id: "some_other_account.near".parse().unwrap(), + function_name: String::from("some_other_function"), + }), + }, )]) ); } diff --git a/registry/types/src/lib.rs b/registry/types/src/lib.rs index 1a012d89f..d66f42fd8 100644 --- a/registry/types/src/lib.rs +++ b/registry/types/src/lib.rs @@ -14,123 +14,6 @@ use serde::{Deserialize, Serialize}; type FunctionName = String; -#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize, BorshDeserialize, PartialEq, Eq)] -#[serde(tag = "rule", rename_all = "SCREAMING_SNAKE_CASE")] -pub enum MatchingRule { - ActionAny { - affected_account_id: String, - status: Status, - }, - ActionFunctionCall { - affected_account_id: String, - status: Status, - function: String, - }, - Event { - contract_account_id: String, - standard: String, - version: String, - event: String, - }, -} - -impl From for MatchingRule { - fn from(value: Rule) -> Self { - match value { - Rule::ActionAny { - affected_account_id, - status, - } => MatchingRule::ActionAny { - affected_account_id, - status, - }, - Rule::Event { - contract_account_id, - standard, - version, - event, - } => MatchingRule::Event { - contract_account_id, - standard, - version, - event, - }, - Rule::ActionFunctionCall { - affected_account_id, - status, - function, - } => MatchingRule::ActionFunctionCall { - affected_account_id, - status, - function, - }, - } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize, BorshDeserialize, PartialEq, Eq)] -pub enum IndexerRuleKind { - Action, - Event, - AnyBlock, - Shard, -} - -#[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize, BorshDeserialize, PartialEq, Eq)] -pub struct OldIndexerRule { - pub indexer_rule_kind: IndexerRuleKind, - pub matching_rule: MatchingRule, - // These are not set, and not used anywhere - pub id: Option, - pub name: Option, -} - -#[derive(BorshSerialize, BorshDeserialize, Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] -pub struct OldIndexerConfig { - pub code: String, - pub start_block_height: Option, - pub schema: Option, - pub filter: OldIndexerRule, - pub updated_at_block_height: Option, - pub created_at_block_height: u64, -} - -impl From for OldIndexerConfig { - fn from(config: IndexerConfig) -> Self { - let start_block_height = match config.start_block { - StartBlock::Latest => None, - StartBlock::Continue => None, - StartBlock::Height(height) => Some(height), - }; - - let schema = if config.schema.is_empty() { - None - } else { - Some(config.schema) - }; - - OldIndexerConfig { - start_block_height, - schema, - code: config.code, - filter: OldIndexerRule { - indexer_rule_kind: IndexerRuleKind::Action, - matching_rule: config.rule.into(), - id: None, - name: None, - }, - created_at_block_height: config.created_at_block_height, - updated_at_block_height: config.updated_at_block_height, - } - } -} - -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] -pub enum OldAccountOrAllIndexers { - All(HashMap>), - Account(HashMap), -} - #[derive(Clone, Debug, Serialize, Deserialize, BorshSerialize, BorshDeserialize, PartialEq, Eq)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] pub enum Status { @@ -159,40 +42,6 @@ pub enum Rule { }, } -impl From for Rule { - fn from(value: MatchingRule) -> Self { - match value { - MatchingRule::ActionAny { - affected_account_id, - status, - } => Rule::ActionAny { - affected_account_id, - status, - }, - MatchingRule::Event { - contract_account_id, - standard, - version, - event, - } => Rule::Event { - contract_account_id, - standard, - version, - event, - }, - MatchingRule::ActionFunctionCall { - affected_account_id, - status, - function, - } => Rule::ActionFunctionCall { - affected_account_id, - status, - function, - }, - } - } -} - #[derive(BorshSerialize, BorshDeserialize, Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] pub enum StartBlock { @@ -205,6 +54,22 @@ pub enum StartBlock { Continue, } +#[derive(BorshSerialize, BorshDeserialize, Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +pub struct IndexerIdentity { + pub account_id: AccountId, + pub function_name: FunctionName, +} + +#[derive(BorshSerialize, BorshDeserialize, Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +pub struct OldIndexerConfig { + pub code: String, + pub start_block: StartBlock, + pub schema: String, + pub rule: Rule, + pub updated_at_block_height: Option, + pub created_at_block_height: u64, +} + #[derive(BorshSerialize, BorshDeserialize, Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] pub struct IndexerConfig { pub code: String, @@ -213,20 +78,19 @@ pub struct IndexerConfig { pub rule: Rule, pub updated_at_block_height: Option, pub created_at_block_height: u64, + pub forked_from: Option, } impl From for IndexerConfig { fn from(config: OldIndexerConfig) -> Self { Self { - start_block: match config.start_block_height { - Some(height) => StartBlock::Height(height), - None => StartBlock::Latest, - }, - schema: config.schema.unwrap_or(String::new()), + start_block: config.start_block, + schema: config.schema, code: config.code, - rule: config.filter.matching_rule.into(), + rule: config.rule, created_at_block_height: config.created_at_block_height, updated_at_block_height: config.updated_at_block_height, + forked_from: None, } } } @@ -234,3 +98,9 @@ impl From for IndexerConfig { pub type AccountIndexers = HashMap; pub type AllIndexers = HashMap; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] +pub enum AccountOrAllIndexers { + AccountIndexers(HashMap), + AllIndexers(HashMap), +} diff --git a/runner/package-lock.json b/runner/package-lock.json index 76ee8c6a5..09089c3e3 100644 --- a/runner/package-lock.json +++ b/runner/package-lock.json @@ -18,11 +18,12 @@ "@opentelemetry/api": "^1.8.0", "@opentelemetry/exporter-zipkin": "^1.22.0", "@opentelemetry/resources": "^1.22.0", - "@opentelemetry/sdk-node": "^0.49.1", + "@opentelemetry/sdk-node": "^0.50.0", "@opentelemetry/sdk-trace-base": "^1.22.0", "@opentelemetry/sdk-trace-node": "^1.22.0", "@opentelemetry/semantic-conventions": "^1.22.0", "express": "^4.18.2", + "graphql": "^16.8.1", "long": "^5.2.3", "node-fetch": "^2.6.11", "node-sql-parser": "^5.0.0", @@ -2794,9 +2795,9 @@ } }, "node_modules/@opentelemetry/api-logs": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.49.1.tgz", - "integrity": "sha512-kaNl/T7WzyMUQHQlVq7q0oV4Kev6+0xFwqzofryC66jgGMacd0QH5TwfpbUwSTby+SdAdprAe5UKMvBw4tKS5Q==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.50.0.tgz", + "integrity": "sha512-JdZuKrhOYggqOpUljAq4WWNi5nB10PmgoF0y2CvedLGXd0kSawb/UBnWT8gg1ND3bHCNHStAIVT0ELlxJJRqrA==", "dependencies": { "@opentelemetry/api": "^1.0.0" }, @@ -2805,9 +2806,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.22.0.tgz", - "integrity": "sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.23.0.tgz", + "integrity": "sha512-wazGJZDRevibOJ+VgyrT+9+8sybZAxpZx2G7vy30OAtk92OpZCg7HgNxT11NUx0VBDWcRx1dOatMYGOVplQ7QA==", "engines": { "node": ">=14" }, @@ -2816,11 +2817,11 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", - "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.23.0.tgz", + "integrity": "sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -2830,16 +2831,16 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz", - "integrity": "sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.50.0.tgz", + "integrity": "sha512-w/NF4TrwHxx+Uz1M0rCOSVr6KgcoQPv3zF9JRqcebY2euD7ddWnLP0hE8JavyA1uq4UchnMp9faAk9n7hTCePw==", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.22.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.49.1", - "@opentelemetry/otlp-transformer": "0.49.1", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/sdk-trace-base": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.50.0", + "@opentelemetry/otlp-transformer": "0.50.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0" }, "engines": { "node": ">=14" @@ -2849,15 +2850,15 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.49.1.tgz", - "integrity": "sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.50.0.tgz", + "integrity": "sha512-L7OtIMT7MsFqkmhbQlPBGRXt7152VN5esHpQEJYIBFedOEo3Da+yHpu5ojMZtPzpIvSpB5Xr5lnJUjJCbkttCA==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/otlp-exporter-base": "0.49.1", - "@opentelemetry/otlp-transformer": "0.49.1", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/sdk-trace-base": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-exporter-base": "0.50.0", + "@opentelemetry/otlp-transformer": "0.50.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0" }, "engines": { "node": ">=14" @@ -2867,16 +2868,16 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.49.1.tgz", - "integrity": "sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.50.0.tgz", + "integrity": "sha512-vavD9Ow6yOLiD+ocuS/oeciCsXNdsN41aYUrEljNaLXogvnkfMhJ+JLAhOnRSpzlVtRp7Ciw2BYGdYSebR0OsA==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/otlp-exporter-base": "0.49.1", - "@opentelemetry/otlp-proto-exporter-base": "0.49.1", - "@opentelemetry/otlp-transformer": "0.49.1", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/sdk-trace-base": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-exporter-base": "0.50.0", + "@opentelemetry/otlp-proto-exporter-base": "0.50.0", + "@opentelemetry/otlp-transformer": "0.50.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0" }, "engines": { "node": ">=14" @@ -2886,14 +2887,14 @@ } }, "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.22.0.tgz", - "integrity": "sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.23.0.tgz", + "integrity": "sha512-2LOGvNUGONuIcWhynFaJorVyqv03uZkURScciLmOxvBf2lWTNPEj77br1dCpShIWBM+YlrH7Tc+JXAs+GC7DqA==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/sdk-trace-base": "1.22.0", - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -2903,11 +2904,11 @@ } }, "node_modules/@opentelemetry/instrumentation": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.49.1.tgz", - "integrity": "sha512-0DLtWtaIppuNNRRllSD4bjU8ZIiLp1cDXvJEbp752/Zf+y3gaLNaoGRGIlX4UHhcsrmtL+P2qxi3Hodi8VuKiQ==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.50.0.tgz", + "integrity": "sha512-bhGhbJiZKpuu7wTaSak4hyZcFPlnDeuSF/2vglze8B4w2LubcSbbOnkVTzTs5SXtzh4Xz8eRjaNnAm+u2GYufQ==", "dependencies": { - "@opentelemetry/api-logs": "0.49.1", + "@opentelemetry/api-logs": "0.50.0", "@types/shimmer": "^1.0.2", "import-in-the-middle": "1.7.1", "require-in-the-middle": "^7.1.1", @@ -2922,11 +2923,11 @@ } }, "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.49.1.tgz", - "integrity": "sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.50.0.tgz", + "integrity": "sha512-JUmjmrCmE1/fc4LjCQMqLfudgSl5OpUkzx7iA94b4jgeODM7zWxUoVXL7/CT7fWf47Cn+pmKjMvTCSESqZZ3mA==", "dependencies": { - "@opentelemetry/core": "1.22.0" + "@opentelemetry/core": "1.23.0" }, "engines": { "node": ">=14" @@ -2936,13 +2937,13 @@ } }, "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.49.1.tgz", - "integrity": "sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.50.0.tgz", + "integrity": "sha512-J500AczSD7xEsjXpwNzSh5HQqxW73PT3CCNsi1VEWCE+8UPgVfkHYIGRHGoch35DV+CMe1svbi7gAk3e5eCSVA==", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.22.0", - "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-exporter-base": "0.50.0", "protobufjs": "^7.2.3" }, "engines": { @@ -2953,12 +2954,12 @@ } }, "node_modules/@opentelemetry/otlp-proto-exporter-base": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.49.1.tgz", - "integrity": "sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.50.0.tgz", + "integrity": "sha512-hlbn3eZbhxoK79Sq1ddj1f7qcx+PzsPQC/SFpJvaWgTaqacCbqJmpzWDKfRRCAC7iGX2Hj/sgpf8vysazqyMOw==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/otlp-exporter-base": "0.49.1", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/otlp-exporter-base": "0.50.0", "protobufjs": "^7.2.3" }, "engines": { @@ -2969,16 +2970,16 @@ } }, "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.49.1.tgz", - "integrity": "sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.50.0.tgz", + "integrity": "sha512-s0sl1Yfqd5q1Kjrf6DqXPWzErL+XHhrXOfejh4Vc/SMTNqC902xDsC8JQxbjuramWt/+hibfguIvi7Ns8VLolA==", "dependencies": { - "@opentelemetry/api-logs": "0.49.1", - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/sdk-logs": "0.49.1", - "@opentelemetry/sdk-metrics": "1.22.0", - "@opentelemetry/sdk-trace-base": "1.22.0" + "@opentelemetry/api-logs": "0.50.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-logs": "0.50.0", + "@opentelemetry/sdk-metrics": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0" }, "engines": { "node": ">=14" @@ -2988,11 +2989,11 @@ } }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.22.0.tgz", - "integrity": "sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.23.0.tgz", + "integrity": "sha512-cZ6rl8y2bdxYQ4e+zP2CQ+QmuPebaLBLO1skjFpj3eEu7zar+6hBzUP3llMOUupkQeQSwXz+4c8dZ26OhYfG/g==", "dependencies": { - "@opentelemetry/core": "1.22.0" + "@opentelemetry/core": "1.23.0" }, "engines": { "node": ">=14" @@ -3002,11 +3003,11 @@ } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.22.0.tgz", - "integrity": "sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.23.0.tgz", + "integrity": "sha512-6iArixfgIl3ZgzeltQ5jyiKbjZygM+MbM84pXi1HL0Qs4x4Ck5rM6wEtjhZffFnlDMWEkEqrnM0xF6bTfbiMAQ==", "dependencies": { - "@opentelemetry/core": "1.22.0" + "@opentelemetry/core": "1.23.0" }, "engines": { "node": ">=14" @@ -3016,12 +3017,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", - "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.23.0.tgz", + "integrity": "sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -3031,12 +3032,12 @@ } }, "node_modules/@opentelemetry/sdk-logs": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.49.1.tgz", - "integrity": "sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.50.0.tgz", + "integrity": "sha512-PeUEupBB29p9nlPNqXoa1PUWNLsZnxG0DCDj3sHqzae+8y76B/A5hvZjg03ulWdnvBLYpnJslqzylG9E0IL87g==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0" }, "engines": { "node": ">=14" @@ -3047,12 +3048,12 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", - "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.23.0.tgz", + "integrity": "sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", "lodash.merge": "^4.6.2" }, "engines": { @@ -3063,23 +3064,23 @@ } }, "node_modules/@opentelemetry/sdk-node": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.49.1.tgz", - "integrity": "sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==", - "dependencies": { - "@opentelemetry/api-logs": "0.49.1", - "@opentelemetry/core": "1.22.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.49.1", - "@opentelemetry/exporter-trace-otlp-http": "0.49.1", - "@opentelemetry/exporter-trace-otlp-proto": "0.49.1", - "@opentelemetry/exporter-zipkin": "1.22.0", - "@opentelemetry/instrumentation": "0.49.1", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/sdk-logs": "0.49.1", - "@opentelemetry/sdk-metrics": "1.22.0", - "@opentelemetry/sdk-trace-base": "1.22.0", - "@opentelemetry/sdk-trace-node": "1.22.0", - "@opentelemetry/semantic-conventions": "1.22.0" + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.50.0.tgz", + "integrity": "sha512-LhIXHnvcnhRYcPwG9VG4G6lJ7x4ElYF6UYHHmXA7e4ZWzSUEFmAPfR1IBWv358aD1KwffcEBu7J6zeAR7lPZag==", + "dependencies": { + "@opentelemetry/api-logs": "0.50.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.50.0", + "@opentelemetry/exporter-trace-otlp-http": "0.50.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.50.0", + "@opentelemetry/exporter-zipkin": "1.23.0", + "@opentelemetry/instrumentation": "0.50.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-logs": "0.50.0", + "@opentelemetry/sdk-metrics": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0", + "@opentelemetry/sdk-trace-node": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -3089,13 +3090,13 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.22.0.tgz", - "integrity": "sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.23.0.tgz", + "integrity": "sha512-PzBmZM8hBomUqvCddF/5Olyyviayka44O5nDWq673np3ctnvwMOvNrsUORZjKja1zJbwEuD9niAGbnVrz3jwRQ==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -3105,15 +3106,15 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.22.0.tgz", - "integrity": "sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==", - "dependencies": { - "@opentelemetry/context-async-hooks": "1.22.0", - "@opentelemetry/core": "1.22.0", - "@opentelemetry/propagator-b3": "1.22.0", - "@opentelemetry/propagator-jaeger": "1.22.0", - "@opentelemetry/sdk-trace-base": "1.22.0", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.23.0.tgz", + "integrity": "sha512-dwnin5Go2r6VzJZkVc9JBPupssWp7j2EFto+S7qRkwQ00WDykWeq3x2Skk7I1Jr448FeBSvGCQVPgV5e6s6O3w==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.23.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/propagator-b3": "1.23.0", + "@opentelemetry/propagator-jaeger": "1.23.0", + "@opentelemetry/sdk-trace-base": "1.23.0", "semver": "^7.5.2" }, "engines": { @@ -3124,9 +3125,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", - "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.23.0.tgz", + "integrity": "sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==", "engines": { "node": ">=14" } @@ -7791,8 +7792,6 @@ "version": "16.8.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", - "dev": true, - "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -10634,9 +10633,9 @@ } }, "node_modules/require-in-the-middle": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", - "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz", + "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", "dependencies": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", diff --git a/runner/src/hasura-client/__snapshots__/hasura-client.test.ts.snap b/runner/src/hasura-client/__snapshots__/hasura-client.test.ts.snap index 6cfdfa5e3..b1b518094 100644 --- a/runner/src/hasura-client/__snapshots__/hasura-client.test.ts.snap +++ b/runner/src/hasura-client/__snapshots__/hasura-client.test.ts.snap @@ -46,6 +46,7 @@ exports[`HasuraClient adds the specified permissions for the specified roles/tab { "args": { "permission": { + "backend_only": true, "check": {}, "columns": "*", "computed_fields": [], @@ -63,6 +64,7 @@ exports[`HasuraClient adds the specified permissions for the specified roles/tab { "args": { "permission": { + "backend_only": true, "check": {}, "columns": "*", "computed_fields": [], @@ -80,6 +82,7 @@ exports[`HasuraClient adds the specified permissions for the specified roles/tab { "args": { "permission": { + "backend_only": true, "check": {}, "columns": "*", "computed_fields": [], @@ -115,6 +118,7 @@ exports[`HasuraClient adds the specified permissions for the specified roles/tab { "args": { "permission": { + "backend_only": true, "check": {}, "columns": "*", "computed_fields": [], @@ -132,6 +136,7 @@ exports[`HasuraClient adds the specified permissions for the specified roles/tab { "args": { "permission": { + "backend_only": true, "check": {}, "columns": "*", "computed_fields": [], @@ -149,6 +154,7 @@ exports[`HasuraClient adds the specified permissions for the specified roles/tab { "args": { "permission": { + "backend_only": true, "check": {}, "columns": "*", "computed_fields": [], diff --git a/runner/src/hasura-client/hasura-client.ts b/runner/src/hasura-client/hasura-client.ts index d0a27af13..6efb3c986 100644 --- a/runner/src/hasura-client/hasura-client.ts +++ b/runner/src/hasura-client/hasura-client.ts @@ -415,6 +415,7 @@ export default class HasuraClient { check: {}, computed_fields: [], filter: {}, + ...(permission !== 'select' && { backend_only: true }), ...(permission === 'select' && { allow_aggregations: true }) }, }, diff --git a/runner/src/indexer/indexer.ts b/runner/src/indexer/indexer.ts index f1c5ee783..344deae86 100644 --- a/runner/src/indexer/indexer.ts +++ b/runner/src/indexer/indexer.ts @@ -79,6 +79,8 @@ export default class Indexer { async execute ( block: lakePrimitives.Block, ): Promise { + this.logger.debug('Executing block', { blockHeight: block.blockHeight }); + const blockHeight: number = block.blockHeight; const lag = Date.now() - Math.floor(Number(block.header().timestampNanosec) / 1000000); diff --git a/runner/src/lake-client/lake-client.ts b/runner/src/lake-client/lake-client.ts index 09c8476ed..a8541e199 100644 --- a/runner/src/lake-client/lake-client.ts +++ b/runner/src/lake-client/lake-client.ts @@ -6,7 +6,10 @@ import RedisClient from '../redis-client'; export default class LakeClient { constructor ( private readonly network: string = 'mainnet', - private readonly s3Client: S3Client = new S3Client(), + private readonly s3Client: S3Client = new S3Client({ + maxAttempts: 5, + retryMode: 'adaptive' + }), private readonly redisClient: RedisClient = new RedisClient() ) {} diff --git a/runner/src/stream-handler/stream-handler.ts b/runner/src/stream-handler/stream-handler.ts index 6c623b120..c6a07ce6c 100644 --- a/runner/src/stream-handler/stream-handler.ts +++ b/runner/src/stream-handler/stream-handler.ts @@ -67,8 +67,8 @@ export default class StreamHandler { indexer.setStoppedStatus().catch((e) => { this.logger.error('Failed to set stopped status for indexer', e); }); - - const streamErrorLogEntry = LogEntry.systemError(`Encountered error processing stream: ${this.indexerConfig.redisStreamKey}, terminating thread\n${error.toString()}`, this.executorContext.block_height); + const errorContent = error instanceof Error ? error.toString() : JSON.stringify(error); + const streamErrorLogEntry = LogEntry.systemError(`Encountered error processing stream: ${this.indexerConfig.redisStreamKey}, terminating thread\n${errorContent}`, this.executorContext.block_height); indexer.writeCrashedWorkerLog(streamErrorLogEntry) .catch((e) => { @@ -83,7 +83,7 @@ export default class StreamHandler { private handleMessage (message: WorkerMessage): void { switch (message.type) { case WorkerMessageType.STATUS: - this.executorContext.status = message.data; + this.executorContext.status = message.data.status; break; case WorkerMessageType.BLOCK_HEIGHT: this.executorContext.block_height = message.data; diff --git a/runner/src/stream-handler/worker.ts b/runner/src/stream-handler/worker.ts index f45624986..6be274822 100644 --- a/runner/src/stream-handler/worker.ts +++ b/runner/src/stream-handler/worker.ts @@ -19,7 +19,7 @@ if (isMainThread) { } interface QueueMessage { - block: Block + block?: Block streamMessageId: string } @@ -42,7 +42,8 @@ void (async function main () { const logger = parentLogger.child({ service: 'StreamHandler/worker', accountId: indexerConfig.accountId, - functionName: indexerConfig.functionName + functionName: indexerConfig.functionName, + version: indexerConfig.version }); const redisClient = new RedisClient(); @@ -115,13 +116,14 @@ async function blockQueueConsumer (workerContext: WorkerContext): Promise const queueMessage = await wrapSpan(async () => { return await workerContext.queue.at(0); }, tracer, 'Wait for block to download'); + if (queueMessage === undefined) { workerContext.logger.warn('Block promise is undefined'); return; } const block = queueMessage.block; - if (block === undefined || block.blockHeight == null) { + if (!block?.blockHeight) { throw new Error(`Block ${currBlockHeight} failed to process or does not have block height`); } @@ -183,7 +185,11 @@ async function blockQueueConsumer (workerContext: WorkerContext): Promise } async function generateQueuePromise (workerContext: WorkerContext, blockHeight: number, streamMessageId: string): Promise { - const block = await workerContext.lakeClient.fetchBlock(blockHeight); + const block = await workerContext.lakeClient.fetchBlock(blockHeight).catch((err) => { + workerContext.logger.error(`Error fetching block ${blockHeight}`, err); + return undefined; + }); + return { block, streamMessageId diff --git a/runner/tests/testcontainers/hasura.ts b/runner/tests/testcontainers/hasura.ts index ab72c7e37..4fe28cd0c 100644 --- a/runner/tests/testcontainers/hasura.ts +++ b/runner/tests/testcontainers/hasura.ts @@ -11,7 +11,7 @@ export class HasuraGraphQLContainer { private constructor (private readonly container: GenericContainer) { container.withExposedPorts(this.PORT) - .withWaitStrategy(Wait.forLogMessage(/.*starting API server*/, 2)) + .withWaitStrategy(Wait.forLogMessage(/.*Starting API server.*/, 2)) .withLogConsumer(logConsumer) .withStartupTimeout(120_000); }