Compare commits
	
		
			1 Commits
		
	
	
		
			9db95c4e6c
			...
			kat/add-sh
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e23546de88 | 
| @@ -1,9 +0,0 @@ | ||||
| root = true | ||||
|  | ||||
| [*.json] | ||||
| end_of_line = lf | ||||
| charset = utf-8 | ||||
| indent_style = space | ||||
| indent_size =  2 | ||||
| trim_trailing_whitespace = true | ||||
| insert_final_newline = true | ||||
							
								
								
									
										5
									
								
								.envrc
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								.envrc
									
									
									
									
									
								
							| @@ -1,5 +0,0 @@ | ||||
| use flake . --impure | ||||
|  | ||||
| if [ -f .envrc.local ]; then | ||||
|     source .envrc.local | ||||
| fi | ||||
| @@ -1,17 +0,0 @@ | ||||
| name: Tests | ||||
| on: | ||||
|   pull_request: | ||||
|  | ||||
| env: | ||||
|   NIXPKGS_ALLOW_UNFREE: 1 | ||||
|  | ||||
| jobs: | ||||
|   install: | ||||
|     name: Tests | ||||
|     runs-on: nixos-x86_64-linux | ||||
|     steps: | ||||
|       - uses: actions/checkout@v3 | ||||
|         with: | ||||
|           submodules: recursive | ||||
|       - name: codegen causes no changes | ||||
|         run: ./bin/assert-no-changes-wrapper.sh | ||||
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +0,0 @@ | ||||
| node_modules | ||||
| dist | ||||
| .direnv | ||||
| /after.txt | ||||
| /before.txt | ||||
| **/__pycache__/** | ||||
| @@ -1,6 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
| GQL_DIR=$(dirname $(dirname "$(realpath "$BASH_SOURCE")")) | ||||
|  | ||||
| cd $GQL_DIR | ||||
|  | ||||
| LD_LIBRARY_PATH="" nix develop --impure --command bash "$GQL_DIR/bin/assert-no-changes.sh" | ||||
| @@ -1,17 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
| git ls-files | xargs md5sum > before.txt | ||||
|  | ||||
| yarn install | ||||
| yarn graphql-codegen | ||||
| prettier ./src --write | ||||
| for proto in $(find ./rbproto -iname '*.proto'); do | ||||
| 		name=$(basename "$proto" .proto) | ||||
| 		protoc -I=./rbproto --python_out=./rbproto/python --pyi_out=./rbproto/python ./rbproto/shot.proto | ||||
|     yarn pbjs ./rbproto/shot.proto --ts ./rbproto/ts/shot.ts | ||||
| done | ||||
| prettier ./rbproto --write | ||||
|  | ||||
| git ls-files | xargs md5sum > after.txt | ||||
|  | ||||
|  | ||||
| diff before.txt after.txt | ||||
| @@ -1,10 +1,8 @@ | ||||
| overwrite: true | ||||
| schema: | ||||
|   - "src/schema.gql" | ||||
|   - "src/client-schema.gql" | ||||
| schema: "src/schema.gql" | ||||
| documents: "src/**/*.gql" | ||||
| generates: | ||||
|   src/index.tsx: | ||||
|   src/generated/graphql.tsx: | ||||
|     plugins: | ||||
|       - "typescript" | ||||
|       - "typescript-operations" | ||||
|   | ||||
							
								
								
									
										80
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										80
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							| @@ -1,80 +0,0 @@ | ||||
| { | ||||
|   "nodes": { | ||||
|     "flake-utils": { | ||||
|       "inputs": { | ||||
|         "systems": "systems" | ||||
|       }, | ||||
|       "locked": { | ||||
|         "lastModified": 1705309234, | ||||
|         "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", | ||||
|         "owner": "numtide", | ||||
|         "repo": "flake-utils", | ||||
|         "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "numtide", | ||||
|         "repo": "flake-utils", | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "gitignore": { | ||||
|       "inputs": { | ||||
|         "nixpkgs": ["nixpkgs"] | ||||
|       }, | ||||
|       "locked": { | ||||
|         "lastModified": 1703887061, | ||||
|         "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", | ||||
|         "owner": "hercules-ci", | ||||
|         "repo": "gitignore.nix", | ||||
|         "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "hercules-ci", | ||||
|         "repo": "gitignore.nix", | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "nixpkgs": { | ||||
|       "locked": { | ||||
|         "lastModified": 1706732774, | ||||
|         "narHash": "sha256-hqJlyJk4MRpcItGYMF+3uHe8HvxNETWvlGtLuVpqLU0=", | ||||
|         "owner": "nixos", | ||||
|         "repo": "nixpkgs", | ||||
|         "rev": "b8b232ae7b8b144397fdb12d20f592e5e7c1a64d", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "nixos", | ||||
|         "ref": "nixos-unstable", | ||||
|         "repo": "nixpkgs", | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "root": { | ||||
|       "inputs": { | ||||
|         "flake-utils": "flake-utils", | ||||
|         "gitignore": "gitignore", | ||||
|         "nixpkgs": "nixpkgs" | ||||
|       } | ||||
|     }, | ||||
|     "systems": { | ||||
|       "locked": { | ||||
|         "lastModified": 1681028828, | ||||
|         "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", | ||||
|         "owner": "nix-systems", | ||||
|         "repo": "default", | ||||
|         "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "nix-systems", | ||||
|         "repo": "default", | ||||
|         "type": "github" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   "root": "root", | ||||
|   "version": 7 | ||||
| } | ||||
							
								
								
									
										27
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								flake.nix
									
									
									
									
									
								
							| @@ -1,27 +0,0 @@ | ||||
| { | ||||
|   description = "Sample Nix ts-node build"; | ||||
|   inputs = { | ||||
|     nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; | ||||
|     flake-utils.url = "github:numtide/flake-utils"; | ||||
|     gitignore = { | ||||
|       url = "github:hercules-ci/gitignore.nix"; | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
|     }; | ||||
|   }; | ||||
|   outputs = { | ||||
|     self, | ||||
|     nixpkgs, | ||||
|     flake-utils, | ||||
|     gitignore, | ||||
|     ... | ||||
|   }: | ||||
|     flake-utils.lib.eachDefaultSystem (system: let | ||||
|       pkgs = import nixpkgs {inherit system;}; | ||||
|       nodejs = pkgs.nodejs-18_x; | ||||
|     in | ||||
|       with pkgs; { | ||||
|         devShell = mkShell { | ||||
|           buildInputs = [nodejs yarn watchman alejandra nodePackages.prettier just protobuf]; | ||||
|         }; | ||||
|       }); | ||||
| } | ||||
							
								
								
									
										39
									
								
								justfile
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								justfile
									
									
									
									
									
								
							| @@ -1,39 +0,0 @@ | ||||
| NIX := "LD_LIBRARY_PATH='' nix" | ||||
| PROTOBUF_DIR := "$PWD/rbproto" | ||||
|  | ||||
| prettier-gql: | ||||
| 	#!/usr/bin/env bash | ||||
| 	set -euxo pipefail | ||||
| 	{{NIX}} develop --impure --command prettier ./src --write | ||||
|  | ||||
| gql-codegen: | ||||
| 	#!/usr/bin/env bash | ||||
| 	set -euxo pipefail | ||||
| 	{{NIX}} develop --impure --command bash -c 'yarn install && yarn graphql-codegen' | ||||
|  | ||||
|  | ||||
| gql: gql-codegen prettier-gql | ||||
|  | ||||
| protobuf-compile-a-python name: | ||||
| 	protoc -I={{ PROTOBUF_DIR }} --python_out={{ PROTOBUF_DIR }}/python --pyi_out={{ PROTOBUF_DIR }}/python {{ PROTOBUF_DIR }}/shot.proto | ||||
|  | ||||
| protobuf-compile-a-js name: | ||||
| 	#!/usr/bin/env bash | ||||
| 	set -euxo pipefail | ||||
| 	{{NIX}} develop --impure --command bash -c 'yarn pbjs {{ PROTOBUF_DIR }}/shot.proto --ts {{ PROTOBUF_DIR }}/ts/shot.ts && yarn prettier ./rbproto --write' | ||||
|  | ||||
| protobuf-compile-all-js: | ||||
| 	#!/usr/bin/env bash | ||||
| 	for proto in $(find {{ PROTOBUF_DIR }} -iname '*.proto'); do | ||||
| 		name=$(basename "$proto" .proto) | ||||
| 		just protobuf-compile-a-js $name | ||||
| 	done | ||||
|  | ||||
| protobuf-compile-all-python: | ||||
| 	#!/usr/bin/env bash | ||||
| 	for proto in $(find {{ PROTOBUF_DIR }} -iname '*.proto'); do | ||||
| 		name=$(basename "$proto" .proto) | ||||
| 		just protobuf-compile-a-python $name | ||||
| 	done | ||||
|  | ||||
| protobuf-compile-everything: protobuf-compile-all-js protobuf-compile-all-python | ||||
							
								
								
									
										22
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,33 +1,15 @@ | ||||
| { | ||||
|   "name": "railbird-gql", | ||||
|   "version": "1.0.0", | ||||
|   "main": "dist/index.js", | ||||
|   "types": "dist/index.d.ts", | ||||
|   "scripts": { | ||||
|     "build": "tsc", | ||||
|     "prepublishOnly": "npm run build", | ||||
|     "postinstall": "tsc" | ||||
|   }, | ||||
|   "main": "index.js", | ||||
|   "repository": "ssh://gitea@dev.railbird.ai:1123/railbird/railbird-gql.git", | ||||
|   "author": "Ivan Malison <IvanMalison@gmail.com>", | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "@apollo/client": "^3.9.2", | ||||
|     "@graphql-codegen/cli": "^5.0.0", | ||||
|     "@graphql-codegen/typescript": "^4.0.1", | ||||
|     "@graphql-codegen/typescript-operations": "^4.0.1", | ||||
|     "@graphql-codegen/typescript-react-apollo": "^4.2.0", | ||||
|     "graphql": "^16.8.1", | ||||
|     "pbjs": "^0.0.14", | ||||
|     "prettier": "^3.2.5", | ||||
|     "prettier-plugin-organize-imports": "^3.2.4" | ||||
|   }, | ||||
|   "prettier": { | ||||
|     "plugins": [ | ||||
|       "prettier-plugin-organize-imports" | ||||
|     ] | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "typescript": "^4.x" | ||||
|     "graphql": "^16.8.1" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,16 +0,0 @@ | ||||
| [tool.poetry] | ||||
| name = "rbproto" | ||||
| version = "0.1.0" | ||||
| description = "" | ||||
| authors = ["Mike Kalange <countablecloud@gmail.com>"] | ||||
| readme = "README.md" | ||||
| packages = [{include = "rbproto"}] | ||||
|  | ||||
| [tool.poetry.dependencies] | ||||
| python = ">=3.10,<=3.13" | ||||
| protobuf = "^4.25.3" | ||||
|  | ||||
|  | ||||
| [build-system] | ||||
| requires = ["poetry-core"] | ||||
| build-backend = "poetry.core.masonry.api" | ||||
| @@ -1 +0,0 @@ | ||||
| from .python.shot_pb2 import *  # noqa: F401 | ||||
| @@ -1,49 +0,0 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # Generated by the protocol buffer compiler.  DO NOT EDIT! | ||||
| # source: shot.proto | ||||
| """Generated protocol buffer code.""" | ||||
| from google.protobuf import descriptor as _descriptor | ||||
| from google.protobuf import descriptor_pool as _descriptor_pool | ||||
| from google.protobuf import symbol_database as _symbol_database | ||||
| from google.protobuf.internal import builder as _builder | ||||
| # @@protoc_insertion_point(imports) | ||||
|  | ||||
| _sym_db = _symbol_database.Default() | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01\"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id\"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3') | ||||
|  | ||||
| _globals = globals() | ||||
| _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) | ||||
| _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals) | ||||
| if _descriptor._USE_C_DESCRIPTORS == False: | ||||
|   DESCRIPTOR._options = None | ||||
|   _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._options = None | ||||
|   _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_options = b'8\001' | ||||
|   _globals['_BOX']._serialized_start=31 | ||||
|   _globals['_BOX']._serialized_end=94 | ||||
|   _globals['_POINT']._serialized_start=96 | ||||
|   _globals['_POINT']._serialized_end=125 | ||||
|   _globals['_BALLDETECTION']._serialized_start=127 | ||||
|   _globals['_BALLDETECTION']._serialized_end=254 | ||||
|   _globals['_RLEBALLDETECTION']._serialized_start=256 | ||||
|   _globals['_RLEBALLDETECTION']._serialized_end=340 | ||||
|   _globals['_RLEDETECTIONHISTORY']._serialized_start=342 | ||||
|   _globals['_RLEDETECTIONHISTORY']._serialized_end=418 | ||||
|   _globals['_DETECTIONHISTORY']._serialized_start=420 | ||||
|   _globals['_DETECTIONHISTORY']._serialized_end=490 | ||||
|   _globals['_COLLISIONINFO']._serialized_start=493 | ||||
|   _globals['_COLLISIONINFO']._serialized_end=745 | ||||
|   _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_start=667 | ||||
|   _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_end=745 | ||||
|   _globals['_PATH']._serialized_start=748 | ||||
|   _globals['_PATH']._serialized_end=1080 | ||||
|   _globals['_IDENTIFIERHISTORY']._serialized_start=1082 | ||||
|   _globals['_IDENTIFIERHISTORY']._serialized_end=1164 | ||||
|   _globals['_KEYBALLIDENTIFIERS']._serialized_start=1167 | ||||
|   _globals['_KEYBALLIDENTIFIERS']._serialized_end=1411 | ||||
|   _globals['_SHOT']._serialized_start=1414 | ||||
|   _globals['_SHOT']._serialized_end=1582 | ||||
| # @@protoc_insertion_point(module_scope) | ||||
| @@ -1,135 +0,0 @@ | ||||
| from google.protobuf.internal import containers as _containers | ||||
| from google.protobuf import descriptor as _descriptor | ||||
| from google.protobuf import message as _message | ||||
| from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union | ||||
|  | ||||
| DESCRIPTOR: _descriptor.FileDescriptor | ||||
|  | ||||
| class Box(_message.Message): | ||||
|     __slots__ = ["left", "top", "width", "height"] | ||||
|     LEFT_FIELD_NUMBER: _ClassVar[int] | ||||
|     TOP_FIELD_NUMBER: _ClassVar[int] | ||||
|     WIDTH_FIELD_NUMBER: _ClassVar[int] | ||||
|     HEIGHT_FIELD_NUMBER: _ClassVar[int] | ||||
|     left: float | ||||
|     top: float | ||||
|     width: float | ||||
|     height: float | ||||
|     def __init__(self, left: _Optional[float] = ..., top: _Optional[float] = ..., width: _Optional[float] = ..., height: _Optional[float] = ...) -> None: ... | ||||
|  | ||||
| class Point(_message.Message): | ||||
|     __slots__ = ["x", "y"] | ||||
|     X_FIELD_NUMBER: _ClassVar[int] | ||||
|     Y_FIELD_NUMBER: _ClassVar[int] | ||||
|     x: float | ||||
|     y: float | ||||
|     def __init__(self, x: _Optional[float] = ..., y: _Optional[float] = ...) -> None: ... | ||||
|  | ||||
| class BallDetection(_message.Message): | ||||
|     __slots__ = ["plane_position", "annotation", "interpolated"] | ||||
|     PLANE_POSITION_FIELD_NUMBER: _ClassVar[int] | ||||
|     ANNOTATION_FIELD_NUMBER: _ClassVar[int] | ||||
|     INTERPOLATED_FIELD_NUMBER: _ClassVar[int] | ||||
|     plane_position: Point | ||||
|     annotation: Box | ||||
|     interpolated: bool | ||||
|     def __init__(self, plane_position: _Optional[_Union[Point, _Mapping]] = ..., annotation: _Optional[_Union[Box, _Mapping]] = ..., interpolated: bool = ...) -> None: ... | ||||
|  | ||||
| class RLEBallDetection(_message.Message): | ||||
|     __slots__ = ["detection", "count"] | ||||
|     DETECTION_FIELD_NUMBER: _ClassVar[int] | ||||
|     COUNT_FIELD_NUMBER: _ClassVar[int] | ||||
|     detection: BallDetection | ||||
|     count: int | ||||
|     def __init__(self, detection: _Optional[_Union[BallDetection, _Mapping]] = ..., count: _Optional[int] = ...) -> None: ... | ||||
|  | ||||
| class RLEDetectionHistory(_message.Message): | ||||
|     __slots__ = ["detections"] | ||||
|     DETECTIONS_FIELD_NUMBER: _ClassVar[int] | ||||
|     detections: _containers.RepeatedCompositeFieldContainer[RLEBallDetection] | ||||
|     def __init__(self, detections: _Optional[_Iterable[_Union[RLEBallDetection, _Mapping]]] = ...) -> None: ... | ||||
|  | ||||
| class DetectionHistory(_message.Message): | ||||
|     __slots__ = ["detections"] | ||||
|     DETECTIONS_FIELD_NUMBER: _ClassVar[int] | ||||
|     detections: _containers.RepeatedCompositeFieldContainer[BallDetection] | ||||
|     def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ... | ||||
|  | ||||
| class CollisionInfo(_message.Message): | ||||
|     __slots__ = ["source", "ball_identifiers", "wall_identifier", "frame_index", "static"] | ||||
|     class BallIdentifiersEntry(_message.Message): | ||||
|         __slots__ = ["key", "value"] | ||||
|         KEY_FIELD_NUMBER: _ClassVar[int] | ||||
|         VALUE_FIELD_NUMBER: _ClassVar[int] | ||||
|         key: int | ||||
|         value: Point | ||||
|         def __init__(self, key: _Optional[int] = ..., value: _Optional[_Union[Point, _Mapping]] = ...) -> None: ... | ||||
|     SOURCE_FIELD_NUMBER: _ClassVar[int] | ||||
|     BALL_IDENTIFIERS_FIELD_NUMBER: _ClassVar[int] | ||||
|     WALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int] | ||||
|     FRAME_INDEX_FIELD_NUMBER: _ClassVar[int] | ||||
|     STATIC_FIELD_NUMBER: _ClassVar[int] | ||||
|     source: int | ||||
|     ball_identifiers: _containers.MessageMap[int, Point] | ||||
|     wall_identifier: int | ||||
|     frame_index: int | ||||
|     static: bool | ||||
|     def __init__(self, source: _Optional[int] = ..., ball_identifiers: _Optional[_Mapping[int, Point]] = ..., wall_identifier: _Optional[int] = ..., frame_index: _Optional[int] = ..., static: bool = ...) -> None: ... | ||||
|  | ||||
| class Path(_message.Message): | ||||
|     __slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static", "start_info", "end_info"] | ||||
|     START_FRAME_FIELD_NUMBER: _ClassVar[int] | ||||
|     END_FRAME_FIELD_NUMBER: _ClassVar[int] | ||||
|     DETECTIONS_FIELD_NUMBER: _ClassVar[int] | ||||
|     RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int] | ||||
|     NOT_PRESENT_FIELD_NUMBER: _ClassVar[int] | ||||
|     IS_STATIC_FIELD_NUMBER: _ClassVar[int] | ||||
|     START_INFO_FIELD_NUMBER: _ClassVar[int] | ||||
|     END_INFO_FIELD_NUMBER: _ClassVar[int] | ||||
|     start_frame: int | ||||
|     end_frame: int | ||||
|     detections: DetectionHistory | ||||
|     rle_detections: RLEDetectionHistory | ||||
|     not_present: bool | ||||
|     is_static: bool | ||||
|     start_info: CollisionInfo | ||||
|     end_info: CollisionInfo | ||||
|     def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ..., start_info: _Optional[_Union[CollisionInfo, _Mapping]] = ..., end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...) -> None: ... | ||||
|  | ||||
| class IdentifierHistory(_message.Message): | ||||
|     __slots__ = ["ball_identifier", "paths"] | ||||
|     BALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int] | ||||
|     PATHS_FIELD_NUMBER: _ClassVar[int] | ||||
|     ball_identifier: int | ||||
|     paths: _containers.RepeatedCompositeFieldContainer[Path] | ||||
|     def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ... | ||||
|  | ||||
| class KeyBallIdentifiers(_message.Message): | ||||
|     __slots__ = ["cue_ball", "object_ball", "target_ball", "contact_sequence", "cue_ball_id", "object_ball_id", "target_ball_id"] | ||||
|     CUE_BALL_FIELD_NUMBER: _ClassVar[int] | ||||
|     OBJECT_BALL_FIELD_NUMBER: _ClassVar[int] | ||||
|     TARGET_BALL_FIELD_NUMBER: _ClassVar[int] | ||||
|     CONTACT_SEQUENCE_FIELD_NUMBER: _ClassVar[int] | ||||
|     CUE_BALL_ID_FIELD_NUMBER: _ClassVar[int] | ||||
|     OBJECT_BALL_ID_FIELD_NUMBER: _ClassVar[int] | ||||
|     TARGET_BALL_ID_FIELD_NUMBER: _ClassVar[int] | ||||
|     cue_ball: int | ||||
|     object_ball: int | ||||
|     target_ball: int | ||||
|     contact_sequence: _containers.RepeatedScalarFieldContainer[int] | ||||
|     cue_ball_id: int | ||||
|     object_ball_id: int | ||||
|     target_ball_id: int | ||||
|     def __init__(self, cue_ball: _Optional[int] = ..., object_ball: _Optional[int] = ..., target_ball: _Optional[int] = ..., contact_sequence: _Optional[_Iterable[int]] = ..., cue_ball_id: _Optional[int] = ..., object_ball_id: _Optional[int] = ..., target_ball_id: _Optional[int] = ...) -> None: ... | ||||
|  | ||||
| class Shot(_message.Message): | ||||
|     __slots__ = ["identifier_histories", "key_balls", "start_index", "end_index"] | ||||
|     IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int] | ||||
|     KEY_BALLS_FIELD_NUMBER: _ClassVar[int] | ||||
|     START_INDEX_FIELD_NUMBER: _ClassVar[int] | ||||
|     END_INDEX_FIELD_NUMBER: _ClassVar[int] | ||||
|     identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory] | ||||
|     key_balls: KeyBallIdentifiers | ||||
|     start_index: int | ||||
|     end_index: int | ||||
|     def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ..., key_balls: _Optional[_Union[KeyBallIdentifiers, _Mapping]] = ..., start_index: _Optional[int] = ..., end_index: _Optional[int] = ...) -> None: ... | ||||
| @@ -1,77 +0,0 @@ | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package serialized_shot; | ||||
|  | ||||
| message Box { | ||||
|   float left = 1; | ||||
|   float top = 2; | ||||
|   float width = 3; | ||||
|   float height = 4; | ||||
| } | ||||
|  | ||||
| message Point { | ||||
|   float x = 1; | ||||
|   float y = 2; | ||||
| } | ||||
|  | ||||
| message BallDetection { | ||||
|   Point plane_position = 1; | ||||
|   Box annotation = 2; | ||||
|   bool interpolated = 3; | ||||
| } | ||||
|  | ||||
| message RLEBallDetection { | ||||
|   BallDetection detection = 1; | ||||
|   uint32 count = 2; | ||||
| } | ||||
|  | ||||
| message RLEDetectionHistory { repeated RLEBallDetection detections = 1; } | ||||
|  | ||||
| message DetectionHistory { repeated BallDetection detections = 1; } | ||||
|  | ||||
| message CollisionInfo { | ||||
|   uint32 source = 1; | ||||
|   map<uint32, Point> ball_identifiers = 2; | ||||
|   uint32 wall_identifier = 3; | ||||
|   uint32 frame_index = 4; | ||||
|   bool static = 5; | ||||
| } | ||||
|  | ||||
| message Path { | ||||
|   uint32 start_frame = 1; | ||||
|   uint32 end_frame = 2; | ||||
|   oneof detection_history { | ||||
|     DetectionHistory detections = 3; | ||||
|     RLEDetectionHistory rle_detections = 4; | ||||
|     bool not_present = 5; | ||||
|   } | ||||
|   bool is_static = 6; | ||||
|   CollisionInfo start_info = 7; | ||||
|   CollisionInfo end_info = 8; | ||||
| } | ||||
|  | ||||
| message IdentifierHistory { | ||||
|   uint32 ball_identifier = 1; | ||||
|   repeated Path paths = 2; | ||||
| } | ||||
| message KeyBallIdentifiers { | ||||
|   uint32 cue_ball = 1; | ||||
|   uint32 object_ball = 2; | ||||
|   uint32 target_ball = 3; | ||||
|  | ||||
|   // For now this will just be cue->object/target->target | ||||
|   // Long term this will potentially represent a linked list | ||||
|   // of all balls in a shot. | ||||
|   repeated uint32 contact_sequence = 4; | ||||
|  | ||||
|   optional uint32 cue_ball_id = 5; | ||||
|   optional uint32 object_ball_id = 6; | ||||
|   optional uint32 target_ball_id = 7; | ||||
| } | ||||
|  | ||||
| message Shot { | ||||
|   repeated IdentifierHistory identifier_histories = 3; | ||||
|   KeyBallIdentifiers key_balls = 4; | ||||
|   uint32 start_index = 5; | ||||
|   uint32 end_index = 6; | ||||
| } | ||||
							
								
								
									
										1628
									
								
								rbproto/ts/shot.ts
									
									
									
									
									
								
							
							
						
						
									
										1628
									
								
								rbproto/ts/shot.ts
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,25 +0,0 @@ | ||||
| # see: https://www.apollographql.com/docs/react/local-state/managing-state-with-field-policies/ | ||||
| directive @client on FIELD | ||||
|  | ||||
| extend type ShotGQL { | ||||
|   startTime: Float! | ||||
|   endTime: Float! | ||||
| } | ||||
|  | ||||
| extend type UploadStreamGQL { | ||||
|   segmentEndFrames: [Int!]! | ||||
| } | ||||
|  | ||||
| extend type HLSPlaylistGQL { | ||||
|   segmentStartTimes: [Float!]! | ||||
| } | ||||
|  | ||||
| type SegmentEndFramesGQL { | ||||
|   id: Int! | ||||
|   segmentEndFrames: [Int!]! | ||||
| } | ||||
|  | ||||
| type SegmentStartTimesGQL { | ||||
|   id: Int! | ||||
|   segmentStartTimes: [Float!]! | ||||
| } | ||||
							
								
								
									
										577
									
								
								src/generated/graphql.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										577
									
								
								src/generated/graphql.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,577 @@ | ||||
| import { gql } from '@apollo/client'; | ||||
| import * as Apollo from '@apollo/client'; | ||||
| export type Maybe<T> = T | null; | ||||
| export type InputMaybe<T> = Maybe<T>; | ||||
| export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] }; | ||||
| export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> }; | ||||
| export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> }; | ||||
| export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never }; | ||||
| export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; | ||||
| const defaultOptions = {} as const; | ||||
| /** All built-in and custom scalars, mapped to their actual values */ | ||||
| export type Scalars = { | ||||
|   ID: { input: string; output: string; } | ||||
|   String: { input: string; output: string; } | ||||
|   Boolean: { input: boolean; output: boolean; } | ||||
|   Int: { input: number; output: number; } | ||||
|   Float: { input: number; output: number; } | ||||
|   /** Date with time (isoformat) */ | ||||
|   DateTime: { input: any; output: any; } | ||||
|   /** Decimal (fixed-point) */ | ||||
|   Decimal: { input: any; output: any; } | ||||
| }; | ||||
|  | ||||
| export type AggregateResultGql = { | ||||
|   __typename?: 'AggregateResultGQL'; | ||||
|   featureBuckets: Array<BucketGql>; | ||||
|   targetMetrics: Array<TargetMetricGql>; | ||||
| }; | ||||
|  | ||||
| export type AndFilter = { | ||||
|   filters: Array<FilterInput>; | ||||
| }; | ||||
|  | ||||
| export type BankFeaturesGql = { | ||||
|   __typename?: 'BankFeaturesGQL'; | ||||
|   bankAngle: Scalars['Float']['output']; | ||||
|   distance: Scalars['Float']['output']; | ||||
|   wallsHit: Array<WallTypeEnum>; | ||||
| }; | ||||
|  | ||||
| export type BucketGql = { | ||||
|   __typename?: 'BucketGQL'; | ||||
|   lowerBound: Scalars['Float']['output']; | ||||
|   rangeKey: Scalars['String']['output']; | ||||
| }; | ||||
|  | ||||
| export type BucketInputGql = { | ||||
|   lowerBound: Scalars['Float']['input']; | ||||
|   rangeKey: Scalars['String']['input']; | ||||
| }; | ||||
|  | ||||
| export type BucketSetGql = { | ||||
|   __typename?: 'BucketSetGQL'; | ||||
|   buckets: Array<BucketGql>; | ||||
|   feature: Scalars['String']['output']; | ||||
|   keyName: Scalars['String']['output']; | ||||
| }; | ||||
|  | ||||
| export type BucketSetInputGql = { | ||||
|   buckets: Array<BucketInputGql>; | ||||
|   feature: Scalars['String']['input']; | ||||
| }; | ||||
|  | ||||
| export type CreateBucketSetInput = { | ||||
|   buckets: Array<BucketInputGql>; | ||||
|   feature: Scalars['String']['input']; | ||||
|   keyName: Scalars['String']['input']; | ||||
| }; | ||||
|  | ||||
| export type CreateUploadStreamReturn = { | ||||
|   __typename?: 'CreateUploadStreamReturn'; | ||||
|   videoId: Scalars['Int']['output']; | ||||
| }; | ||||
|  | ||||
| export type CueBallSpeedInput = { | ||||
|   value: RangeFilter; | ||||
| }; | ||||
|  | ||||
| export type CueObjectAngleInput = { | ||||
|   value: RangeFilter; | ||||
| }; | ||||
|  | ||||
| export type CueObjectDistanceInput = { | ||||
|   value: RangeFilter; | ||||
| }; | ||||
|  | ||||
| export type CueObjectFeaturesGql = { | ||||
|   __typename?: 'CueObjectFeaturesGQL'; | ||||
|   cueBallSpeed?: Maybe<Scalars['Float']['output']>; | ||||
|   cueObjectAngle?: Maybe<Scalars['Float']['output']>; | ||||
|   cueObjectDistance?: Maybe<Scalars['Float']['output']>; | ||||
|   shotDirection?: Maybe<ShotDirectionEnum>; | ||||
| }; | ||||
|  | ||||
| export enum DeviceTypeEnum { | ||||
|   Android = 'ANDROID', | ||||
|   Browser = 'BROWSER', | ||||
|   Ios = 'IOS' | ||||
| } | ||||
|  | ||||
| export type EnumFilter = { | ||||
|   equals?: InputMaybe<Scalars['String']['input']>; | ||||
| }; | ||||
|  | ||||
| export type FilterInput = { | ||||
|   andFilters?: InputMaybe<AndFilter>; | ||||
|   cueBallSpeed?: InputMaybe<CueBallSpeedInput>; | ||||
|   cueObjectAngle?: InputMaybe<CueObjectAngleInput>; | ||||
|   cueObjectDistance?: InputMaybe<CueObjectDistanceInput>; | ||||
|   intendedPocketType?: InputMaybe<IntendedPocketTypeInput>; | ||||
|   orFilters?: InputMaybe<OrFilter>; | ||||
|   shotDirection?: InputMaybe<ShotDirectionInput>; | ||||
|   targetPocketDistance?: InputMaybe<TargetPocketDistanceInput>; | ||||
| }; | ||||
|  | ||||
| export type GetUploadLinkReturn = { | ||||
|   __typename?: 'GetUploadLinkReturn'; | ||||
|   linksRequested: Scalars['Int']['output']; | ||||
|   uploadUrl: Scalars['String']['output']; | ||||
|   uploadsCompleted: Scalars['Int']['output']; | ||||
| }; | ||||
|  | ||||
| export type IntendedPocketTypeInput = { | ||||
|   value: EnumFilter; | ||||
| }; | ||||
|  | ||||
| export type Mutation = { | ||||
|   __typename?: 'Mutation'; | ||||
|   createBucketSet: BucketSetGql; | ||||
|   createUploadStream: CreateUploadStreamReturn; | ||||
|   getUploadLink: GetUploadLinkReturn; | ||||
|   processVideoSource: ProcessVideoSourceReturn; | ||||
|   terminateUploadStream: Scalars['Boolean']['output']; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type MutationCreateBucketSetArgs = { | ||||
|   params: CreateBucketSetInput; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type MutationCreateUploadStreamArgs = { | ||||
|   uploadMetadata?: InputMaybe<UploadMetadataInput>; | ||||
|   videoName?: InputMaybe<Scalars['String']['input']>; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type MutationGetUploadLinkArgs = { | ||||
|   chunkIndex: Scalars['Int']['input']; | ||||
|   videoId: Scalars['Int']['input']; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type MutationProcessVideoSourceArgs = { | ||||
|   input: ProcessVideoSourceInput; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type MutationTerminateUploadStreamArgs = { | ||||
|   videoId: Scalars['Int']['input']; | ||||
| }; | ||||
|  | ||||
| export type OrFilter = { | ||||
|   filters: Array<FilterInput>; | ||||
| }; | ||||
|  | ||||
| export enum PocketEnum { | ||||
|   Corner = 'CORNER', | ||||
|   Side = 'SIDE' | ||||
| } | ||||
|  | ||||
| export type PocketingIntentionFeaturesGql = { | ||||
|   __typename?: 'PocketingIntentionFeaturesGQL'; | ||||
|   intendedPocketType?: Maybe<PocketEnum>; | ||||
|   make?: Maybe<Scalars['Boolean']['output']>; | ||||
|   targetPocketDistance?: Maybe<Scalars['Float']['output']>; | ||||
| }; | ||||
|  | ||||
| export type ProcessVideoSourceInput = { | ||||
|   val: Scalars['Int']['input']; | ||||
| }; | ||||
|  | ||||
| export type ProcessVideoSourceReturn = { | ||||
|   __typename?: 'ProcessVideoSourceReturn'; | ||||
|   val: Scalars['Int']['output']; | ||||
| }; | ||||
|  | ||||
| export type Query = { | ||||
|   __typename?: 'Query'; | ||||
|   getAggregateShots: Array<AggregateResultGql>; | ||||
|   getBucketSet?: Maybe<BucketSetGql>; | ||||
|   getShots: Array<ShotGql>; | ||||
|   getUser?: Maybe<UserGql>; | ||||
|   getVideo: VideoGql; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type QueryGetAggregateShotsArgs = { | ||||
|   bucketSets: Array<BucketSetInputGql>; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type QueryGetBucketSetArgs = { | ||||
|   keyName: Scalars['String']['input']; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type QueryGetShotsArgs = { | ||||
|   filterInput?: InputMaybe<FilterInput>; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type QueryGetUserArgs = { | ||||
|   userId: Scalars['Int']['input']; | ||||
| }; | ||||
|  | ||||
|  | ||||
| export type QueryGetVideoArgs = { | ||||
|   videoId: Scalars['Int']['input']; | ||||
| }; | ||||
|  | ||||
| export type RangeFilter = { | ||||
|   greaterThanEqualTo?: InputMaybe<Scalars['Float']['input']>; | ||||
|   lessThan?: InputMaybe<Scalars['Float']['input']>; | ||||
| }; | ||||
|  | ||||
| export enum ShotDirectionEnum { | ||||
|   Left = 'LEFT', | ||||
|   Right = 'RIGHT', | ||||
|   Straight = 'STRAIGHT' | ||||
| } | ||||
|  | ||||
| export type ShotDirectionInput = { | ||||
|   value: EnumFilter; | ||||
| }; | ||||
|  | ||||
| export type ShotFeaturesGql = { | ||||
|   __typename?: 'ShotFeaturesGQL'; | ||||
|   bank?: Maybe<BankFeaturesGql>; | ||||
|   cueBallSpeed?: Maybe<Scalars['Float']['output']>; | ||||
|   cueObjectAngle?: Maybe<Scalars['Float']['output']>; | ||||
|   cueObjectDistance?: Maybe<Scalars['Float']['output']>; | ||||
|   intendedPocket?: Maybe<PocketEnum>; | ||||
|   shotDirection?: Maybe<ShotDirectionEnum>; | ||||
|   targetPocketDistance?: Maybe<Scalars['Float']['output']>; | ||||
| }; | ||||
|  | ||||
| export type ShotGql = { | ||||
|   __typename?: 'ShotGQL'; | ||||
|   createdAt?: Maybe<Scalars['DateTime']['output']>; | ||||
|   cueObjectFeatures?: Maybe<CueObjectFeaturesGql>; | ||||
|   endFrame?: Maybe<Scalars['Int']['output']>; | ||||
|   features?: Maybe<ShotFeaturesGql>; | ||||
|   id?: Maybe<Scalars['Int']['output']>; | ||||
|   pocketingIntentionFeatures?: Maybe<PocketingIntentionFeaturesGql>; | ||||
|   startFrame?: Maybe<Scalars['Int']['output']>; | ||||
|   updatedAt?: Maybe<Scalars['DateTime']['output']>; | ||||
|   videoId?: Maybe<Scalars['Int']['output']>; | ||||
| }; | ||||
|  | ||||
| export type TargetFloatFeatureGql = { | ||||
|   __typename?: 'TargetFloatFeatureGQL'; | ||||
|   average?: Maybe<Scalars['Float']['output']>; | ||||
|   featureName: Scalars['String']['output']; | ||||
|   median?: Maybe<Scalars['Float']['output']>; | ||||
| }; | ||||
|  | ||||
| export type TargetMetricGql = { | ||||
|   __typename?: 'TargetMetricGQL'; | ||||
|   count?: Maybe<Scalars['Int']['output']>; | ||||
|   floatFeature?: Maybe<TargetFloatFeatureGql>; | ||||
|   makePercentage?: Maybe<Scalars['Float']['output']>; | ||||
| }; | ||||
|  | ||||
| export type TargetPocketDistanceInput = { | ||||
|   value: RangeFilter; | ||||
| }; | ||||
|  | ||||
| export type UploadMetadataInput = { | ||||
|   appVersion?: InputMaybe<Scalars['String']['input']>; | ||||
|   browserName?: InputMaybe<Scalars['String']['input']>; | ||||
|   browserVersion?: InputMaybe<Scalars['String']['input']>; | ||||
|   deviceType?: InputMaybe<DeviceTypeEnum>; | ||||
|   ipAddress?: InputMaybe<Scalars['String']['input']>; | ||||
|   locale?: InputMaybe<Scalars['String']['input']>; | ||||
|   networkType?: InputMaybe<Scalars['String']['input']>; | ||||
|   osVersion?: InputMaybe<Scalars['String']['input']>; | ||||
|   timezone?: InputMaybe<Scalars['String']['input']>; | ||||
| }; | ||||
|  | ||||
| export type UploadStreamGql = { | ||||
|   __typename?: 'UploadStreamGQL'; | ||||
|   createdAt: Scalars['DateTime']['output']; | ||||
|   id: Scalars['ID']['output']; | ||||
|   isCompleted: Scalars['Boolean']['output']; | ||||
|   linksRequested: Scalars['Int']['output']; | ||||
|   updatedAt: Scalars['DateTime']['output']; | ||||
|   uploadMetadata: UploadStreamMetadata; | ||||
|   uploadsCompleted: Scalars['Int']['output']; | ||||
| }; | ||||
|  | ||||
| export type UploadStreamMetadata = { | ||||
|   __typename?: 'UploadStreamMetadata'; | ||||
|   appVersion?: Maybe<Scalars['String']['output']>; | ||||
|   browserName?: Maybe<Scalars['String']['output']>; | ||||
|   browserVersion?: Maybe<Scalars['String']['output']>; | ||||
|   deviceType?: Maybe<DeviceTypeEnum>; | ||||
|   ipAddress?: Maybe<Scalars['String']['output']>; | ||||
|   locale?: Maybe<Scalars['String']['output']>; | ||||
|   networkType?: Maybe<Scalars['String']['output']>; | ||||
|   osVersion?: Maybe<Scalars['String']['output']>; | ||||
|   timezone?: Maybe<Scalars['String']['output']>; | ||||
| }; | ||||
|  | ||||
| export type UserGql = { | ||||
|   __typename?: 'UserGQL'; | ||||
|   createdAt?: Maybe<Scalars['DateTime']['output']>; | ||||
|   id: Scalars['Int']['output']; | ||||
|   statistics: UserStatisticsGql; | ||||
|   updatedAt?: Maybe<Scalars['DateTime']['output']>; | ||||
|   username: Scalars['String']['output']; | ||||
| }; | ||||
|  | ||||
| export type UserStatisticsGql = { | ||||
|   __typename?: 'UserStatisticsGQL'; | ||||
|   averageTimeBetweenShots: Scalars['Decimal']['output']; | ||||
|   makePercentage: Scalars['Decimal']['output']; | ||||
|   medianRun?: Maybe<Scalars['Decimal']['output']>; | ||||
|   timeSpentPlaying: Scalars['Decimal']['output']; | ||||
|   totalShots: Scalars['Int']['output']; | ||||
|   totalShotsMade: Scalars['Int']['output']; | ||||
| }; | ||||
|  | ||||
| export type VideoGql = { | ||||
|   __typename?: 'VideoGQL'; | ||||
|   averageTimeBetweenShots?: Maybe<Scalars['Decimal']['output']>; | ||||
|   createdAt: Scalars['DateTime']['output']; | ||||
|   elapsedTime: Scalars['Decimal']['output']; | ||||
|   endTime: Scalars['DateTime']['output']; | ||||
|   framesPerSecond: Scalars['Int']['output']; | ||||
|   id: Scalars['Int']['output']; | ||||
|   makePercentage: Scalars['Decimal']['output']; | ||||
|   medianRun: Scalars['Decimal']['output']; | ||||
|   shots: Array<ShotGql>; | ||||
|   startTime: Scalars['DateTime']['output']; | ||||
|   stream?: Maybe<UploadStreamGql>; | ||||
|   totalFrames: Scalars['Int']['output']; | ||||
|   totalShots: Scalars['Int']['output']; | ||||
|   totalShotsMade: Scalars['Int']['output']; | ||||
|   updatedAt: Scalars['DateTime']['output']; | ||||
| }; | ||||
|  | ||||
| export enum WallTypeEnum { | ||||
|   Long = 'LONG', | ||||
|   Short = 'SHORT' | ||||
| } | ||||
|  | ||||
| export type GetShotsQueryVariables = Exact<{ | ||||
|   filterInput?: InputMaybe<FilterInput>; | ||||
|   includeCueObjectDistance?: Scalars['Boolean']['input']; | ||||
|   includeCueObjectAngle?: Scalars['Boolean']['input']; | ||||
|   includeCueBallSpeed?: Scalars['Boolean']['input']; | ||||
|   includeShotDirection?: Scalars['Boolean']['input']; | ||||
|   includeTargetPocketDistance?: Scalars['Boolean']['input']; | ||||
|   includeMake?: Scalars['Boolean']['input']; | ||||
|   includeIntendedPocketType?: Scalars['Boolean']['input']; | ||||
| }>; | ||||
|  | ||||
|  | ||||
| export type GetShotsQuery = { __typename?: 'Query', getShots: Array<{ __typename?: 'ShotGQL', id?: number | null, videoId?: number | null, startFrame?: number | null, endFrame?: number | null, createdAt?: any | null, updatedAt?: any | null, cueObjectFeatures?: { __typename?: 'CueObjectFeaturesGQL', cueObjectDistance?: number | null, cueObjectAngle?: number | null, cueBallSpeed?: number | null, shotDirection?: ShotDirectionEnum | null } | null, pocketingIntentionFeatures?: { __typename?: 'PocketingIntentionFeaturesGQL', targetPocketDistance?: number | null, make?: boolean | null, intendedPocketType?: PocketEnum | null } | null }> }; | ||||
|  | ||||
| export type CreateUploadStreamMutationVariables = Exact<{ | ||||
|   videoName: Scalars['String']['input']; | ||||
|   deviceType?: InputMaybe<DeviceTypeEnum>; | ||||
|   osVersion?: InputMaybe<Scalars['String']['input']>; | ||||
|   appVersion?: InputMaybe<Scalars['String']['input']>; | ||||
|   browserName?: InputMaybe<Scalars['String']['input']>; | ||||
|   browserVersion?: InputMaybe<Scalars['String']['input']>; | ||||
|   locale?: InputMaybe<Scalars['String']['input']>; | ||||
|   timezone?: InputMaybe<Scalars['String']['input']>; | ||||
|   networkType?: InputMaybe<Scalars['String']['input']>; | ||||
|   ipAddress?: InputMaybe<Scalars['String']['input']>; | ||||
| }>; | ||||
|  | ||||
|  | ||||
| export type CreateUploadStreamMutation = { __typename?: 'Mutation', createUploadStream: { __typename?: 'CreateUploadStreamReturn', videoId: number } }; | ||||
|  | ||||
| export type GetUploadLinkMutationVariables = Exact<{ | ||||
|   videoId: Scalars['Int']['input']; | ||||
|   chunkIndex: Scalars['Int']['input']; | ||||
| }>; | ||||
|  | ||||
|  | ||||
| export type GetUploadLinkMutation = { __typename?: 'Mutation', getUploadLink: { __typename?: 'GetUploadLinkReturn', uploadUrl: string, linksRequested: number } }; | ||||
|  | ||||
| export type TerminateUploadStreamMutationVariables = Exact<{ | ||||
|   videoId: Scalars['Int']['input']; | ||||
| }>; | ||||
|  | ||||
|  | ||||
| export type TerminateUploadStreamMutation = { __typename?: 'Mutation', terminateUploadStream: boolean }; | ||||
|  | ||||
|  | ||||
| export const GetShotsDocument = gql` | ||||
|     query GetShots($filterInput: FilterInput, $includeCueObjectDistance: Boolean! = false, $includeCueObjectAngle: Boolean! = false, $includeCueBallSpeed: Boolean! = false, $includeShotDirection: Boolean! = false, $includeTargetPocketDistance: Boolean! = false, $includeMake: Boolean! = false, $includeIntendedPocketType: Boolean! = false) { | ||||
|   getShots(filterInput: $filterInput) { | ||||
|     id | ||||
|     videoId | ||||
|     startFrame | ||||
|     endFrame | ||||
|     createdAt | ||||
|     updatedAt | ||||
|     cueObjectFeatures { | ||||
|       cueObjectDistance @include(if: $includeCueObjectDistance) | ||||
|       cueObjectAngle @include(if: $includeCueObjectAngle) | ||||
|       cueBallSpeed @include(if: $includeCueBallSpeed) | ||||
|       shotDirection @include(if: $includeShotDirection) | ||||
|     } | ||||
|     pocketingIntentionFeatures { | ||||
|       targetPocketDistance @include(if: $includeTargetPocketDistance) | ||||
|       make @include(if: $includeMake) | ||||
|       intendedPocketType @include(if: $includeIntendedPocketType) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|     `; | ||||
|  | ||||
| /** | ||||
|  * __useGetShotsQuery__ | ||||
|  * | ||||
|  * To run a query within a React component, call `useGetShotsQuery` and pass it any options that fit your needs. | ||||
|  * When your component renders, `useGetShotsQuery` returns an object from Apollo Client that contains loading, error, and data properties | ||||
|  * you can use to render your UI. | ||||
|  * | ||||
|  * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; | ||||
|  * | ||||
|  * @example | ||||
|  * const { data, loading, error } = useGetShotsQuery({ | ||||
|  *   variables: { | ||||
|  *      filterInput: // value for 'filterInput' | ||||
|  *      includeCueObjectDistance: // value for 'includeCueObjectDistance' | ||||
|  *      includeCueObjectAngle: // value for 'includeCueObjectAngle' | ||||
|  *      includeCueBallSpeed: // value for 'includeCueBallSpeed' | ||||
|  *      includeShotDirection: // value for 'includeShotDirection' | ||||
|  *      includeTargetPocketDistance: // value for 'includeTargetPocketDistance' | ||||
|  *      includeMake: // value for 'includeMake' | ||||
|  *      includeIntendedPocketType: // value for 'includeIntendedPocketType' | ||||
|  *   }, | ||||
|  * }); | ||||
|  */ | ||||
| export function useGetShotsQuery(baseOptions?: Apollo.QueryHookOptions<GetShotsQuery, GetShotsQueryVariables>) { | ||||
|         const options = {...defaultOptions, ...baseOptions} | ||||
|         return Apollo.useQuery<GetShotsQuery, GetShotsQueryVariables>(GetShotsDocument, options); | ||||
|       } | ||||
| export function useGetShotsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<GetShotsQuery, GetShotsQueryVariables>) { | ||||
|           const options = {...defaultOptions, ...baseOptions} | ||||
|           return Apollo.useLazyQuery<GetShotsQuery, GetShotsQueryVariables>(GetShotsDocument, options); | ||||
|         } | ||||
| export function useGetShotsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<GetShotsQuery, GetShotsQueryVariables>) { | ||||
|           const options = {...defaultOptions, ...baseOptions} | ||||
|           return Apollo.useSuspenseQuery<GetShotsQuery, GetShotsQueryVariables>(GetShotsDocument, options); | ||||
|         } | ||||
| export type GetShotsQueryHookResult = ReturnType<typeof useGetShotsQuery>; | ||||
| export type GetShotsLazyQueryHookResult = ReturnType<typeof useGetShotsLazyQuery>; | ||||
| export type GetShotsSuspenseQueryHookResult = ReturnType<typeof useGetShotsSuspenseQuery>; | ||||
| export type GetShotsQueryResult = Apollo.QueryResult<GetShotsQuery, GetShotsQueryVariables>; | ||||
| export const CreateUploadStreamDocument = gql` | ||||
|     mutation CreateUploadStream($videoName: String!, $deviceType: DeviceTypeEnum, $osVersion: String, $appVersion: String, $browserName: String, $browserVersion: String, $locale: String, $timezone: String, $networkType: String, $ipAddress: String) { | ||||
|   createUploadStream( | ||||
|     videoName: $videoName | ||||
|     uploadMetadata: {deviceType: $deviceType, osVersion: $osVersion, appVersion: $appVersion, browserName: $browserName, browserVersion: $browserVersion, locale: $locale, timezone: $timezone, networkType: $networkType, ipAddress: $ipAddress} | ||||
|   ) { | ||||
|     videoId | ||||
|   } | ||||
| } | ||||
|     `; | ||||
| export type CreateUploadStreamMutationFn = Apollo.MutationFunction<CreateUploadStreamMutation, CreateUploadStreamMutationVariables>; | ||||
|  | ||||
| /** | ||||
|  * __useCreateUploadStreamMutation__ | ||||
|  * | ||||
|  * To run a mutation, you first call `useCreateUploadStreamMutation` within a React component and pass it any options that fit your needs. | ||||
|  * When your component renders, `useCreateUploadStreamMutation` returns a tuple that includes: | ||||
|  * - A mutate function that you can call at any time to execute the mutation | ||||
|  * - An object with fields that represent the current status of the mutation's execution | ||||
|  * | ||||
|  * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; | ||||
|  * | ||||
|  * @example | ||||
|  * const [createUploadStreamMutation, { data, loading, error }] = useCreateUploadStreamMutation({ | ||||
|  *   variables: { | ||||
|  *      videoName: // value for 'videoName' | ||||
|  *      deviceType: // value for 'deviceType' | ||||
|  *      osVersion: // value for 'osVersion' | ||||
|  *      appVersion: // value for 'appVersion' | ||||
|  *      browserName: // value for 'browserName' | ||||
|  *      browserVersion: // value for 'browserVersion' | ||||
|  *      locale: // value for 'locale' | ||||
|  *      timezone: // value for 'timezone' | ||||
|  *      networkType: // value for 'networkType' | ||||
|  *      ipAddress: // value for 'ipAddress' | ||||
|  *   }, | ||||
|  * }); | ||||
|  */ | ||||
| export function useCreateUploadStreamMutation(baseOptions?: Apollo.MutationHookOptions<CreateUploadStreamMutation, CreateUploadStreamMutationVariables>) { | ||||
|         const options = {...defaultOptions, ...baseOptions} | ||||
|         return Apollo.useMutation<CreateUploadStreamMutation, CreateUploadStreamMutationVariables>(CreateUploadStreamDocument, options); | ||||
|       } | ||||
| export type CreateUploadStreamMutationHookResult = ReturnType<typeof useCreateUploadStreamMutation>; | ||||
| export type CreateUploadStreamMutationResult = Apollo.MutationResult<CreateUploadStreamMutation>; | ||||
| export type CreateUploadStreamMutationOptions = Apollo.BaseMutationOptions<CreateUploadStreamMutation, CreateUploadStreamMutationVariables>; | ||||
| export const GetUploadLinkDocument = gql` | ||||
|     mutation GetUploadLink($videoId: Int!, $chunkIndex: Int!) { | ||||
|   getUploadLink(videoId: $videoId, chunkIndex: $chunkIndex) { | ||||
|     uploadUrl | ||||
|     linksRequested | ||||
|   } | ||||
| } | ||||
|     `; | ||||
| export type GetUploadLinkMutationFn = Apollo.MutationFunction<GetUploadLinkMutation, GetUploadLinkMutationVariables>; | ||||
|  | ||||
| /** | ||||
|  * __useGetUploadLinkMutation__ | ||||
|  * | ||||
|  * To run a mutation, you first call `useGetUploadLinkMutation` within a React component and pass it any options that fit your needs. | ||||
|  * When your component renders, `useGetUploadLinkMutation` returns a tuple that includes: | ||||
|  * - A mutate function that you can call at any time to execute the mutation | ||||
|  * - An object with fields that represent the current status of the mutation's execution | ||||
|  * | ||||
|  * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; | ||||
|  * | ||||
|  * @example | ||||
|  * const [getUploadLinkMutation, { data, loading, error }] = useGetUploadLinkMutation({ | ||||
|  *   variables: { | ||||
|  *      videoId: // value for 'videoId' | ||||
|  *      chunkIndex: // value for 'chunkIndex' | ||||
|  *   }, | ||||
|  * }); | ||||
|  */ | ||||
| export function useGetUploadLinkMutation(baseOptions?: Apollo.MutationHookOptions<GetUploadLinkMutation, GetUploadLinkMutationVariables>) { | ||||
|         const options = {...defaultOptions, ...baseOptions} | ||||
|         return Apollo.useMutation<GetUploadLinkMutation, GetUploadLinkMutationVariables>(GetUploadLinkDocument, options); | ||||
|       } | ||||
| export type GetUploadLinkMutationHookResult = ReturnType<typeof useGetUploadLinkMutation>; | ||||
| export type GetUploadLinkMutationResult = Apollo.MutationResult<GetUploadLinkMutation>; | ||||
| export type GetUploadLinkMutationOptions = Apollo.BaseMutationOptions<GetUploadLinkMutation, GetUploadLinkMutationVariables>; | ||||
| export const TerminateUploadStreamDocument = gql` | ||||
|     mutation TerminateUploadStream($videoId: Int!) { | ||||
|   terminateUploadStream(videoId: $videoId) | ||||
| } | ||||
|     `; | ||||
| export type TerminateUploadStreamMutationFn = Apollo.MutationFunction<TerminateUploadStreamMutation, TerminateUploadStreamMutationVariables>; | ||||
|  | ||||
| /** | ||||
|  * __useTerminateUploadStreamMutation__ | ||||
|  * | ||||
|  * To run a mutation, you first call `useTerminateUploadStreamMutation` within a React component and pass it any options that fit your needs. | ||||
|  * When your component renders, `useTerminateUploadStreamMutation` returns a tuple that includes: | ||||
|  * - A mutate function that you can call at any time to execute the mutation | ||||
|  * - An object with fields that represent the current status of the mutation's execution | ||||
|  * | ||||
|  * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; | ||||
|  * | ||||
|  * @example | ||||
|  * const [terminateUploadStreamMutation, { data, loading, error }] = useTerminateUploadStreamMutation({ | ||||
|  *   variables: { | ||||
|  *      videoId: // value for 'videoId' | ||||
|  *   }, | ||||
|  * }); | ||||
|  */ | ||||
| export function useTerminateUploadStreamMutation(baseOptions?: Apollo.MutationHookOptions<TerminateUploadStreamMutation, TerminateUploadStreamMutationVariables>) { | ||||
|         const options = {...defaultOptions, ...baseOptions} | ||||
|         return Apollo.useMutation<TerminateUploadStreamMutation, TerminateUploadStreamMutationVariables>(TerminateUploadStreamDocument, options); | ||||
|       } | ||||
| export type TerminateUploadStreamMutationHookResult = ReturnType<typeof useTerminateUploadStreamMutation>; | ||||
| export type TerminateUploadStreamMutationResult = Apollo.MutationResult<TerminateUploadStreamMutation>; | ||||
| export type TerminateUploadStreamMutationOptions = Apollo.BaseMutationOptions<TerminateUploadStreamMutation, TerminateUploadStreamMutationVariables>; | ||||
							
								
								
									
										7044
									
								
								src/index.tsx
									
									
									
									
									
								
							
							
						
						
									
										7044
									
								
								src/index.tsx
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,12 +0,0 @@ | ||||
| query GetAggregatedShotMetrics($aggregateInput: AggregateInputGQL!) { | ||||
|   getAggregatedShotMetrics(aggregateInput: $aggregateInput) { | ||||
|     aggregationIdentifiers { | ||||
|       featureName | ||||
|       groupName | ||||
|     } | ||||
|     targetMetrics { | ||||
|       count | ||||
|       makePercentage | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -1,9 +0,0 @@ | ||||
| query getDeployedConfig { | ||||
|   getDeployedConfig { | ||||
|     allowNewUsers | ||||
|     devMode | ||||
|     environment | ||||
|     firebase | ||||
|     minimumAllowedAppVersion | ||||
|   } | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| query GetFeed( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
|   $filters: VideoFilterInput = null | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|       id | ||||
|       owner { | ||||
|         username | ||||
|       } | ||||
|       name | ||||
|       screenshotUri | ||||
|       totalShotsMade | ||||
|       totalShots | ||||
|       makePercentage | ||||
|       createdAt | ||||
|       updatedAt | ||||
|       startTime | ||||
|       endTime | ||||
|       elapsedTime | ||||
|       screenshotUri | ||||
|       stream { | ||||
|         id | ||||
|         isCompleted | ||||
|       } | ||||
|       tableSize | ||||
|       tags { | ||||
|         tagClasses { | ||||
|           name | ||||
|         } | ||||
|         name | ||||
|       } | ||||
|     } | ||||
|     pageInfo { | ||||
|       hasNextPage | ||||
|       endCursor | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -1,9 +0,0 @@ | ||||
| query GetVideoMakePercentageIntervals($videoId: ID!, $intervalDuration: Int!) { | ||||
|   getVideoMakePercentageIntervals( | ||||
|     videoId: $videoId | ||||
|     intervalDuration: $intervalDuration | ||||
|   ) { | ||||
|     makePercentage | ||||
|     elapsedTime | ||||
|   } | ||||
| } | ||||
							
								
								
									
										30
									
								
								src/operations/shot_data.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/operations/shot_data.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| query GetShots( | ||||
| 	$filterInput: FilterInput | ||||
| 	$includeCueObjectDistance: Boolean! = false | ||||
| 	$includeCueObjectAngle: Boolean! = false | ||||
| 	$includeCueBallSpeed: Boolean! = false | ||||
| 	$includeShotDirection: Boolean! = false | ||||
| 	$includeTargetPocketDistance: Boolean! = false | ||||
| 	$includeMake: Boolean! = false | ||||
| 	$includeIntendedPocketType: Boolean! = false | ||||
| ) { | ||||
| 	getShots(filterInput: $filterInput) { | ||||
| 		id | ||||
| 		videoId | ||||
| 		startFrame | ||||
| 		endFrame | ||||
| 		createdAt | ||||
| 		updatedAt | ||||
| 		cueObjectFeatures { | ||||
| 			cueObjectDistance @include(if: $includeCueObjectDistance) | ||||
| 			cueObjectAngle @include(if: $includeCueObjectAngle) | ||||
| 			cueBallSpeed @include(if: $includeCueBallSpeed) | ||||
| 			shotDirection @include(if: $includeShotDirection) | ||||
| 		} | ||||
| 		pocketingIntentionFeatures { | ||||
| 			targetPocketDistance @include(if: $includeTargetPocketDistance) | ||||
| 			make @include(if: $includeMake) | ||||
| 			intendedPocketType @include(if: $includeIntendedPocketType) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,156 +0,0 @@ | ||||
| query GetSerializedShotPaths($filterInput: FilterInput!) { | ||||
|   getShots(filterInput: $filterInput) { | ||||
|     id | ||||
|     videoId | ||||
|     startFrame | ||||
|     endFrame | ||||
|     serializedShotPaths { | ||||
|       b64EncodedBuffer | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetShotAnnotationTypes { | ||||
|   getShotAnnotationTypes { | ||||
|     id | ||||
|     name | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation UpdateShotAnnotations( | ||||
|   $shotId: Int! | ||||
|   $annotations: [UpdateAnnotationInputGQL!]! | ||||
| ) { | ||||
|   updateShotAnnotations(shotId: $shotId, annotations: $annotations) { | ||||
|     shot { | ||||
|       id | ||||
|       annotations { | ||||
|         shotId | ||||
|         type { | ||||
|           id | ||||
|           name | ||||
|         } | ||||
|         notes | ||||
|       } | ||||
|     } | ||||
|     error { | ||||
|       shotId | ||||
|       msg | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetShotsWithVideoGql( | ||||
|   $filterInput: FilterInput! | ||||
|   $shotsOrdering: GetShotsOrdering | ||||
|   $limit: Int | ||||
| ) { | ||||
|   getOrderedShots( | ||||
|     filterInput: $filterInput | ||||
|     shotsOrdering: $shotsOrdering | ||||
|     limit: $limit | ||||
|   ) { | ||||
|     shots { | ||||
|       id | ||||
|       videoId | ||||
|       video { | ||||
|         screenshotUri | ||||
|         endTime | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| ## Reserved for playlists (which are created from a filter) | ||||
| query GetShotsWithMetadataFilterResult( | ||||
|   $filterInput: FilterInput! | ||||
|   $shotsOrdering: GetShotsOrdering | ||||
|   $limit: Int | ||||
|   $ids: [Int!] | ||||
| ) { | ||||
|   getOrderedShots( | ||||
|     filterInput: $filterInput | ||||
|     shotsOrdering: $shotsOrdering | ||||
|     limit: $limit | ||||
|     ids: $ids | ||||
|   ) { | ||||
|     count | ||||
|     shots { | ||||
|       ...ShotWithAllFeatures | ||||
|     } | ||||
|     ids | ||||
|   } | ||||
| } | ||||
|  | ||||
| # TODO: Delete | ||||
| query GetShotsWithMetadata( | ||||
|   $filterInput: FilterInput! | ||||
|   $shotsPagination: GetShotsPagination | ||||
|   $limit: Int | ||||
|   $ids: [Int!] | ||||
| ) { | ||||
|   getShotsWithMetadata( | ||||
|     filterInput: $filterInput | ||||
|     shotsPagination: $shotsPagination | ||||
|     limit: $limit | ||||
|     ids: $ids | ||||
|   ) { | ||||
|     count | ||||
|     shots { | ||||
|       ...ShotWithAllFeatures | ||||
|     } | ||||
|     ids | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetShotsByIds($ids: [Int!]!) { | ||||
|   getShotsByIds(ids: $ids) { | ||||
|     ...ShotWithAllFeatures | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment ShotWithAllFeatures on ShotGQL { | ||||
|   id | ||||
|   videoId | ||||
|   startFrame | ||||
|   endFrame | ||||
|   startTime @client | ||||
|   endTime @client | ||||
|   user { | ||||
|     id | ||||
|   } | ||||
|   falsePositiveScore | ||||
|   createdAt | ||||
|   updatedAt | ||||
|   cueObjectFeatures { | ||||
|     cueObjectDistance | ||||
|     cueObjectAngle | ||||
|     cueBallSpeed | ||||
|     shotDirection | ||||
|     spinType | ||||
|   } | ||||
|   pocketingIntentionFeatures { | ||||
|     make | ||||
|     targetPocketDistance | ||||
|     targetPocketAngle | ||||
|     targetPocketAngleDirection | ||||
|     marginOfErrorInDegrees | ||||
|     intendedPocketType | ||||
|   } | ||||
|   pocketingIntentionInfo { | ||||
|     ballId | ||||
|     pocketId | ||||
|     pathMetadataIndex | ||||
|   } | ||||
|   serializedShotPaths { | ||||
|     b64EncodedBuffer | ||||
|   } | ||||
|   annotations { | ||||
|     shotId | ||||
|     type { | ||||
|       id | ||||
|       name | ||||
|     } | ||||
|     notes | ||||
|   } | ||||
| } | ||||
| @@ -1,127 +0,0 @@ | ||||
| mutation getProfileImageUploadLink($fileExt: String = ".png") { | ||||
|   getProfileImageUploadLink(fileExt: $fileExt) { | ||||
|     value { | ||||
|       ... on UploadLink { | ||||
|         uploadUrl | ||||
|         headers { | ||||
|           key | ||||
|           value | ||||
|         } | ||||
|       } | ||||
|       ... on GetProfileUploadLinkErrors { | ||||
|         error { | ||||
|           ... on TooManyProfileImageUploadsErr { | ||||
|             linksRequested | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation editProfileImageUri($profileImageUri: String!) { | ||||
|   editProfileImageUri(profileImageUri: $profileImageUri) { | ||||
|     id | ||||
|     firebaseUid | ||||
|     username | ||||
|     profileImageUri | ||||
|     createdAt | ||||
|     updatedAt | ||||
|   } | ||||
| } | ||||
|  | ||||
| query getLoggedInUser { | ||||
|   getLoggedInUser { | ||||
|     id | ||||
|     firebaseUid | ||||
|     username | ||||
|     isAdmin | ||||
|     profileImageUri | ||||
|     fargoRating | ||||
|     activeVideoId | ||||
|     createdAt | ||||
|     updatedAt | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetUserPlayTime($userId: Int!) { | ||||
|   getPlayTime(userId: $userId) { | ||||
|     totalSeconds | ||||
|   } | ||||
| } | ||||
|  | ||||
| query getUsernames( | ||||
|   $matchString: String! | ||||
|   $limit: Int = null | ||||
|   $after: String = null | ||||
| ) { | ||||
|   getUsernames(matchString: $matchString, limit: $limit, after: $after) | ||||
| } | ||||
|  | ||||
| query getUserRelationshipsMatching( | ||||
|   $userId: Int! | ||||
|   $matchString: String! | ||||
|   $limit: Int = null | ||||
|   $after: String = null | ||||
| ) { | ||||
|   getUserRelationshipsMatching( | ||||
|     userId: $userId | ||||
|     matchString: $matchString | ||||
|     limit: $limit | ||||
|     after: $after | ||||
|   ) { | ||||
|     relationships { | ||||
|       toUser { | ||||
|         username | ||||
|         id | ||||
|       } | ||||
|       toUserFollows | ||||
|       toUserIsFollowedBy | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetUserTags { | ||||
|   getUserTags { | ||||
|     id | ||||
|     name | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation followUser($followedUserId: Int!) { | ||||
|   followUser(followedUserId: $followedUserId) { | ||||
|     username | ||||
|     following { | ||||
|       id | ||||
|     } | ||||
|     followers { | ||||
|       id | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation unfollowUser($followedUserId: Int!) { | ||||
|   unfollowUser(followedUserId: $followedUserId) { | ||||
|     username | ||||
|     following { | ||||
|       id | ||||
|     } | ||||
|     followers { | ||||
|       id | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query getUserFollowingFollowers { | ||||
|   getLoggedInUser { | ||||
|     id | ||||
|     following { | ||||
|       id | ||||
|       username | ||||
|     } | ||||
|     followers { | ||||
|       id | ||||
|       username | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -1,290 +0,0 @@ | ||||
| query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) { | ||||
|   getVideo(videoId: $videoId, debuggingJson: $debuggingJson) { | ||||
|     id | ||||
|     totalShots | ||||
|     makePercentage | ||||
|     elapsedTime | ||||
|     currentHomography { | ||||
|       crop { | ||||
|         left | ||||
|         top | ||||
|         width | ||||
|         height | ||||
|       } | ||||
|       pockets { | ||||
|         left | ||||
|         top | ||||
|         width | ||||
|         height | ||||
|       } | ||||
|       sourcePoints { | ||||
|         topLeft { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         topSide { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         topRight { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         bottomLeft { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         bottomSide { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         bottomRight { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     stream { | ||||
|       id | ||||
|       linksRequested | ||||
|       uploadsCompleted | ||||
|       segmentProcessingCursor | ||||
|       isCompleted | ||||
|       uploadCompletionCursor | ||||
|       lastIntendedSegmentBound | ||||
|       initPlaylistUploadStatus | ||||
|     } | ||||
|     currentProcessing { | ||||
|       errors { | ||||
|         message | ||||
|         startSegmentIndex | ||||
|         endSegmentIndex | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideoUpdatePageDetails($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     name | ||||
|     totalShots | ||||
|     makePercentage | ||||
|     elapsedTime | ||||
|     tableSize | ||||
|     tags { | ||||
|       tagClasses { | ||||
|         name | ||||
|       } | ||||
|       name | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation DeleteVideo($videoId: Int!) { | ||||
|   deleteVideo(videoId: $videoId) | ||||
| } | ||||
|  | ||||
| query GetVideoDetails($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     name | ||||
|     screenshotUri | ||||
|     averageTimeBetweenShots | ||||
|     elapsedTime | ||||
|     endTime | ||||
|     makePercentage | ||||
|     medianRun | ||||
|     startTime | ||||
|     totalShots | ||||
|     totalShotsMade | ||||
|     createdAt | ||||
|     updatedAt | ||||
|     tableSize | ||||
|     owner { | ||||
|       id | ||||
|       firebaseUid | ||||
|       username | ||||
|       profileImageUri | ||||
|     } | ||||
|     tags { | ||||
|       tagClasses { | ||||
|         name | ||||
|       } | ||||
|       name | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideos($videoIds: [Int!]!) { | ||||
|   getVideos(videoIds: $videoIds) { | ||||
|     ...VideoStreamMetadata | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment VideoStreamMetadata on VideoGQL { | ||||
|   id | ||||
|   framesPerSecond | ||||
|   stream { | ||||
|     id | ||||
|     streamSegmentType | ||||
|     segments { | ||||
|       uploaded | ||||
|       valid | ||||
|       segmentIndex | ||||
|       endFrameIndex | ||||
|       framesPerSecond | ||||
|     } | ||||
|   } | ||||
|   playlist { | ||||
|     segmentDurations | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideoForShotTime($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     ...VideoStreamMetadata | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     playlist { | ||||
|       segmentDurations | ||||
|     } | ||||
|     homographyHistory { | ||||
|       frameIndex | ||||
|       crop { | ||||
|         left | ||||
|         top | ||||
|         width | ||||
|         height | ||||
|       } | ||||
|       pockets { | ||||
|         left | ||||
|         top | ||||
|         width | ||||
|         height | ||||
|       } | ||||
|       sourcePoints { | ||||
|         topLeft { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         topSide { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         topRight { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         bottomLeft { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         bottomSide { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|         bottomRight { | ||||
|           x | ||||
|           y | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     stream { | ||||
|       id | ||||
|       streamSegmentType | ||||
|       segments { | ||||
|         segmentIndex | ||||
|         endFrameIndex | ||||
|         framesPerSecond | ||||
|       } | ||||
|       resolution { | ||||
|         width | ||||
|         height | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetAverageTimePerShotForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     averageTimeBetweenShots | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetElapsedTimeForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     elapsedTime | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetMedianRunForVideo($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     medianRun | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment StreamWithEndFrames on UploadStreamGQL { | ||||
|   id | ||||
|   streamSegmentType | ||||
|   segmentEndFrames @client | ||||
|   resolution { | ||||
|     width | ||||
|     height | ||||
|   } | ||||
|   segments { | ||||
|     uploaded | ||||
|     valid | ||||
|     segmentIndex | ||||
|     endFrameIndex | ||||
|     framesPerSecond | ||||
|   } | ||||
| } | ||||
|  | ||||
| fragment SegmentEndFrames on SegmentEndFramesGQL { | ||||
|   id | ||||
|   segmentEndFrames | ||||
| } | ||||
|  | ||||
| fragment SegmentStartTimes on SegmentStartTimesGQL { | ||||
|   id | ||||
|   segmentStartTimes | ||||
| } | ||||
|  | ||||
| fragment PlaylistWithSegmentStartTimes on HLSPlaylistGQL { | ||||
|   videoId | ||||
|   segmentDurations | ||||
|   segmentStartTimes @client | ||||
| } | ||||
|  | ||||
| fragment VideoDurationData on VideoGQL { | ||||
|   id | ||||
|   framesPerSecond | ||||
|   playlist { | ||||
|     ...PlaylistWithSegmentStartTimes | ||||
|   } | ||||
|   stream { | ||||
|     ...StreamWithEndFrames | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetVideoForClipTimes($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     ...VideoDurationData | ||||
|   } | ||||
| } | ||||
|  | ||||
| query GetHeaderInfoByVideoId($videoId: Int!) { | ||||
|   getVideo(videoId: $videoId) { | ||||
|     id | ||||
|     name | ||||
|     startTime | ||||
|   } | ||||
| } | ||||
| @@ -1,126 +1,40 @@ | ||||
| mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) { | ||||
|   createUploadStream(videoMetadata: $videoMetadataInput) { | ||||
| mutation CreateUploadStream( | ||||
|   $videoName: String!, | ||||
|   $deviceType: DeviceTypeEnum, | ||||
|   $osVersion: String, | ||||
|   $appVersion: String, | ||||
|   $browserName: String, | ||||
|   $browserVersion: String, | ||||
|   $locale: String, | ||||
|   $timezone: String, | ||||
|   $networkType: String, | ||||
|   $ipAddress: String | ||||
| ) { | ||||
|   createUploadStream( | ||||
|     videoName: $videoName | ||||
|     uploadMetadata: { | ||||
|       deviceType: $deviceType | ||||
|       osVersion: $osVersion | ||||
|       appVersion: $appVersion | ||||
|       browserName: $browserName | ||||
|       browserVersion: $browserVersion | ||||
|       locale: $locale | ||||
|       timezone: $timezone | ||||
|       networkType: $networkType | ||||
|       ipAddress: $ipAddress | ||||
|     } | ||||
|   ) { | ||||
|     videoId | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) { | ||||
|   getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) { | ||||
|     value { | ||||
|       ... on UploadLink { | ||||
| mutation GetUploadLink($videoId: Int!, $chunkIndex: Int!) { | ||||
|   getUploadLink(videoId: $videoId, chunkIndex: $chunkIndex) { | ||||
|     uploadUrl | ||||
|         headers { | ||||
|           key | ||||
|           value | ||||
|         } | ||||
|       } | ||||
|       ... on GetUploadLinkErrors { | ||||
|         error { | ||||
|           ... on MustHaveSetForUploadLinkErr { | ||||
|             resolution | ||||
|             framesPerSecond | ||||
|           } | ||||
|           ... on SegmentAlreadyUploadedErr { | ||||
|             segmentId | ||||
|           } | ||||
|           ... on ProcessingFailedErr { | ||||
|             processing { | ||||
|               status | ||||
|               errors { | ||||
|                 message | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     stream { | ||||
|       uploadCompletionCursor | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation GetHlsInitUploadLink($videoId: Int!) { | ||||
|   getHlsInitUploadLink(videoId: $videoId) { | ||||
|     value { | ||||
|       ... on UploadLink { | ||||
|         uploadUrl | ||||
|         headers { | ||||
|           key | ||||
|           value | ||||
|         } | ||||
|       } | ||||
|       ... on GetUploadLinkErrors { | ||||
|         error { | ||||
|           ... on NoInitForChunkedUploadErr { | ||||
|             segmentType | ||||
|           } | ||||
|           ... on InitUploadAlreadyCompletedErr { | ||||
|             segmentType | ||||
|           } | ||||
|           ... on TooManyInitUploadsErr { | ||||
|     linksRequested | ||||
|   } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| mutation SetSegmentDuration( | ||||
|   $videoId: Int! | ||||
|   $segmentIndex: Int! | ||||
|   $duration: Float! | ||||
| ) { | ||||
|   setSegmentDuration( | ||||
|     videoId: $videoId | ||||
|     segmentIndex: $segmentIndex | ||||
|     duration: $duration | ||||
|   ) | ||||
| } | ||||
|  | ||||
| mutation EditUploadStream( | ||||
|   $videoId: Int! | ||||
|   $videoMetadataInput: VideoMetadataInput! | ||||
| ) { | ||||
|   editUploadStream(videoId: $videoId, videoMetadata: $videoMetadataInput) | ||||
| } | ||||
|  | ||||
| query GetUploadStreams( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
|   $filters: VideoFilterInput = null | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|       id | ||||
|     } | ||||
|     pageInfo { | ||||
|       hasNextPage | ||||
|       endCursor | ||||
|     } | ||||
|   } | ||||
| } | ||||
| query GetUploadStreamsWithDetails( | ||||
|   $limit: Int! = 5 | ||||
|   $after: String = null | ||||
|   $filters: VideoFilterInput = null | ||||
| ) { | ||||
|   getUserVideos(limit: $limit, after: $after, filters: $filters) { | ||||
|     videos { | ||||
|       id | ||||
|       name | ||||
|       startTime | ||||
|       stream { | ||||
|         isCompleted | ||||
|         lastIntendedSegmentBound | ||||
|         uploadCompletionCursor | ||||
|         uploadsCompleted | ||||
|       } | ||||
|     } | ||||
|     pageInfo { | ||||
|       hasNextPage | ||||
|       endCursor | ||||
|     } | ||||
|   } | ||||
| mutation TerminateUploadStream($videoId: Int!) { | ||||
|   terminateUploadStream(videoId: $videoId)  | ||||
| } | ||||
|   | ||||
							
								
								
									
										798
									
								
								src/schema.gql
									
									
									
									
									
								
							
							
						
						
									
										798
									
								
								src/schema.gql
									
									
									
									
									
								
							| @@ -1,103 +1,31 @@ | ||||
| type Query { | ||||
|   getAggregatedShotMetrics( | ||||
|     aggregateInput: AggregateInputGQL! | ||||
|   ): [AggregateResultGQL!]! | ||||
|   getBucketSet(keyName: String!): BucketSetGQL | ||||
|   getDeployedConfig: DeployedConfigGQL! | ||||
|   waitFor(duration: Float!): Float! | ||||
|   getVideoMakePercentageIntervals( | ||||
|     videoId: ID! | ||||
|     intervalDuration: Int! = 300 | ||||
|   ): [MakePercentageIntervalGQL!]! | ||||
|   getOrderedShots( | ||||
|     filterInput: FilterInput! | ||||
|     ids: [Int!] = null | ||||
|     shotsOrdering: GetShotsOrdering = null | ||||
|     limit: Int! = 500 | ||||
|   ): GetShotsResult! | ||||
|   getShotsWithMetadata( | ||||
|     filterInput: FilterInput! | ||||
|     ids: [Int!] = null | ||||
|     shotsPagination: GetShotsPagination = null | ||||
|     limit: Int! = 500 | ||||
|   ): GetShotsResult! | ||||
|   getShots( | ||||
|     filterInput: FilterInput! | ||||
|     shotsPagination: GetShotsPagination = null | ||||
|     limit: Int! = 500 | ||||
|   ): [ShotGQL!]! | ||||
|   getShotsByIds(ids: [Int!]!): [ShotGQL!]! | ||||
|   getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]! | ||||
|   getAggregateShots(bucketSets: [BucketSetInputGQL!]!): [AggregateResultGQL!]! | ||||
|   getUser(userId: Int!): UserGQL | ||||
|   getLoggedInUser: UserGQL | ||||
|   getUsernames( | ||||
|     matchString: String = null | ||||
|     limit: Int = null | ||||
|     after: String = null | ||||
|   ): [String!]! | ||||
|   getUserRelationshipsMatching( | ||||
|     userId: Int! | ||||
|     matchString: String = null | ||||
|     limit: Int = 100 | ||||
|     after: String = null | ||||
|   ): UserRelationshipsResult! | ||||
|   getPlayTime(userId: Int!): UserPlayTimeGQL! | ||||
|   getUserVideos( | ||||
|     userId: Int = null | ||||
|     limit: Int! = 5 | ||||
|     after: String = null | ||||
|     filters: VideoFilterInput = null | ||||
|   ): VideoHistoryGQL! | ||||
|   getUserTags: [TagGQL!]! | ||||
|   getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL! | ||||
|   getVideos(videoIds: [Int!]!): [VideoGQL!]! | ||||
|   getFeedVideos( | ||||
|     limit: Int! = 5 | ||||
|     after: String = null | ||||
|     filters: VideoFilterInput = null | ||||
|   ): VideoHistoryGQL! | ||||
|   getVideo(videoId: Int!): VideoGQL! | ||||
|   getShots(filterInput: FilterInput = null): [ShotGQL!]! | ||||
|   getBucketSet(keyName: String!): BucketSetGQL | ||||
| } | ||||
|  | ||||
| type AggregateResultGQL { | ||||
|   aggregationIdentifiers: [AggregationIdentifierGQL!]! | ||||
|   targetMetrics: TargetMetricsGQL! | ||||
|   featureBuckets: [BucketGQL!]! | ||||
|   targetMetrics: [TargetMetricGQL!]! | ||||
| } | ||||
|  | ||||
| type AggregationIdentifierGQL { | ||||
|   featureName: String! | ||||
|   groupName: String! | ||||
| type BucketGQL { | ||||
|   rangeKey: String! | ||||
|   lowerBound: Float! | ||||
| } | ||||
|  | ||||
| type TargetMetricsGQL { | ||||
|   count: Int! | ||||
| type TargetMetricGQL { | ||||
|   count: Int | ||||
|   makePercentage: Float | ||||
|   averageDifficulty: Float | ||||
|   spinTypeCounts: SpinTypeCountsGQL | ||||
|   shotDirectionCounts: ShotDirectionCountsGQL | ||||
|   floatFeature: TargetFloatFeatureGQL | ||||
| } | ||||
|  | ||||
| type SpinTypeCountsGQL { | ||||
|   follow: Int! | ||||
|   draw: Int! | ||||
|   center: Int! | ||||
|   unknown: Int! | ||||
| } | ||||
|  | ||||
| type ShotDirectionCountsGQL { | ||||
|   left: Int! | ||||
|   right: Int! | ||||
|   straight: Int! | ||||
| } | ||||
|  | ||||
| input AggregateInputGQL { | ||||
|   aggregations: [AggregationInput!]! | ||||
|   filterInput: FilterInput | ||||
| } | ||||
|  | ||||
| input AggregationInput @oneOf { | ||||
|   bucketSet: BucketSetInputGQL | ||||
|   enum: EnumAggregation | ||||
|   datetimeRange: DatetimeRangeAggregationInput | ||||
| type TargetFloatFeatureGQL { | ||||
|   featureName: String! | ||||
|   average: Float | ||||
|   median: Float | ||||
| } | ||||
|  | ||||
| input BucketSetInputGQL { | ||||
| @@ -110,91 +38,67 @@ input BucketInputGQL { | ||||
|   lowerBound: Float! | ||||
| } | ||||
|  | ||||
| input EnumAggregation { | ||||
|   feature: String! | ||||
| type UserGQL { | ||||
|   id: Int! | ||||
|   username: String! | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   statistics: UserStatisticsGQL! | ||||
| } | ||||
|  | ||||
| input DatetimeRangeAggregationInput { | ||||
|   startDatetime: DateTime = null | ||||
|   endDatetime: DateTime = null | ||||
|   interval: TimeInterval! | ||||
|   feature: String! = "created_at" | ||||
| } | ||||
|  | ||||
| """ | ||||
| Date with time (isoformat) | ||||
| """ | ||||
| """Date with time (isoformat)""" | ||||
| scalar DateTime | ||||
|  | ||||
| input TimeInterval @oneOf { | ||||
|   timedelta: TimeDeltaGQL | ||||
|   aligned: AlignedIntervalEnum | ||||
| type UserStatisticsGQL { | ||||
|   totalShots: Int! | ||||
|   totalShotsMade: Int! | ||||
|   makePercentage: Decimal! | ||||
|   averageTimeBetweenShots: Decimal! | ||||
|   timeSpentPlaying: Decimal! | ||||
|   medianRun: Decimal | ||||
| } | ||||
|  | ||||
| input TimeDeltaGQL { | ||||
|   days: Int = 0 | ||||
|   weeks: Int = 0 | ||||
|   months: Int = 0 | ||||
|   years: Int = 0 | ||||
| """Decimal (fixed-point)""" | ||||
| scalar Decimal | ||||
|  | ||||
| type VideoGQL { | ||||
|   id: Int! | ||||
|   totalShotsMade: Int! | ||||
|   totalShots: Int! | ||||
|   makePercentage: Decimal! | ||||
|   medianRun: Decimal! | ||||
|   averageTimeBetweenShots: Decimal | ||||
|   createdAt: DateTime! | ||||
|   updatedAt: DateTime! | ||||
|   shots: [ShotGQL!]! | ||||
|   startTime: DateTime! | ||||
|   endTime: DateTime! | ||||
|   elapsedTime: Decimal! | ||||
|   framesPerSecond: Int! | ||||
|   totalFrames: Int! | ||||
|   stream: UploadStreamGQL | ||||
| } | ||||
|  | ||||
| enum AlignedIntervalEnum { | ||||
|   MONTH | ||||
|   YEAR | ||||
|   WEEK | ||||
|   DAY | ||||
| type ShotGQL { | ||||
|   id: Int | ||||
|   videoId: Int | ||||
|   startFrame: Int | ||||
|   endFrame: Int | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   features: ShotFeaturesGQL | ||||
|   cueObjectFeatures: CueObjectFeaturesGQL | ||||
|   pocketingIntentionFeatures: PocketingIntentionFeaturesGQL | ||||
| } | ||||
|  | ||||
| input FilterInput @oneOf { | ||||
|   andFilters: [FilterInput!] | ||||
|   orFilters: [FilterInput!] | ||||
|   notFilter: FilterInput | ||||
|   cueObjectDistance: FloatRangeFilter | ||||
|   targetPocketDistance: FloatRangeFilter | ||||
|   cueObjectAngle: FloatRangeFilter | ||||
|   cueBallSpeed: FloatRangeFilter | ||||
|   difficulty: FloatRangeFilter | ||||
|   intendedPocketType: [PocketEnum!] | ||||
|   shotDirection: [ShotDirectionEnum!] | ||||
|   videoId: [Int!] | ||||
|   userId: [Int!] | ||||
|   username: [String!] | ||||
|   fargoRating: FloatRangeFilter | ||||
|   make: [Boolean!] | ||||
|   tags: [VideoTagInput!] | ||||
|   annotations: [ShotAnnotationInput!] | ||||
|   isStraight: [Boolean!] | ||||
|   isRight: [Boolean!] | ||||
|   isLeft: [Boolean!] | ||||
|   isLeftMiss: [Boolean!] | ||||
|   isRightMiss: [Boolean!] | ||||
|   isDirect: [Boolean!] | ||||
|   tableSize: FloatRangeFilter | ||||
|   bankAngle: FloatRangeFilter | ||||
|   bankDistance: FloatRangeFilter | ||||
|   kickAngle: FloatRangeFilter | ||||
|   kickDistance: FloatRangeFilter | ||||
|   cueAngleAfterObject: FloatRangeFilter | ||||
|   spinType: [SpinTypeEnum!] | ||||
|   cueSpeedAfterObject: FloatRangeFilter | ||||
|   falsePositiveScore: FloatRangeFilter | ||||
|   backcut: [Boolean!] | ||||
|   targetPocketAngleDirection: [ShotDirectionEnum!] | ||||
|   targetPocketAngle: FloatRangeFilter | ||||
|   missAngleInDegrees: FloatRangeFilter | ||||
|   marginOfErrorInDegrees: FloatRangeFilter | ||||
|   createdAt: DateRangeFilter | ||||
|   totalDistance: FloatRangeFilter | ||||
|   runLength: FloatRangeFilter | ||||
| } | ||||
|  | ||||
| input FloatRangeFilter { | ||||
|   lessThan: Float = null | ||||
|   greaterThanEqualTo: Float = null | ||||
|   greaterThan: Float = null | ||||
|   includeOnNone: Boolean! = false | ||||
|   lessThanInclusive: Boolean! = false | ||||
|   greaterThanInclusive: Boolean! = true | ||||
| type ShotFeaturesGQL { | ||||
|   cueObjectAngle: Float | ||||
|   cueObjectDistance: Float | ||||
|   targetPocketDistance: Float | ||||
|   intendedPocket: PocketEnum | ||||
|   cueBallSpeed: Float | ||||
|   shotDirection: ShotDirectionEnum | ||||
|   bank: BankFeaturesGQL | ||||
| } | ||||
|  | ||||
| enum PocketEnum { | ||||
| @@ -208,122 +112,6 @@ enum ShotDirectionEnum { | ||||
|   STRAIGHT | ||||
| } | ||||
|  | ||||
| input VideoTagInput { | ||||
|   tagClasses: [VideoTagClassInput!]! = [] | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| input VideoTagClassInput { | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| input ShotAnnotationInput { | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| enum SpinTypeEnum { | ||||
|   DRAW | ||||
|   FOLLOW | ||||
|   CENTER | ||||
|   UNKNOWN | ||||
| } | ||||
|  | ||||
| input DateRangeFilter { | ||||
|   lessThan: Date = null | ||||
|   greaterThanEqualTo: Date = null | ||||
|   greaterThan: Date = null | ||||
|   includeOnNone: Boolean! = false | ||||
|   lessThanInclusive: Boolean! = false | ||||
|   greaterThanInclusive: Boolean! = true | ||||
| } | ||||
|  | ||||
| """ | ||||
| Date (isoformat) | ||||
| """ | ||||
| scalar Date | ||||
|  | ||||
| type BucketSetGQL { | ||||
|   keyName: String! | ||||
|   feature: String! | ||||
|   buckets: [BucketGQL!]! | ||||
| } | ||||
|  | ||||
| type BucketGQL { | ||||
|   rangeKey: String! | ||||
|   lowerBound: Float! | ||||
| } | ||||
|  | ||||
| type DeployedConfigGQL { | ||||
|   allowNewUsers: Boolean! | ||||
|   firebase: Boolean! | ||||
|   devMode: Boolean! | ||||
|   environment: String! | ||||
|   minimumAllowedAppVersion: String! | ||||
| } | ||||
|  | ||||
| type MakePercentageIntervalGQL { | ||||
|   makePercentage: Float! | ||||
|   elapsedTime: Float! | ||||
| } | ||||
|  | ||||
| type GetShotsResult { | ||||
|   shots: [ShotGQL!]! | ||||
|   count: Int | ||||
|   ids: [Int!]! | ||||
| } | ||||
|  | ||||
| type ShotGQL { | ||||
|   id: Int! | ||||
|   videoId: Int! | ||||
|   startFrame: Int! | ||||
|   endFrame: Int! | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   cueObjectFeatures: CueObjectFeaturesGQL | ||||
|   pocketingIntentionFeatures: PocketingIntentionFeaturesGQL | ||||
|   pocketingIntentionInfo: PocketingIntentionInfoGQL | ||||
|   bankFeatures: BankFeaturesGQL | ||||
|   serializedShotPaths: SerializedShotPathsGQL | ||||
|   user: UserGQL | ||||
|   annotations: [ShotAnnotationGQL!]! | ||||
|   falsePositiveScore: Float | ||||
|   video: VideoGQL | ||||
| } | ||||
|  | ||||
| type CueObjectFeaturesGQL { | ||||
|   cueObjectDistance: Float | ||||
|   cueObjectAngle: Float | ||||
|   cueBallSpeed: Float | ||||
|   shotDirection: ShotDirectionEnum | ||||
|   spinType: SpinTypeEnum | ||||
| } | ||||
|  | ||||
| type PocketingIntentionFeaturesGQL { | ||||
|   targetPocketDistance: Float | ||||
|   make: Boolean | ||||
|   intendedPocketType: PocketEnum | ||||
|   difficulty: Float | ||||
|   targetPocketAngle: Float | ||||
|   targetPocketAngleDirection: ShotDirectionEnum | ||||
|   marginOfErrorInDegrees: Float | ||||
|   backcut: Boolean | ||||
| } | ||||
|  | ||||
| type PocketingIntentionInfoGQL { | ||||
|   ballId: Int! | ||||
|   pocketId: PocketIdentifier! | ||||
|   pathMetadataIndex: Int! | ||||
| } | ||||
|  | ||||
| enum PocketIdentifier { | ||||
|   TOP_LEFT | ||||
|   TOP_SIDE | ||||
|   TOP_RIGHT | ||||
|   BOTTOM_LEFT | ||||
|   BOTTOM_SIDE | ||||
|   BOTTOM_RIGHT | ||||
| } | ||||
|  | ||||
| type BankFeaturesGQL { | ||||
|   wallsHit: [WallTypeEnum!]! | ||||
|   bankAngle: Float! | ||||
| @@ -335,300 +123,111 @@ enum WallTypeEnum { | ||||
|   SHORT | ||||
| } | ||||
|  | ||||
| type SerializedShotPathsGQL { | ||||
|   b64EncodedBuffer: String | ||||
| type CueObjectFeaturesGQL { | ||||
|   cueObjectDistance: Float | ||||
|   cueObjectAngle: Float | ||||
|   cueBallSpeed: Float | ||||
|   shotDirection: ShotDirectionEnum | ||||
| } | ||||
|  | ||||
| type UserGQL { | ||||
|   id: Int! | ||||
|   firebaseUid: String | ||||
|   username: String! | ||||
|   isAdmin: Boolean | ||||
|   fargoRating: Int | ||||
|   activeVideoId: Int | ||||
|   profileImageUri: String | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   following: [UserGQL!] | ||||
|   followers: [UserGQL!] | ||||
| } | ||||
|  | ||||
| type ShotAnnotationGQL { | ||||
|   shotId: Int! | ||||
|   type: ShotAnnotationTypeGQL! | ||||
|   creator: UserGQL! | ||||
|   notes: String! | ||||
|   errorDefault: Boolean! | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
| } | ||||
|  | ||||
| type ShotAnnotationTypeGQL { | ||||
|   id: Int! | ||||
|   name: String! | ||||
| } | ||||
|  | ||||
| type VideoGQL { | ||||
|   id: Int! | ||||
|   owner: UserGQL | ||||
|   name: String | ||||
|   screenshotUri: String | ||||
|   totalShotsMade: Int! | ||||
|   totalShots: Int! | ||||
|   makePercentage: Float! | ||||
|   medianRun: Float | ||||
|   averageTimeBetweenShots: Float | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
|   shots: [ShotGQL!]! | ||||
|   startTime: DateTime | ||||
|   endTime: DateTime | ||||
|   elapsedTime: Float | ||||
|   framesPerSecond: Float! | ||||
|   tableSize: Float! | ||||
|   stream: UploadStreamGQL | ||||
|   playlist: HLSPlaylistGQL | ||||
|   tags: [VideoTag!]! | ||||
|   currentHomography: HomographyInfoGQL | ||||
|   homographyHistory: [HomographyInfoGQL!]! | ||||
|   currentProcessing: VideoProcessingGQL | ||||
| type PocketingIntentionFeaturesGQL { | ||||
|   targetPocketDistance: Float | ||||
|   make: Boolean | ||||
|   intendedPocketType: PocketEnum | ||||
| } | ||||
|  | ||||
| type UploadStreamGQL { | ||||
|   id: ID! | ||||
|   linksRequested: Int! | ||||
|   uploadsCompleted: Int! | ||||
|   segmentProcessingCursor: Int! | ||||
|   lastIntendedSegmentBound: Int | ||||
|   isCompleted: Boolean! | ||||
|   initPlaylistUploadStatus: InitPlaylistUploadStatusEnum | ||||
|   lowestUnuploadedSegmentIndex: Int! | ||||
|   uploadCompletionCursor: Int! | ||||
|   errors: [StreamErrorGQL!]! | ||||
|   uploadMetadata: UploadStreamMetadata! | ||||
|   createdAt: DateTime! | ||||
|   updatedAt: DateTime! | ||||
|   segments: [UploadSegmentGQL!]! | ||||
|   resolution: VideoResolutionGQL! | ||||
|   streamSegmentType: StreamSegmentTypeEnum! | ||||
| } | ||||
|  | ||||
| enum InitPlaylistUploadStatusEnum { | ||||
|   NOT_APPLICABLE | ||||
|   NOT_UPLOADED | ||||
|   UPLOADED | ||||
| type UploadStreamMetadata { | ||||
|   deviceType: DeviceTypeEnum | ||||
|   osVersion: String | ||||
|   appVersion: String | ||||
|   browserName: String | ||||
|   browserVersion: String | ||||
|   locale: String | ||||
|   timezone: String | ||||
|   networkType: String | ||||
|   ipAddress: String | ||||
| } | ||||
|  | ||||
| type StreamErrorGQL { | ||||
|   message: String! | ||||
| enum DeviceTypeEnum { | ||||
|   IOS | ||||
|   ANDROID | ||||
|   BROWSER | ||||
| } | ||||
|  | ||||
| type UploadSegmentGQL { | ||||
|   segmentIndex: Int! | ||||
|   uploaded: Boolean! | ||||
|   valid: Boolean! | ||||
|   endFrameIndex: Int | ||||
|   framesPerSecond: Float | ||||
|   durationInSeconds: Float | ||||
|   linksRequested: Int! | ||||
| input FilterInput { | ||||
|   andFilters: AndFilter = null | ||||
|   orFilters: OrFilter = null | ||||
|   cueObjectDistance: CueObjectDistanceInput = null | ||||
|   targetPocketDistance: TargetPocketDistanceInput = null | ||||
|   cueObjectAngle: CueObjectAngleInput = null | ||||
|   cueBallSpeed: CueBallSpeedInput = null | ||||
|   intendedPocketType: IntendedPocketTypeInput = null | ||||
|   shotDirection: ShotDirectionInput = null | ||||
| } | ||||
|  | ||||
| type VideoResolutionGQL { | ||||
|   width: Int | ||||
|   height: Int | ||||
| input AndFilter { | ||||
|   filters: [FilterInput!]! | ||||
| } | ||||
|  | ||||
| enum StreamSegmentTypeEnum { | ||||
|   FRAGMENTED_MP4 | ||||
|   RB_CHUNKED_MP4 | ||||
| input OrFilter { | ||||
|   filters: [FilterInput!]! | ||||
| } | ||||
|  | ||||
| type HLSPlaylistGQL { | ||||
|   videoId: Int! | ||||
|   m3u8Text: String! | ||||
|   segmentDurations: [Float!]! | ||||
| input CueObjectDistanceInput { | ||||
|   value: RangeFilter! | ||||
| } | ||||
|  | ||||
| type VideoTag { | ||||
|   tagClasses: [VideoTagClass!]! | ||||
|   name: String! | ||||
| input RangeFilter { | ||||
|   lessThan: Float = null | ||||
|   greaterThanEqualTo: Float = null | ||||
| } | ||||
|  | ||||
| type VideoTagClass { | ||||
|   name: String! | ||||
| input TargetPocketDistanceInput { | ||||
|   value: RangeFilter! | ||||
| } | ||||
|  | ||||
| type HomographyInfoGQL { | ||||
|   frameIndex: Int! | ||||
|   crop: BoundingBoxGQL! | ||||
|   pockets: [BoundingBoxGQL!]! | ||||
|   sourcePoints: PocketPointsGQL! | ||||
|   destPoints: PocketPointsGQL! | ||||
| input CueObjectAngleInput { | ||||
|   value: RangeFilter! | ||||
| } | ||||
|  | ||||
| type BoundingBoxGQL { | ||||
|   left: Float! | ||||
|   top: Float! | ||||
|   width: Float! | ||||
|   height: Float! | ||||
| input CueBallSpeedInput { | ||||
|   value: RangeFilter! | ||||
| } | ||||
|  | ||||
| type PocketPointsGQL { | ||||
|   topLeft: IntPoint2D! | ||||
|   topSide: IntPoint2D! | ||||
|   topRight: IntPoint2D! | ||||
|   bottomLeft: IntPoint2D! | ||||
|   bottomSide: IntPoint2D! | ||||
|   bottomRight: IntPoint2D! | ||||
| input IntendedPocketTypeInput { | ||||
|   value: EnumFilter! | ||||
| } | ||||
|  | ||||
| type IntPoint2D { | ||||
|   x: Int! | ||||
|   y: Int! | ||||
| input EnumFilter { | ||||
|   equals: String = null | ||||
| } | ||||
|  | ||||
| type VideoProcessingGQL { | ||||
|   errors: [VideoProcessingErrorGQL!]! | ||||
|   status: ProcessingStatusEnum! | ||||
|   statuses: [VideoProcessingStatusGQL!]! | ||||
| input ShotDirectionInput { | ||||
|   value: EnumFilter! | ||||
| } | ||||
|  | ||||
| type VideoProcessingErrorGQL { | ||||
|   message: String! | ||||
|   startSegmentIndex: Int | ||||
|   endSegmentIndex: Int | ||||
| type BucketSetGQL { | ||||
|   keyName: String! | ||||
|   feature: String! | ||||
|   buckets: [BucketGQL!]! | ||||
| } | ||||
|  | ||||
| enum ProcessingStatusEnum { | ||||
|   STARTED | ||||
|   FAILED | ||||
|   SUCCEEDED | ||||
|   SUSPENDED | ||||
|   CREATED | ||||
|   QUEUED | ||||
|   RUNNING | ||||
|   REEXTRACTING_FEATURES | ||||
| } | ||||
|  | ||||
| type VideoProcessingStatusGQL { | ||||
|   status: ProcessingStatusEnum! | ||||
|   appVersion: String! | ||||
|   sequenceId: Int! | ||||
|   createdAt: DateTime | ||||
|   updatedAt: DateTime | ||||
| } | ||||
|  | ||||
| input GetShotsOrdering { | ||||
|   orderings: [ShotsOrderingComponent!]! | ||||
| } | ||||
|  | ||||
| input ShotsOrderingComponent @oneOf { | ||||
|   videoCreation: DatetimeShotOrdering | ||||
|   marginOfError: FloatShotOrdering | ||||
|   videoId: IntShotOrdering | ||||
|   startFrame: IntShotOrdering | ||||
|   runLength: IntShotOrdering | ||||
| } | ||||
|  | ||||
| input DatetimeShotOrdering { | ||||
|   descending: Boolean! = true | ||||
|   startingAt: DateTime = null | ||||
| } | ||||
|  | ||||
| input FloatShotOrdering { | ||||
|   descending: Boolean! = true | ||||
|   startingAt: Float = null | ||||
| } | ||||
|  | ||||
| input IntShotOrdering { | ||||
|   descending: Boolean! = true | ||||
|   startingAt: Int = null | ||||
| } | ||||
|  | ||||
| input GetShotsPagination { | ||||
|   createdAfter: CreatedAfter! | ||||
|   startFrameAfter: Int! | ||||
| } | ||||
|  | ||||
| input CreatedAfter @oneOf { | ||||
|   videoId: Int | ||||
|   createdAt: DateTime | ||||
| } | ||||
|  | ||||
| type UserRelationshipsResult { | ||||
|   inquiringUser: UserGQL! | ||||
|   relationships: [UserRelationship!]! | ||||
| } | ||||
|  | ||||
| type UserRelationship { | ||||
|   toUser: UserGQL! | ||||
|   toUserFollows: Boolean! | ||||
|   toUserIsFollowedBy: Boolean! | ||||
| } | ||||
|  | ||||
| type UserPlayTimeGQL { | ||||
|   totalSeconds: Float! | ||||
| } | ||||
|  | ||||
| type VideoHistoryGQL { | ||||
|   videos: [VideoGQL!]! | ||||
|   pageInfo: PageInfoGQL! | ||||
| } | ||||
|  | ||||
| type PageInfoGQL { | ||||
|   hasNextPage: Boolean! | ||||
|   endCursor: String | ||||
| } | ||||
|  | ||||
| input VideoFilterInput { | ||||
|   isStreamCompleted: Boolean = null | ||||
|   requireCursorCompletion: Boolean! = true | ||||
| } | ||||
|  | ||||
| type TagGQL { | ||||
|   name: String! | ||||
|   id: Int! | ||||
|   group: String | ||||
| } | ||||
|  | ||||
| """ | ||||
| The `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf). | ||||
| """ | ||||
| scalar JSON | ||||
|   @specifiedBy( | ||||
|     url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf" | ||||
|   ) | ||||
|  | ||||
| type Mutation { | ||||
|   createBucketSet(params: CreateBucketSetInput!): BucketSetGQL! | ||||
|   setLoggerLevel(path: String!, level: String!): Boolean! | ||||
|   addAnnotationToShot( | ||||
|     shotId: Int! | ||||
|     annotationName: String! | ||||
|     notes: String = null | ||||
|   ): AddShotAnnotationReturn! | ||||
|   updateShotAnnotations( | ||||
|     shotId: Int! | ||||
|     annotations: [UpdateAnnotationInputGQL!]! | ||||
|   ): UpdateShotAnnotationReturn! | ||||
|   getProfileImageUploadLink( | ||||
|     fileExt: String = ".png" | ||||
|   ): GetProfileUploadLinkReturn! | ||||
|   editProfileImageUri(profileImageUri: String!): UserGQL! | ||||
|   editUser(input: EditUserInputGQL!): UserGQL! | ||||
|   followUser(followedUserId: Int!): UserGQL! | ||||
|   unfollowUser(followedUserId: Int!): UserGQL! | ||||
|   createUploadStream( | ||||
|     videoMetadata: VideoMetadataInput! | ||||
|   ): CreateUploadStreamReturn! | ||||
|   getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn! | ||||
|   getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn! | ||||
|   setSegmentDuration( | ||||
|     videoId: Int! | ||||
|     segmentIndex: Int! | ||||
|     duration: Float! | ||||
|   ): Boolean! | ||||
|   editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean! | ||||
|   deleteVideo(videoId: Int!): Boolean! | ||||
|   processVideoSource(input: ProcessVideoSourceInput!): ProcessVideoSourceReturn! | ||||
|   createUploadStream(uploadMetadata: UploadMetadataInput, videoName: String = null): CreateUploadStreamReturn! | ||||
|   getUploadLink(videoId: Int!, chunkIndex: Int!): GetUploadLinkReturn! | ||||
|   terminateUploadStream(videoId: Int!): Boolean! | ||||
| } | ||||
|  | ||||
| input CreateBucketSetInput { | ||||
| @@ -637,139 +236,32 @@ input CreateBucketSetInput { | ||||
|   buckets: [BucketInputGQL!]! | ||||
| } | ||||
|  | ||||
| type AddShotAnnotationReturn { | ||||
|   value: SuccessfulAddAddShotAnnotationErrors! | ||||
| type ProcessVideoSourceReturn { | ||||
|   val: Int! | ||||
| } | ||||
|  | ||||
| union SuccessfulAddAddShotAnnotationErrors = | ||||
|     SuccessfulAdd | ||||
|   | AddShotAnnotationErrors | ||||
|  | ||||
| type SuccessfulAdd { | ||||
|   value: Boolean! | ||||
| } | ||||
|  | ||||
| type AddShotAnnotationErrors { | ||||
|   error: DoesNotOwnShotErrOtherErrorNeedsNote! | ||||
| } | ||||
|  | ||||
| union DoesNotOwnShotErrOtherErrorNeedsNote = | ||||
|     DoesNotOwnShotErr | ||||
|   | OtherErrorNeedsNote | ||||
|  | ||||
| type DoesNotOwnShotErr { | ||||
|   shotId: Int! | ||||
|   msg: String | ||||
| } | ||||
|  | ||||
| type OtherErrorNeedsNote { | ||||
|   msg: String | ||||
| } | ||||
|  | ||||
| type UpdateShotAnnotationReturn { | ||||
|   shot: ShotGQL | ||||
|   error: DoesNotOwnShotErr | ||||
| } | ||||
|  | ||||
| input UpdateAnnotationInputGQL { | ||||
|   name: String! | ||||
|   notes: String = null | ||||
| } | ||||
|  | ||||
| type GetProfileUploadLinkReturn { | ||||
|   value: UploadLinkGetProfileUploadLinkErrors! | ||||
| } | ||||
|  | ||||
| union UploadLinkGetProfileUploadLinkErrors = | ||||
|     UploadLink | ||||
|   | GetProfileUploadLinkErrors | ||||
|  | ||||
| type UploadLink { | ||||
|   uploadUrl: String! | ||||
|   headers: [Header]! | ||||
| } | ||||
|  | ||||
| type Header { | ||||
|   key: String! | ||||
|   value: String! | ||||
| } | ||||
|  | ||||
| type GetProfileUploadLinkErrors { | ||||
|   error: TooManyProfileImageUploadsErr! | ||||
| } | ||||
|  | ||||
| type TooManyProfileImageUploadsErr { | ||||
|   linksRequested: Int! | ||||
| } | ||||
|  | ||||
| input EditUserInputGQL { | ||||
|   username: String = null | ||||
|   fargoRating: Int = null | ||||
| input ProcessVideoSourceInput { | ||||
|   val: Int! | ||||
| } | ||||
|  | ||||
| type CreateUploadStreamReturn { | ||||
|   videoId: Int! | ||||
| } | ||||
|  | ||||
| input VideoMetadataInput { | ||||
|   videoName: String = null | ||||
|   startTime: DateTime = null | ||||
|   endTime: DateTime = null | ||||
|   gameType: String = null | ||||
|   tableSize: Float = null | ||||
|   lastIntendedSegmentBound: Int = null | ||||
|   streamSegmentType: StreamSegmentTypeEnum = null | ||||
|   endStream: Boolean! = false | ||||
|   resolution: VideoResolution = null | ||||
|   framesPerSecond: Float = null | ||||
| } | ||||
|  | ||||
| input VideoResolution { | ||||
|   width: Int! | ||||
|   height: Int! | ||||
| input UploadMetadataInput { | ||||
|   deviceType: DeviceTypeEnum = null | ||||
|   osVersion: String = null | ||||
|   appVersion: String = null | ||||
|   browserName: String = null | ||||
|   browserVersion: String = null | ||||
|   locale: String = null | ||||
|   timezone: String = null | ||||
|   networkType: String = null | ||||
|   ipAddress: String = null | ||||
| } | ||||
|  | ||||
| type GetUploadLinkReturn { | ||||
|   value: UploadLinkGetUploadLinkErrors! | ||||
|   stream: UploadStreamGQL | ||||
| } | ||||
|  | ||||
| union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors | ||||
|  | ||||
| type GetUploadLinkErrors { | ||||
|   error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr! | ||||
| } | ||||
|  | ||||
| union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr = | ||||
|     MustHaveSetForUploadLinkErr | ||||
|   | SegmentAlreadyUploadedErr | ||||
|   | ProcessingFailedErr | ||||
|   | NoInitForChunkedUploadErr | ||||
|   | TooManyProfileImageUploadsErr | ||||
|   | InitUploadAlreadyCompletedErr | ||||
|   | TooManyInitUploadsErr | ||||
|  | ||||
| type MustHaveSetForUploadLinkErr { | ||||
|   resolution: Boolean | ||||
|   framesPerSecond: Boolean | ||||
| } | ||||
|  | ||||
| type SegmentAlreadyUploadedErr { | ||||
|   segmentId: Int! | ||||
| } | ||||
|  | ||||
| type ProcessingFailedErr { | ||||
|   processing: VideoProcessingGQL! | ||||
| } | ||||
|  | ||||
| type NoInitForChunkedUploadErr { | ||||
|   segmentType: StreamSegmentTypeEnum! | ||||
| } | ||||
|  | ||||
| type InitUploadAlreadyCompletedErr { | ||||
|   segmentType: StreamSegmentTypeEnum! | ||||
| } | ||||
|  | ||||
| type TooManyInitUploadsErr { | ||||
|   uploadUrl: String! | ||||
|   linksRequested: Int! | ||||
|   uploadsCompleted: Int! | ||||
| } | ||||
|   | ||||
| @@ -1,18 +0,0 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "target": "es2018", | ||||
|     "module": "commonjs", | ||||
|     "outDir": "dist", | ||||
|     "rootDir": "src", | ||||
|     "strict": true, | ||||
|     "esModuleInterop": true, | ||||
|     "skipLibCheck": true, | ||||
|     "forceConsistentCasingInFileNames": true, | ||||
|     "moduleResolution": "node", | ||||
|     "resolveJsonModule": true, | ||||
|     "declaration": true, | ||||
|     "sourceMap": true | ||||
|   }, | ||||
|   "include": ["src/**/*.ts", "src/**/*.tsx"], | ||||
|   "exclude": ["node_modules", "dist"] | ||||
| } | ||||
							
								
								
									
										161
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										161
									
								
								yarn.lock
									
									
									
									
									
								
							| @@ -10,26 +10,6 @@ | ||||
|     "@jridgewell/gen-mapping" "^0.3.0" | ||||
|     "@jridgewell/trace-mapping" "^0.3.9" | ||||
|  | ||||
| "@apollo/client@^3.9.2": | ||||
|   version "3.9.2" | ||||
|   resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.9.2.tgz#96edf2c212f828bad1ef3d84234fa473c5a27ff8" | ||||
|   integrity sha512-Zw9WvXjqhpbgkvAvnj52vstOWwM0iedKWtn1hSq1cODQyoe1CF2uFwMYFI7l56BrAY9CzLi6MQA0AhxpgJgvxw== | ||||
|   dependencies: | ||||
|     "@graphql-typed-document-node/core" "^3.1.1" | ||||
|     "@wry/caches" "^1.0.0" | ||||
|     "@wry/equality" "^0.5.6" | ||||
|     "@wry/trie" "^0.5.0" | ||||
|     graphql-tag "^2.12.6" | ||||
|     hoist-non-react-statics "^3.3.2" | ||||
|     optimism "^0.18.0" | ||||
|     prop-types "^15.7.2" | ||||
|     rehackt "0.0.3" | ||||
|     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" | ||||
|  | ||||
| "@ardatan/relay-compiler@12.0.0": | ||||
|   version "12.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" | ||||
| @@ -1144,41 +1124,6 @@ | ||||
|     fast-querystring "^1.1.1" | ||||
|     tslib "^2.3.1" | ||||
|  | ||||
| "@wry/caches@^1.0.0": | ||||
|   version "1.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/@wry/caches/-/caches-1.0.1.tgz#8641fd3b6e09230b86ce8b93558d44cf1ece7e52" | ||||
|   integrity sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA== | ||||
|   dependencies: | ||||
|     tslib "^2.3.0" | ||||
|  | ||||
| "@wry/context@^0.7.0": | ||||
|   version "0.7.4" | ||||
|   resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.4.tgz#e32d750fa075955c4ab2cfb8c48095e1d42d5990" | ||||
|   integrity sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ== | ||||
|   dependencies: | ||||
|     tslib "^2.3.0" | ||||
|  | ||||
| "@wry/equality@^0.5.6": | ||||
|   version "0.5.7" | ||||
|   resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.7.tgz#72ec1a73760943d439d56b7b1e9985aec5d497bb" | ||||
|   integrity sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw== | ||||
|   dependencies: | ||||
|     tslib "^2.3.0" | ||||
|  | ||||
| "@wry/trie@^0.4.3": | ||||
|   version "0.4.3" | ||||
|   resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" | ||||
|   integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== | ||||
|   dependencies: | ||||
|     tslib "^2.3.0" | ||||
|  | ||||
| "@wry/trie@^0.5.0": | ||||
|   version "0.5.0" | ||||
|   resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.5.0.tgz#11e783f3a53f6e4cd1d42d2d1323f5bc3fa99c94" | ||||
|   integrity sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA== | ||||
|   dependencies: | ||||
|     tslib "^2.3.0" | ||||
|  | ||||
| agent-base@^7.0.2, agent-base@^7.1.0: | ||||
|   version "7.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" | ||||
| @@ -1553,11 +1498,6 @@ colorette@^2.0.16: | ||||
|   resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" | ||||
|   integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== | ||||
|  | ||||
| commander@4.0.1: | ||||
|   version "4.0.1" | ||||
|   resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c" | ||||
|   integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA== | ||||
|  | ||||
| common-tags@1.8.2: | ||||
|   version "1.8.2" | ||||
|   resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" | ||||
| @@ -1902,7 +1842,7 @@ graphql-request@^6.0.0: | ||||
|     "@graphql-typed-document-node/core" "^3.2.0" | ||||
|     cross-fetch "^3.1.5" | ||||
|  | ||||
| graphql-tag@^2.11.0, graphql-tag@^2.12.6: | ||||
| graphql-tag@^2.11.0: | ||||
|   version "2.12.6" | ||||
|   resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" | ||||
|   integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== | ||||
| @@ -1961,13 +1901,6 @@ header-case@^2.0.4: | ||||
|     capital-case "^1.0.4" | ||||
|     tslib "^2.0.3" | ||||
|  | ||||
| hoist-non-react-statics@^3.3.2: | ||||
|   version "3.3.2" | ||||
|   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" | ||||
|   integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== | ||||
|   dependencies: | ||||
|     react-is "^16.7.0" | ||||
|  | ||||
| http-proxy-agent@^7.0.0: | ||||
|   version "7.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" | ||||
| @@ -2262,7 +2195,7 @@ log-update@^4.0.0: | ||||
|     slice-ansi "^4.0.0" | ||||
|     wrap-ansi "^6.2.0" | ||||
|  | ||||
| loose-envify@^1.0.0, loose-envify@^1.4.0: | ||||
| loose-envify@^1.0.0: | ||||
|   version "1.4.0" | ||||
|   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" | ||||
|   integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== | ||||
| @@ -2379,7 +2312,7 @@ nullthrows@^1.1.1: | ||||
|   resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" | ||||
|   integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== | ||||
|  | ||||
| object-assign@^4.1.0, object-assign@^4.1.1: | ||||
| object-assign@^4.1.0: | ||||
|   version "4.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" | ||||
|   integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== | ||||
| @@ -2403,16 +2336,6 @@ onetime@^5.1.0: | ||||
|   dependencies: | ||||
|     mimic-fn "^2.1.0" | ||||
|  | ||||
| optimism@^0.18.0: | ||||
|   version "0.18.0" | ||||
|   resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.18.0.tgz#e7bb38b24715f3fdad8a9a7fc18e999144bbfa63" | ||||
|   integrity sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ== | ||||
|   dependencies: | ||||
|     "@wry/caches" "^1.0.0" | ||||
|     "@wry/context" "^0.7.0" | ||||
|     "@wry/trie" "^0.4.3" | ||||
|     tslib "^2.3.0" | ||||
|  | ||||
| ora@^5.4.1: | ||||
|   version "5.4.1" | ||||
|   resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" | ||||
| @@ -2543,14 +2466,6 @@ path-type@^4.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" | ||||
|   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== | ||||
|  | ||||
| pbjs@^0.0.14: | ||||
|   version "0.0.14" | ||||
|   resolved "https://registry.yarnpkg.com/pbjs/-/pbjs-0.0.14.tgz#5ab3d4a5f06a9ab78dd320c63f72877120d4c48d" | ||||
|   integrity sha512-F4aA0ojrQ37kxFPOg4yRLP/vxb76rYQwMQigmVEljYlA7hZKmjaWjP6IkRn4nA0NdIj4Xxe4iqWrrIhJy+MwWQ== | ||||
|   dependencies: | ||||
|     commander "4.0.1" | ||||
|     protocol-buffers-schema "3.1.0" | ||||
|  | ||||
| picocolors@^1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" | ||||
| @@ -2561,16 +2476,6 @@ picomatch@^2.3.1: | ||||
|   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" | ||||
|   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== | ||||
|  | ||||
| prettier-plugin-organize-imports@^3.2.4: | ||||
|   version "3.2.4" | ||||
|   resolved "https://registry.yarnpkg.com/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.4.tgz#77967f69d335e9c8e6e5d224074609309c62845e" | ||||
|   integrity sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog== | ||||
|  | ||||
| prettier@^3.2.5: | ||||
|   version "3.2.5" | ||||
|   resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" | ||||
|   integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== | ||||
|  | ||||
| promise@^7.1.1: | ||||
|   version "7.3.1" | ||||
|   resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" | ||||
| @@ -2578,20 +2483,6 @@ promise@^7.1.1: | ||||
|   dependencies: | ||||
|     asap "~2.0.3" | ||||
|  | ||||
| prop-types@^15.7.2: | ||||
|   version "15.8.1" | ||||
|   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" | ||||
|   integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== | ||||
|   dependencies: | ||||
|     loose-envify "^1.4.0" | ||||
|     object-assign "^4.1.1" | ||||
|     react-is "^16.13.1" | ||||
|  | ||||
| protocol-buffers-schema@3.1.0: | ||||
|   version "3.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.1.0.tgz#d8a819549ead3e6bd189ebe9e50e96636bbc5cc7" | ||||
|   integrity sha512-1g9zFjLFhGN1Dc5UVO8D2loVslp6sVxk5sJqgD66CuWUITh2gOaTLRN/pIakGFfB6e0nNF6hImrYFDurEsA1UQ== | ||||
|  | ||||
| punycode@^1.3.2: | ||||
|   version "1.4.1" | ||||
|   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" | ||||
| @@ -2614,11 +2505,6 @@ queue-microtask@^1.2.2: | ||||
|   resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" | ||||
|   integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== | ||||
|  | ||||
| react-is@^16.13.1, react-is@^16.7.0: | ||||
|   version "16.13.1" | ||||
|   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" | ||||
|   integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== | ||||
|  | ||||
| readable-stream@^3.4.0: | ||||
|   version "3.6.2" | ||||
|   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" | ||||
| @@ -2633,11 +2519,6 @@ regenerator-runtime@^0.14.0: | ||||
|   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" | ||||
|   integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== | ||||
|  | ||||
| rehackt@0.0.3: | ||||
|   version "0.0.3" | ||||
|   resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.0.3.tgz#1ea454620d4641db8342e2db44595cf0e7ac6aa0" | ||||
|   integrity sha512-aBRHudKhOWwsTvCbSoinzq+Lej/7R8e8UoPvLZo5HirZIIBLGAgdG7SL9QpdcBoQ7+3QYPi3lRLknAzXBlhZ7g== | ||||
|  | ||||
| relay-runtime@12.0.0: | ||||
|   version "12.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" | ||||
| @@ -2682,11 +2563,6 @@ resolve-from@^4.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" | ||||
|   integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== | ||||
|  | ||||
| response-iterator@^0.2.6: | ||||
|   version "0.2.6" | ||||
|   resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" | ||||
|   integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== | ||||
|  | ||||
| restore-cursor@^3.1.0: | ||||
|   version "3.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" | ||||
| @@ -2881,11 +2757,6 @@ swap-case@^2.0.2: | ||||
|   dependencies: | ||||
|     tslib "^2.0.3" | ||||
|  | ||||
| symbol-observable@^4.0.0: | ||||
|   version "4.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" | ||||
|   integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== | ||||
|  | ||||
| through@^2.3.6, through@^2.3.8: | ||||
|   version "2.3.8" | ||||
|   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" | ||||
| @@ -2922,19 +2793,12 @@ tr46@~0.0.3: | ||||
|   resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" | ||||
|   integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== | ||||
|  | ||||
| ts-invariant@^0.10.3: | ||||
|   version "0.10.3" | ||||
|   resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" | ||||
|   integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== | ||||
|   dependencies: | ||||
|     tslib "^2.1.0" | ||||
|  | ||||
| ts-log@^2.2.3: | ||||
|   version "2.2.5" | ||||
|   resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.5.tgz#aef3252f1143d11047e2cb6f7cfaac7408d96623" | ||||
|   integrity sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA== | ||||
|  | ||||
| tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2, tslib@~2.6.0: | ||||
| tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2, tslib@~2.6.0: | ||||
|   version "2.6.2" | ||||
|   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" | ||||
|   integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== | ||||
| @@ -2954,11 +2818,6 @@ type-fest@^0.21.3: | ||||
|   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" | ||||
|   integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== | ||||
|  | ||||
| typescript@^4.x: | ||||
|   version "4.9.5" | ||||
|   resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" | ||||
|   integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== | ||||
|  | ||||
| ua-parser-js@^1.0.35: | ||||
|   version "1.0.37" | ||||
|   resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" | ||||
| @@ -3164,15 +3023,3 @@ yocto-queue@^0.1.0: | ||||
|   version "0.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" | ||||
|   integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== | ||||
|  | ||||
| zen-observable-ts@^1.2.5: | ||||
|   version "1.2.5" | ||||
|   resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" | ||||
|   integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== | ||||
|   dependencies: | ||||
|     zen-observable "0.8.15" | ||||
|  | ||||
| zen-observable@0.8.15: | ||||
|   version "0.8.15" | ||||
|   resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" | ||||
|   integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== | ||||
|   | ||||
		Reference in New Issue
	
	Block a user