From de91191259311e85ddb881f0ddbc4eeb0b29f519 Mon Sep 17 00:00:00 2001 From: Catherine Noll Date: Fri, 20 Jan 2023 07:05:57 -0500 Subject: [PATCH 001/195] [Low Code CDK] Pass DeclarativeStream's `name` into DefaultSchemaLoader (#21516) Also handles the case where `DeclarativeStream.options` is `None`. --- .../parsers/model_to_component_factory.py | 2 +- .../schema/default_schema_loader.py | 6 +++- .../test_model_to_component_factory.py | 34 +++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py index b8a307ce799c0..3210c4f5a35c0 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py @@ -359,7 +359,7 @@ def create_declarative_stream(model: DeclarativeStreamModel, config: Config, **k if model.schema_loader: schema_loader = _create_component_from_model(model=model.schema_loader, config=config) else: - schema_loader = DefaultSchemaLoader(config=config, options=model.options) + schema_loader = DefaultSchemaLoader(config=config, name=model.name, options=model.options) transformations = [] if model.transformations: diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/schema/default_schema_loader.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/schema/default_schema_loader.py index 9344ffeed684b..a394f7516cdd7 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/schema/default_schema_loader.py @@ -23,9 +23,13 @@ class DefaultSchemaLoader(SchemaLoader, JsonSchemaMixin): """ config: Config + name: InitVar[str] options: InitVar[Mapping[str, Any]] - def __post_init__(self, options: Mapping[str, Any]): + def __post_init__(self, name: str, options: Mapping[str, Any]): + options = options or {} + if "name" not in options: + options["name"] = name self._options = options self.default_loader = JsonFileSchemaLoader(options=options, config=self.config) diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py b/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py index ab01d46692b38..5720ce7c769b6 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py @@ -1011,3 +1011,37 @@ def test_add_fields(self): ) ] assert stream.transformations == expected + + def test_default_schema_loader(self): + component_definition = { + "type": "DeclarativeStream", + "name": "test", + "primary_key": [], + "retriever": { + "type": "SimpleRetriever", + "name": "test", + "primary_key": [], + "requester": { + "type": "HttpRequester", + "name": "test", + "url_base": "http://localhost:6767/", + "path": "items/", + "request_options_provider": { + "request_parameters": {}, + "request_headers": {}, + "request_body_json": {}, + "type": "InterpolatedRequestOptionsProvider", + }, + "authenticator": {"type": "BearerAuthenticator", "api_token": "{{ config['api_key'] }}"}, + }, + "record_selector": {"type": "RecordSelector", "extractor": {"type": "DpathExtractor", "field_pointer": ["items"]}}, + "paginator": {"type": "NoPagination"}, + }, + } + resolved_manifest = resolver.preprocess_manifest(component_definition) + propagated_source_config = ManifestComponentTransformer().propagate_types_and_options("", resolved_manifest, {}) + stream = factory.create_component( + model_type=DeclarativeStreamModel, component_definition=propagated_source_config, config=input_config + ) + schema_loader = stream.schema_loader + assert schema_loader.default_loader._get_json_filepath() == f"./{stream.name}.json" From df1c20acb61758c4d114b650a2523274a8f52c4c Mon Sep 17 00:00:00 2001 From: Catherine Noll Date: Fri, 20 Jan 2023 08:43:59 -0500 Subject: [PATCH 002/195] Revert "[Low Code CDK] Pass DeclarativeStream's `name` into DefaultSchemaLoader (#21516)" (#21649) This reverts commit de91191259311e85ddb881f0ddbc4eeb0b29f519. --- .../parsers/model_to_component_factory.py | 2 +- .../schema/default_schema_loader.py | 6 +--- .../test_model_to_component_factory.py | 34 ------------------- 3 files changed, 2 insertions(+), 40 deletions(-) diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py index 3210c4f5a35c0..b8a307ce799c0 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py @@ -359,7 +359,7 @@ def create_declarative_stream(model: DeclarativeStreamModel, config: Config, **k if model.schema_loader: schema_loader = _create_component_from_model(model=model.schema_loader, config=config) else: - schema_loader = DefaultSchemaLoader(config=config, name=model.name, options=model.options) + schema_loader = DefaultSchemaLoader(config=config, options=model.options) transformations = [] if model.transformations: diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/schema/default_schema_loader.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/schema/default_schema_loader.py index a394f7516cdd7..9344ffeed684b 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/schema/default_schema_loader.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/schema/default_schema_loader.py @@ -23,13 +23,9 @@ class DefaultSchemaLoader(SchemaLoader, JsonSchemaMixin): """ config: Config - name: InitVar[str] options: InitVar[Mapping[str, Any]] - def __post_init__(self, name: str, options: Mapping[str, Any]): - options = options or {} - if "name" not in options: - options["name"] = name + def __post_init__(self, options: Mapping[str, Any]): self._options = options self.default_loader = JsonFileSchemaLoader(options=options, config=self.config) diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py b/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py index 5720ce7c769b6..ab01d46692b38 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py @@ -1011,37 +1011,3 @@ def test_add_fields(self): ) ] assert stream.transformations == expected - - def test_default_schema_loader(self): - component_definition = { - "type": "DeclarativeStream", - "name": "test", - "primary_key": [], - "retriever": { - "type": "SimpleRetriever", - "name": "test", - "primary_key": [], - "requester": { - "type": "HttpRequester", - "name": "test", - "url_base": "http://localhost:6767/", - "path": "items/", - "request_options_provider": { - "request_parameters": {}, - "request_headers": {}, - "request_body_json": {}, - "type": "InterpolatedRequestOptionsProvider", - }, - "authenticator": {"type": "BearerAuthenticator", "api_token": "{{ config['api_key'] }}"}, - }, - "record_selector": {"type": "RecordSelector", "extractor": {"type": "DpathExtractor", "field_pointer": ["items"]}}, - "paginator": {"type": "NoPagination"}, - }, - } - resolved_manifest = resolver.preprocess_manifest(component_definition) - propagated_source_config = ManifestComponentTransformer().propagate_types_and_options("", resolved_manifest, {}) - stream = factory.create_component( - model_type=DeclarativeStreamModel, component_definition=propagated_source_config, config=input_config - ) - schema_loader = stream.schema_loader - assert schema_loader.default_loader._get_json_filepath() == f"./{stream.name}.json" From 5aaf0cb6706920082d7b9cb10cd6ec4a4366c19f Mon Sep 17 00:00:00 2001 From: darynaishchenko <80129833+darynaishchenko@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:34:49 +0200 Subject: [PATCH 003/195] changed abnormal_state (#21644) --- .../integration_tests/abnormal_state.json | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/airbyte-integrations/connectors/source-surveymonkey/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-surveymonkey/integration_tests/abnormal_state.json index 6f48fdeb56b94..93204c4f0c708 100644 --- a/airbyte-integrations/connectors/source-surveymonkey/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-surveymonkey/integration_tests/abnormal_state.json @@ -2,7 +2,7 @@ { "type": "STREAM", "stream": { - "stream_state": { "date_modified": "2022-06-10T11:02:01" }, + "stream_state": { "date_modified": "2050-06-10T11:02:01" }, "stream_descriptor": { "name": "surveys" } } }, @@ -10,19 +10,19 @@ "type": "STREAM", "stream": { "stream_state": { - "306079584": { "date_modified": "2022-06-08T18:17:18+00:00" }, - "307785429": { "date_modified": "2022-06-10T10:59:43+00:00" }, - "307785444": { "date_modified": "2022-06-10T11:00:19+00:00" }, - "307785394": { "date_modified": "2022-06-10T11:00:59+00:00" }, - "307785402": { "date_modified": "2022-06-10T11:01:31+00:00" }, - "307785408": { "date_modified": "2022-06-10T11:02:08+00:00" }, - "307785448": { "date_modified": "2022-06-10T11:02:49+00:00" }, - "307784834": { "date_modified": "2022-06-10T11:03:45+00:00" }, - "307784863": { "date_modified": "2022-06-10T11:04:29+00:00" }, - "307784846": { "date_modified": "2022-06-10T11:05:05+00:00" }, - "307784856": { "date_modified": "2022-06-10T11:05:44+00:00" }, - "307785388": { "date_modified": "2022-06-10T11:06:20+00:00" }, - "307785415": { "date_modified": "2022-06-10T11:06:43+00:00" } + "306079584": { "date_modified": "2050-06-08T18:17:18+00:00" }, + "307785429": { "date_modified": "2050-06-10T10:59:43+00:00" }, + "307785444": { "date_modified": "2050-06-10T11:00:19+00:00" }, + "307785394": { "date_modified": "2050-06-10T11:00:59+00:00" }, + "307785402": { "date_modified": "2050-06-10T11:01:31+00:00" }, + "307785408": { "date_modified": "2050-06-10T11:02:08+00:00" }, + "307785448": { "date_modified": "2050-06-10T11:02:49+00:00" }, + "307784834": { "date_modified": "2050-06-10T11:03:45+00:00" }, + "307784863": { "date_modified": "2050-06-10T11:04:29+00:00" }, + "307784846": { "date_modified": "2050-06-10T11:05:05+00:00" }, + "307784856": { "date_modified": "2050-06-10T11:05:44+00:00" }, + "307785388": { "date_modified": "2050-06-10T11:06:20+00:00" }, + "307785415": { "date_modified": "2050-06-10T11:06:43+00:00" } }, "stream_descriptor": { "name": "survey_responses" } } From 360e630b79ecaf099410a1ac3467621531cfe79c Mon Sep 17 00:00:00 2001 From: darynaishchenko <80129833+darynaishchenko@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:35:08 +0200 Subject: [PATCH 004/195] fixed expected records for stream forms (#21641) --- .../integration_tests/expected_records.jsonl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/airbyte-integrations/connectors/source-typeform/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-typeform/integration_tests/expected_records.jsonl index 771ff67b76f0d..68c6f5e1d7942 100644 --- a/airbyte-integrations/connectors/source-typeform/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-typeform/integration_tests/expected_records.jsonl @@ -1,7 +1,7 @@ -{"stream":"forms","data":{"id":"VWO7mLtl","type":"quiz","title":"Connector Extensibility meetup","workspace":{"href":"https://api.typeform.com/workspaces/sDaAqs"},"theme":{"href":"https://api.typeform.com/themes/qHWOQ7"},"settings":{"language":"en","progress_bar":"proportion","meta":{"allow_indexing":false},"hide_navigation":false,"is_public":true,"is_trial":false,"show_progress_bar":true,"show_typeform_branding":true,"are_uploads_public":false,"show_time_to_complete":true,"show_number_of_submissions":false,"show_cookie_consent":false,"show_question_number":true,"pro_subdomain_enabled":false,"capabilities":{"e2e_encryption":{"enabled":false,"modifiable":false}}},"thankyou_screens":[{"id":"qvDqCNAHuIC8","ref":"01GHC6KQ5Y0M8VN6XHVAG75J0G","title":"","type":"thankyou_screen","properties":{"show_button":true,"share_icons":true,"button_mode":"default_redirect","button_text":"Create a typeform"}},{"id":"DefaultTyScreen","ref":"default_tys","title":"Thanks for completing this typeform\nNow *create your own* — it's free, easy, & beautiful","type":"thankyou_screen","properties":{"show_button":true,"share_icons":false,"button_mode":"default_redirect","button_text":"Create a *typeform*"},"attachment":{"type":"image","href":"https://images.typeform.com/images/2dpnUBBkz2VN"}}],"fields":[{"id":"ZdzF0rrvsVdB","title":"What times work for you to visit San Francisco to work with the team?","ref":"01GHC6KQ5Y6S9ZQH5CHKZPT1RM","properties":{"randomize":false,"allow_multiple_selection":true,"allow_other_choice":true,"vertical_alignment":true,"choices":[{"id":"nLpt4rvNjFB3","ref":"01GHC6KQ5Y155J0F550BGYYS1A","label":"Dec 12-16"},{"id":"4xpK9sqA06eL","ref":"01GHC6KQ5YBATX0CFENVVB5BYG","label":"Dec 19-23"},{"id":"jQHb3mqslOsZ","ref":"1c392fa3-e693-49fe-b334-3a5cddc1db6f","label":"Jan 9-14"},{"id":"wS5FKMUnMgqR","ref":"2ac396a3-1b8e-4e56-b36d-d1f27c1b834d","label":"Jan 16-20"},{"id":"uvmLX80Loava","ref":"8fffd3a8-1e96-421d-a605-a7029bd55e97","label":"Jan 22-26"},{"id":"7ubtgCrW2meb","ref":"17403cc9-74cd-49d1-856a-be6662b3b497","label":"Jan30 - Feb3"},{"id":"51q0g4fTFtYc","ref":"3a1295b4-97b9-4986-9c37-f1af1d72501d","label":"Feb 6 - 11"},{"id":"vi3iwtpETqlb","ref":"54edf52a-c9c7-4bc4-a5a6-bd86115f5adb","label":"Feb 13-17"},{"id":"iI0hDpta14Kk","ref":"e149c19f-8b61-4ff0-a17a-e9e65c3a8fee","label":"Feb 19-24"}]},"validations":{"required":false},"type":"multiple_choice","attachment":{"type":"image","href":"https://images.typeform.com/images/WMALzu59xbXQ"},"layout":{"type":"split","attachment":{"type":"image","href":"https://images.typeform.com/images/WMALzu59xbXQ"}}}],"created_at":"2022-11-08T18:04:03+00:00","last_updated_at":"2022-11-08T21:10:54+00:00","published_at":"2022-11-08T21:10:54+00:00","_links":{"display":"https://xe03v5buli4.typeform.com/to/VWO7mLtl"}},"emitted_at":1673035157921} -{"stream":"forms","data":{"id":"SdMKQYkv","type":"quiz","title":"Event Registration (copy)","workspace":{"href":"https://api.typeform.com/workspaces/sDaAqs"},"theme":{"href":"https://api.typeform.com/themes/JPnxbU"},"settings":{"language":"en","progress_bar":"proportion","meta":{"allow_indexing":true},"hide_navigation":false,"is_public":true,"is_trial":false,"show_progress_bar":true,"show_typeform_branding":true,"are_uploads_public":false,"show_time_to_complete":true,"show_number_of_submissions":false,"show_cookie_consent":false,"show_question_number":true,"pro_subdomain_enabled":false,"capabilities":{"e2e_encryption":{"enabled":false,"modifiable":false}}},"thankyou_screens":[{"id":"DefaultTyScreen","ref":"default_tys","title":"Thanks for completing this typeform\nNow *create your own* — it's free, easy, & beautiful","type":"thankyou_screen","properties":{"show_button":true,"share_icons":false,"button_mode":"default_redirect","button_text":"Create a *typeform*"},"attachment":{"type":"image","href":"https://images.typeform.com/images/2dpnUBBkz2VN"}}],"welcome_screens":[{"id":"3rc53L8DmKJ5","ref":"70d54ea2e68f27ae","title":"The annual FormConf is almost here.\n\nWant to come?","properties":{"show_button":true,"button_text":"Count me in"},"attachment":{"type":"image","href":"https://images.typeform.com/images/UD82iitWn5XY"}}],"fields":[{"id":"63WvXUnvSCa9","title":"Great, can we get your full name?","ref":"ef34b985c51e4131","properties":{"description":"We'll print this on your event pass."},"validations":{"required":true},"type":"short_text"},{"id":"kwpFrd2lI3ok","title":"And what's your email address?","ref":"0c3cabd70157cf16","properties":{"description":"We'll only use it to send you a confirmation."},"validations":{"required":true},"type":"email"},{"id":"1Ua3d1mzhJwj","title":"Are you planning on staying for the afterparty?","ref":"7207397713e2b5e3","properties":{"description":"We have a surprise guest lined up...","randomize":false,"allow_multiple_selection":false,"allow_other_choice":false,"supersized":false,"show_labels":true,"choices":[{"id":"z5hxxjpJl07L","ref":"bfcc3fbf608583f7","label":"Yes","attachment":{"type":"image","href":"https://images.typeform.com/images/xDriVAzzHfVq"}},{"id":"37iaitPaS03r","ref":"5bf390ce5210d38b","label":"No","attachment":{"type":"image","href":"https://images.typeform.com/images/Rn4AmMgzPrYg"}}]},"validations":{"required":false},"type":"picture_choice"},{"id":"MmrPLXSaCF5B","title":"And do you have any food allergies we should know about?","ref":"9aaaeeebe70858c4","properties":{},"validations":{"required":false},"type":"short_text"},{"id":"gurSOcuvNnvb","title":"Any questions about the event?","ref":"18842abd9aa9ded4","properties":{"description":"Write them here and we'll get back to you via email."},"validations":{"required":false},"type":"long_text"},{"id":"fCaCvjCJ57cO","title":"And finally, would you mind telling us how you heard about the FormConf?","ref":"261d0775b1f029cb","properties":{"randomize":false,"allow_multiple_selection":false,"allow_other_choice":true,"vertical_alignment":false,"choices":[{"id":"IhbdgAo2LHXJ","ref":"51c76f5fa66c6725","label":"Social media"},{"id":"h6Ss8i8gQdOw","ref":"87408191d53179ee","label":"Google"},{"id":"45jv6vFn2nrz","ref":"8bc14882d0521d6a","label":"Local advertising"},{"id":"Iahtxl1jeQwh","ref":"fce1c86f-fb00-4c33-8085-6e4a4f12ea35","label":"From a friend"}]},"validations":{"required":false},"type":"multiple_choice"},{"id":"i8rReP3KV7c0","title":"That's everything. We'll send you an email confirmation with some details a few minutes after you submit this form.\n\nWe hope you're excited as we are :)","ref":"c6d179ae9c4794e0","properties":{"button_text":"See you there!","hide_marks":true},"type":"statement"}],"created_at":"2021-06-26T14:39:53+00:00","last_updated_at":"2021-06-27T15:15:56+00:00","published_at":"2021-06-27T15:15:56+00:00","_links":{"display":"https://xe03v5buli4.typeform.com/to/SdMKQYkv"}},"emitted_at":1673035158049} -{"stream":"forms","data":{"id":"kRt99jlK","type":"quiz","title":"Political Poll [DEMO 2] (copy)","workspace":{"href":"https://api.typeform.com/workspaces/sDaAqs"},"theme":{"href":"https://api.typeform.com/themes/wvWlco"},"settings":{"language":"en","progress_bar":"percentage","meta":{"allow_indexing":true},"hide_navigation":false,"is_public":true,"is_trial":false,"show_progress_bar":true,"show_typeform_branding":true,"are_uploads_public":false,"show_time_to_complete":true,"show_number_of_submissions":false,"show_cookie_consent":false,"show_question_number":true,"pro_subdomain_enabled":false,"capabilities":{"e2e_encryption":{"enabled":false,"modifiable":false}}},"thankyou_screens":[{"id":"DefaultTyScreen","ref":"default_tys","title":"Thanks for completing this typeform\nNow *create your own* — it's free, easy, & beautiful","type":"thankyou_screen","properties":{"show_button":true,"share_icons":false,"button_mode":"default_redirect","button_text":"Create a *typeform*"},"attachment":{"type":"image","href":"https://images.typeform.com/images/2dpnUBBkz2VN"}}],"welcome_screens":[{"id":"4jguOatzh4QX","ref":"e8ee8d1500fec6d9","title":"*National Voting Intentions*","properties":{"show_button":true,"button_text":"Take Poll","description":"If you're ok with it, we'd like to know about how you might vote in a general election"},"attachment":{"type":"image","href":"https://images.typeform.com/images/ty98jF8FppfC"}}],"fields":[{"id":"qthblBc7InVU","title":"Let's get right to the point:\nIf there was a general election tomorrow, which party would you vote for?","ref":"8267768033031e53","properties":{"randomize":false,"allow_multiple_selection":false,"allow_other_choice":true,"vertical_alignment":true,"choices":[{"id":"3XbsOhLiGFkv","ref":"fc3c3f5dbe75a01e","label":"Center-right party"},{"id":"FesJYxqJ0SNX","ref":"61f5e8b36fcdbd91","label":"Center-left party"},{"id":"prJzwOH23zsc","ref":"495e234f7c65d582","label":"Green party"},{"id":"6IXNu85c5dOl","ref":"566c959b6ef92437","label":"Don't know"}]},"validations":{"required":true},"type":"multiple_choice"},{"id":"rB7FJUThFlu4","title":"OK, how do you feel about the general direction of our country at the moment?","ref":"b13b02912db6f287","properties":{"randomize":false,"allow_multiple_selection":false,"allow_other_choice":false,"supersized":true,"show_labels":true,"choices":[{"id":"Jt8FTorS35Sb","ref":"b99bb45c5b8c25be","label":"Going in the wrong direction","attachment":{"type":"image","href":"https://images.typeform.com/images/evDEZYspmvjm"}},{"id":"KUJ0sF2mqG5A","ref":"2e07534517a152a2","label":"Going in the right direction","attachment":{"type":"image","href":"https://images.typeform.com/images/DgjPyuz9Aphy"}},{"id":"Dlb3UhA4keI4","ref":"50be578304fe3e92","label":"At a standstill","attachment":{"type":"image","href":"https://images.typeform.com/images/ZqbqJ6h4zGmM"}},{"id":"21TAgDkTV2zE","ref":"d9993c86773807a8","label":"Unsure","attachment":{"type":"image","href":"https://images.typeform.com/images/mNFNeMbxPQMt"}}]},"validations":{"required":true},"type":"picture_choice"},{"id":"vV7ISYSgZ94I","title":"Thanks, and how do you feel about your own situation this year?","ref":"f1939629f760be75","properties":{"start_at_one":true,"steps":5,"labels":{"left":"Much worse","center":"About the same","right":"Much better"}},"validations":{"required":true},"type":"opinion_scale"},{"id":"Mrq4qNeRInni","title":"Thanks again. Just a couple more questions to go. \nWhich of these issues is most important to you?","ref":"c52566d91c5052e2","properties":{"randomize":true,"allow_multiple_selection":false,"allow_other_choice":false,"supersized":false,"show_labels":true,"choices":[{"id":"pTMw2DVbpMyD","ref":"d9374e70c6cb2f9c","label":"Taxes & Economy","attachment":{"type":"image","href":"https://images.typeform.com/images/6eSzJ9khSfvS"}},{"id":"dymEoJ3SUDZp","ref":"d3278566f523cef0","label":"Labor & Business","attachment":{"type":"image","href":"https://images.typeform.com/images/HWfXuXCR3Ls8"}},{"id":"mOq857nilN8V","ref":"39ecf093bc5e645b","label":"Infrastructures","attachment":{"type":"image","href":"https://images.typeform.com/images/rW2P45guvd63"}},{"id":"rnul7dwtsWbg","ref":"aa1c16d517ffbea0","label":"Health","attachment":{"type":"image","href":"https://images.typeform.com/images/nVsmUESsAzCs"}},{"id":"Ii1K3mlYioOm","ref":"4b9a4b0defbf04e5","label":"Environment","attachment":{"type":"image","href":"https://images.typeform.com/images/7ZwHmRi3ZYeg"}},{"id":"TGZeXHyDgTrQ","ref":"536d99289a1f80d1","label":"Education","attachment":{"type":"image","href":"https://images.typeform.com/images/Z8qCFjGRD78P"}},{"id":"1Asa5xFxfuCi","ref":"68b9b4d37fabf862","label":"Family & Equality","attachment":{"type":"image","href":"https://images.typeform.com/images/YC4Fx6ud6bKq"}},{"id":"szBe0vqnkCUK","ref":"3f1692f85c3cd73b","label":"Military & Defense","attachment":{"type":"image","href":"https://images.typeform.com/images/YA746sDt87Xf"}}]},"validations":{"required":true},"type":"picture_choice"},{"id":"aDJXqNTyDXxD","title":"To finish up, would you mind telling us how you think the current government doing on these issues?","ref":"f684d8bc4fbca5d3","properties":{"description":"From 1, doing badly, to 5, doing great...","button_text":"Continue","show_button":false,"fields":[{"id":"x9myjwStSn9a","title":"Economy","ref":"55c2e5c15f7dccec","properties":{"shape":"star","steps":5},"validations":{"required":true},"type":"rating"},{"id":"zaP8jDAArI5x","title":"National Debt","ref":"f853e99096a32208","properties":{"shape":"up","steps":5},"validations":{"required":true},"type":"rating"},{"id":"VFmcjbHlFTzg","title":"Employment","ref":"6f0fd734177ecf27","properties":{"shape":"user","steps":5},"validations":{"required":true},"type":"rating"},{"id":"DgGh4ZkRBAyH","title":"Healthcare","ref":"b4171ed292dc3cee","properties":{"shape":"heart","steps":5},"validations":{"required":true},"type":"rating"},{"id":"yC3UrwN1LKT8","title":"Education","ref":"c8dd7d63c26777d9","properties":{"shape":"pencil","steps":5},"validations":{"required":true},"type":"rating"}]},"type":"group"}],"created_at":"2021-06-26T14:39:14+00:00","last_updated_at":"2021-07-01T10:03:13+00:00","published_at":"2021-07-01T10:03:13+00:00","_links":{"display":"https://xe03v5buli4.typeform.com/to/kRt99jlK"}},"emitted_at":1673035158319} -{"stream":"forms","data":{"id":"XtrcGoGJ","type":"quiz","title":"Basic Form","workspace":{"href":"https://api.typeform.com/workspaces/sDaAqs"},"theme":{"href":"https://api.typeform.com/themes/qHWOQ7"},"settings":{"language":"en","progress_bar":"proportion","meta":{"allow_indexing":false},"hide_navigation":false,"is_public":true,"is_trial":false,"show_progress_bar":true,"show_typeform_branding":true,"are_uploads_public":false,"show_time_to_complete":true,"show_number_of_submissions":false,"show_cookie_consent":false,"show_question_number":true,"pro_subdomain_enabled":false,"capabilities":{"e2e_encryption":{"enabled":false,"modifiable":false}}},"thankyou_screens":[{"id":"Xg85PhXqk4HR","ref":"01F8N53B82QB6T2VM7ASP16198","title":"","type":"thankyou_screen","properties":{"show_button":true,"share_icons":true,"button_mode":"reload","button_text":"reload"}},{"id":"DefaultTyScreen","ref":"default_tys","title":"Thanks for completing this typeform\nNow *create your own* — it's free, easy, & beautiful","type":"thankyou_screen","properties":{"show_button":true,"share_icons":false,"button_mode":"default_redirect","button_text":"Create a *typeform*"},"attachment":{"type":"image","href":"https://images.typeform.com/images/2dpnUBBkz2VN"}}],"fields":[{"id":"8VK4KwNd0DgB","title":"Hello, what's your name?","ref":"01F8N53B7KPZ2A1DWGZTTK9SKG","properties":{},"validations":{"required":false},"type":"short_text","attachment":{"type":"image","href":"https://images.typeform.com/images/WMALzu59xbXQ"},"layout":{"type":"split","attachment":{"type":"image","href":"https://images.typeform.com/images/WMALzu59xbXQ"}}},{"id":"HbNDNK4LLOXB","title":"Fill your email here:","ref":"b7980774-f17f-43bc-920b-586e03398f03","properties":{},"validations":{"required":false},"type":"email"},{"id":"5l7cx4NRa7aX","title":"enter site","ref":"e98312ff-df57-4de2-82ae-3617e6dd32ab","properties":{},"validations":{"required":false},"type":"website"},{"id":"6lGZzhNfrqwB","title":"Multi-Select question.","ref":"43153da3-fbbc-443e-b66f-1752770c0e0a","properties":{"randomize":false,"allow_multiple_selection":true,"allow_other_choice":false,"vertical_alignment":true,"choices":[{"id":"3HfyxDo5JoXf","ref":"f83999f6-c869-47cc-af2f-f22b628a0fdb","label":"choice 3"},{"id":"03VP9UxCwCLT","ref":"27b8dfcb-ef16-4ad7-b2be-734ec24c34ca","label":"choice 4"},{"id":"ELm7HbFr0OOq","ref":"ce51ab49-2cce-490d-b831-309337c79fa0","label":"choice2"},{"id":"acwDGU8NeO2A","ref":"74ef0411-0c8a-4c09-a6f3-7a62b0745f68","label":"choice1"}]},"validations":{"required":false},"type":"multiple_choice"},{"id":"X6dq0mumvtKq","title":"Nice to meet you, {{field:01F8N53B7KPZ2A1DWGZTTK9SKG}}, how is your day going?","ref":"01F8N53B8293QHVDDHT84RZR6K","properties":{"randomize":false,"allow_multiple_selection":false,"allow_other_choice":false,"vertical_alignment":true,"choices":[{"id":"FWQrVLFdHroI","ref":"01F8N53B82JXPXZ1B53BMJY0X2","label":"Terrific!"},{"id":"7jNEfjJ2cDAl","ref":"01F8N53B82RE3YZK7RR50KNRQ0","label":"Not so well..."}]},"validations":{"required":false},"type":"multiple_choice"}],"created_at":"2021-06-20T16:47:13+00:00","last_updated_at":"2022-06-20T10:19:58+00:00","published_at":"2021-06-20T16:47:26+00:00","_links":{"display":"https://xe03v5buli4.typeform.com/to/XtrcGoGJ"}},"emitted_at":1673035158458} +{"stream": "forms", "data": {"id": "VWO7mLtl", "type": "quiz", "title": "Connector Extensibility meetup", "workspace": {"href": "https://api.typeform.com/workspaces/sDaAqs"}, "theme": {"href": "https://api.typeform.com/themes/qHWOQ7"}, "settings": {"language": "en", "progress_bar": "proportion", "meta": {"allow_indexing": false}, "hide_navigation": false, "is_public": true, "is_trial": false, "show_progress_bar": true, "show_typeform_branding": true, "are_uploads_public": false, "show_time_to_complete": true, "show_number_of_submissions": false, "show_cookie_consent": false, "show_question_number": true, "show_key_hint_on_choices": true, "pro_subdomain_enabled": false, "capabilities": {"e2e_encryption": {"enabled": false, "modifiable": false}}}, "thankyou_screens": [{"id": "qvDqCNAHuIC8", "ref": "01GHC6KQ5Y0M8VN6XHVAG75J0G", "title": "", "type": "thankyou_screen", "properties": {"show_button": true, "share_icons": true, "button_mode": "default_redirect", "button_text": "Create a typeform"}}, {"id": "DefaultTyScreen", "ref": "default_tys", "title": "Thanks for completing this typeform\nNow *create your own* \u2014 it's free, easy, & beautiful", "type": "thankyou_screen", "properties": {"show_button": true, "share_icons": false, "button_mode": "default_redirect", "button_text": "Create a *typeform*"}, "attachment": {"type": "image", "href": "https://images.typeform.com/images/2dpnUBBkz2VN"}}], "fields": [{"id": "ZdzF0rrvsVdB", "title": "What times work for you to visit San Francisco to work with the team?", "ref": "01GHC6KQ5Y6S9ZQH5CHKZPT1RM", "properties": {"randomize": false, "allow_multiple_selection": true, "allow_other_choice": true, "vertical_alignment": true, "choices": [{"id": "nLpt4rvNjFB3", "ref": "01GHC6KQ5Y155J0F550BGYYS1A", "label": "Dec 12-16"}, {"id": "4xpK9sqA06eL", "ref": "01GHC6KQ5YBATX0CFENVVB5BYG", "label": "Dec 19-23"}, {"id": "jQHb3mqslOsZ", "ref": "1c392fa3-e693-49fe-b334-3a5cddc1db6f", "label": "Jan 9-14"}, {"id": "wS5FKMUnMgqR", "ref": "2ac396a3-1b8e-4e56-b36d-d1f27c1b834d", "label": "Jan 16-20"}, {"id": "uvmLX80Loava", "ref": "8fffd3a8-1e96-421d-a605-a7029bd55e97", "label": "Jan 22-26"}, {"id": "7ubtgCrW2meb", "ref": "17403cc9-74cd-49d1-856a-be6662b3b497", "label": "Jan30 - Feb3"}, {"id": "51q0g4fTFtYc", "ref": "3a1295b4-97b9-4986-9c37-f1af1d72501d", "label": "Feb 6 - 11"}, {"id": "vi3iwtpETqlb", "ref": "54edf52a-c9c7-4bc4-a5a6-bd86115f5adb", "label": "Feb 13-17"}, {"id": "iI0hDpta14Kk", "ref": "e149c19f-8b61-4ff0-a17a-e9e65c3a8fee", "label": "Feb 19-24"}]}, "validations": {"required": false}, "type": "multiple_choice", "attachment": {"type": "image", "href": "https://images.typeform.com/images/WMALzu59xbXQ"}, "layout": {"type": "split", "attachment": {"type": "image", "href": "https://images.typeform.com/images/WMALzu59xbXQ"}}}], "created_at": "2022-11-08T18:04:03+00:00", "last_updated_at": "2022-11-08T21:10:54+00:00", "published_at": "2022-11-08T21:10:54+00:00", "_links": {"display": "https://xe03v5buli4.typeform.com/to/VWO7mLtl"}}, "emitted_at": 1674208909563} +{"stream": "forms", "data": {"id": "SdMKQYkv", "type": "quiz", "title": "Event Registration (copy)", "workspace": {"href": "https://api.typeform.com/workspaces/sDaAqs"}, "theme": {"href": "https://api.typeform.com/themes/JPnxbU"}, "settings": {"language": "en", "progress_bar": "proportion", "meta": {"allow_indexing": true}, "hide_navigation": false, "is_public": true, "is_trial": false, "show_progress_bar": true, "show_typeform_branding": true, "are_uploads_public": false, "show_time_to_complete": true, "show_number_of_submissions": false, "show_cookie_consent": false, "show_question_number": true, "show_key_hint_on_choices": true, "pro_subdomain_enabled": false, "capabilities": {"e2e_encryption": {"enabled": false, "modifiable": false}}}, "thankyou_screens": [{"id": "DefaultTyScreen", "ref": "default_tys", "title": "Thanks for completing this typeform\nNow *create your own* \u2014 it's free, easy, & beautiful", "type": "thankyou_screen", "properties": {"show_button": true, "share_icons": false, "button_mode": "default_redirect", "button_text": "Create a *typeform*"}, "attachment": {"type": "image", "href": "https://images.typeform.com/images/2dpnUBBkz2VN"}}], "welcome_screens": [{"id": "3rc53L8DmKJ5", "ref": "70d54ea2e68f27ae", "title": "The annual FormConf is almost here.\n\nWant to come?", "properties": {"show_button": true, "button_text": "Count me in"}, "attachment": {"type": "image", "href": "https://images.typeform.com/images/UD82iitWn5XY"}}], "fields": [{"id": "63WvXUnvSCa9", "title": "Great, can we get your full name?", "ref": "ef34b985c51e4131", "properties": {"description": "We'll print this on your event pass."}, "validations": {"required": true}, "type": "short_text"}, {"id": "kwpFrd2lI3ok", "title": "And what's your email address?", "ref": "0c3cabd70157cf16", "properties": {"description": "We'll only use it to send you a confirmation."}, "validations": {"required": true}, "type": "email"}, {"id": "1Ua3d1mzhJwj", "title": "Are you planning on staying for the afterparty?", "ref": "7207397713e2b5e3", "properties": {"description": "We have a surprise guest lined up...", "randomize": false, "allow_multiple_selection": false, "allow_other_choice": false, "supersized": false, "show_labels": true, "choices": [{"id": "z5hxxjpJl07L", "ref": "bfcc3fbf608583f7", "label": "Yes", "attachment": {"type": "image", "href": "https://images.typeform.com/images/xDriVAzzHfVq"}}, {"id": "37iaitPaS03r", "ref": "5bf390ce5210d38b", "label": "No", "attachment": {"type": "image", "href": "https://images.typeform.com/images/Rn4AmMgzPrYg"}}]}, "validations": {"required": false}, "type": "picture_choice"}, {"id": "MmrPLXSaCF5B", "title": "And do you have any food allergies we should know about?", "ref": "9aaaeeebe70858c4", "properties": {}, "validations": {"required": false}, "type": "short_text"}, {"id": "gurSOcuvNnvb", "title": "Any questions about the event?", "ref": "18842abd9aa9ded4", "properties": {"description": "Write them here and we'll get back to you via email."}, "validations": {"required": false}, "type": "long_text"}, {"id": "fCaCvjCJ57cO", "title": "And finally, would you mind telling us how you heard about the FormConf?", "ref": "261d0775b1f029cb", "properties": {"randomize": false, "allow_multiple_selection": false, "allow_other_choice": true, "vertical_alignment": false, "choices": [{"id": "IhbdgAo2LHXJ", "ref": "51c76f5fa66c6725", "label": "Social media"}, {"id": "h6Ss8i8gQdOw", "ref": "87408191d53179ee", "label": "Google"}, {"id": "45jv6vFn2nrz", "ref": "8bc14882d0521d6a", "label": "Local advertising"}, {"id": "Iahtxl1jeQwh", "ref": "fce1c86f-fb00-4c33-8085-6e4a4f12ea35", "label": "From a friend"}]}, "validations": {"required": false}, "type": "multiple_choice"}, {"id": "i8rReP3KV7c0", "title": "That's everything. We'll send you an email confirmation with some details a few minutes after you submit this form.\n\nWe hope you're excited as we are :)", "ref": "c6d179ae9c4794e0", "properties": {"button_text": "See you there!", "hide_marks": true}, "type": "statement"}], "created_at": "2021-06-26T14:39:53+00:00", "last_updated_at": "2021-06-27T15:15:56+00:00", "published_at": "2021-06-27T15:15:56+00:00", "_links": {"display": "https://xe03v5buli4.typeform.com/to/SdMKQYkv"}}, "emitted_at": 1674208909865} +{"stream": "forms", "data": {"id": "kRt99jlK", "type": "quiz", "title": "Political Poll [DEMO 2] (copy)", "workspace": {"href": "https://api.typeform.com/workspaces/sDaAqs"}, "theme": {"href": "https://api.typeform.com/themes/wvWlco"}, "settings": {"language": "en", "progress_bar": "percentage", "meta": {"allow_indexing": true}, "hide_navigation": false, "is_public": true, "is_trial": false, "show_progress_bar": true, "show_typeform_branding": true, "are_uploads_public": false, "show_time_to_complete": true, "show_number_of_submissions": false, "show_cookie_consent": false, "show_question_number": true, "show_key_hint_on_choices": true, "pro_subdomain_enabled": false, "capabilities": {"e2e_encryption": {"enabled": false, "modifiable": false}}}, "thankyou_screens": [{"id": "DefaultTyScreen", "ref": "default_tys", "title": "Thanks for completing this typeform\nNow *create your own* \u2014 it's free, easy, & beautiful", "type": "thankyou_screen", "properties": {"show_button": true, "share_icons": false, "button_mode": "default_redirect", "button_text": "Create a *typeform*"}, "attachment": {"type": "image", "href": "https://images.typeform.com/images/2dpnUBBkz2VN"}}], "welcome_screens": [{"id": "4jguOatzh4QX", "ref": "e8ee8d1500fec6d9", "title": "*National Voting Intentions*", "properties": {"show_button": true, "button_text": "Take Poll", "description": "If you're ok with it, we'd like to know about how you might vote in a general election"}, "attachment": {"type": "image", "href": "https://images.typeform.com/images/ty98jF8FppfC"}}], "fields": [{"id": "qthblBc7InVU", "title": "Let's get right to the point:\nIf there was a general election tomorrow, which party would you vote for?", "ref": "8267768033031e53", "properties": {"randomize": false, "allow_multiple_selection": false, "allow_other_choice": true, "vertical_alignment": true, "choices": [{"id": "3XbsOhLiGFkv", "ref": "fc3c3f5dbe75a01e", "label": "Center-right party"}, {"id": "FesJYxqJ0SNX", "ref": "61f5e8b36fcdbd91", "label": "Center-left party"}, {"id": "prJzwOH23zsc", "ref": "495e234f7c65d582", "label": "Green party"}, {"id": "6IXNu85c5dOl", "ref": "566c959b6ef92437", "label": "Don't know"}]}, "validations": {"required": true}, "type": "multiple_choice"}, {"id": "rB7FJUThFlu4", "title": "OK, how do you feel about the general direction of our country at the moment?", "ref": "b13b02912db6f287", "properties": {"randomize": false, "allow_multiple_selection": false, "allow_other_choice": false, "supersized": true, "show_labels": true, "choices": [{"id": "Jt8FTorS35Sb", "ref": "b99bb45c5b8c25be", "label": "Going in the wrong direction", "attachment": {"type": "image", "href": "https://images.typeform.com/images/evDEZYspmvjm"}}, {"id": "KUJ0sF2mqG5A", "ref": "2e07534517a152a2", "label": "Going in the right direction", "attachment": {"type": "image", "href": "https://images.typeform.com/images/DgjPyuz9Aphy"}}, {"id": "Dlb3UhA4keI4", "ref": "50be578304fe3e92", "label": "At a standstill", "attachment": {"type": "image", "href": "https://images.typeform.com/images/ZqbqJ6h4zGmM"}}, {"id": "21TAgDkTV2zE", "ref": "d9993c86773807a8", "label": "Unsure", "attachment": {"type": "image", "href": "https://images.typeform.com/images/mNFNeMbxPQMt"}}]}, "validations": {"required": true}, "type": "picture_choice"}, {"id": "vV7ISYSgZ94I", "title": "Thanks, and how do you feel about your own situation this year?", "ref": "f1939629f760be75", "properties": {"start_at_one": true, "steps": 5, "labels": {"left": "Much worse", "center": "About the same", "right": "Much better"}}, "validations": {"required": true}, "type": "opinion_scale"}, {"id": "Mrq4qNeRInni", "title": "Thanks again. Just a couple more questions to go. \nWhich of these issues is most important to you?", "ref": "c52566d91c5052e2", "properties": {"randomize": true, "allow_multiple_selection": false, "allow_other_choice": false, "supersized": false, "show_labels": true, "choices": [{"id": "pTMw2DVbpMyD", "ref": "d9374e70c6cb2f9c", "label": "Taxes & Economy", "attachment": {"type": "image", "href": "https://images.typeform.com/images/6eSzJ9khSfvS"}}, {"id": "dymEoJ3SUDZp", "ref": "d3278566f523cef0", "label": "Labor & Business", "attachment": {"type": "image", "href": "https://images.typeform.com/images/HWfXuXCR3Ls8"}}, {"id": "mOq857nilN8V", "ref": "39ecf093bc5e645b", "label": "Infrastructures", "attachment": {"type": "image", "href": "https://images.typeform.com/images/rW2P45guvd63"}}, {"id": "rnul7dwtsWbg", "ref": "aa1c16d517ffbea0", "label": "Health", "attachment": {"type": "image", "href": "https://images.typeform.com/images/nVsmUESsAzCs"}}, {"id": "Ii1K3mlYioOm", "ref": "4b9a4b0defbf04e5", "label": "Environment", "attachment": {"type": "image", "href": "https://images.typeform.com/images/7ZwHmRi3ZYeg"}}, {"id": "TGZeXHyDgTrQ", "ref": "536d99289a1f80d1", "label": "Education", "attachment": {"type": "image", "href": "https://images.typeform.com/images/Z8qCFjGRD78P"}}, {"id": "1Asa5xFxfuCi", "ref": "68b9b4d37fabf862", "label": "Family & Equality", "attachment": {"type": "image", "href": "https://images.typeform.com/images/YC4Fx6ud6bKq"}}, {"id": "szBe0vqnkCUK", "ref": "3f1692f85c3cd73b", "label": "Military & Defense", "attachment": {"type": "image", "href": "https://images.typeform.com/images/YA746sDt87Xf"}}]}, "validations": {"required": true}, "type": "picture_choice"}, {"id": "aDJXqNTyDXxD", "title": "To finish up, would you mind telling us how you think the current government doing on these issues?", "ref": "f684d8bc4fbca5d3", "properties": {"description": "From 1, doing badly, to 5, doing great...", "button_text": "Continue", "show_button": false, "fields": [{"id": "x9myjwStSn9a", "title": "Economy", "ref": "55c2e5c15f7dccec", "properties": {"shape": "star", "steps": 5}, "validations": {"required": true}, "type": "rating"}, {"id": "zaP8jDAArI5x", "title": "National Debt", "ref": "f853e99096a32208", "properties": {"shape": "up", "steps": 5}, "validations": {"required": true}, "type": "rating"}, {"id": "VFmcjbHlFTzg", "title": "Employment", "ref": "6f0fd734177ecf27", "properties": {"shape": "user", "steps": 5}, "validations": {"required": true}, "type": "rating"}, {"id": "DgGh4ZkRBAyH", "title": "Healthcare", "ref": "b4171ed292dc3cee", "properties": {"shape": "heart", "steps": 5}, "validations": {"required": true}, "type": "rating"}, {"id": "yC3UrwN1LKT8", "title": "Education", "ref": "c8dd7d63c26777d9", "properties": {"shape": "pencil", "steps": 5}, "validations": {"required": true}, "type": "rating"}]}, "type": "group"}], "created_at": "2021-06-26T14:39:14+00:00", "last_updated_at": "2021-07-01T10:03:13+00:00", "published_at": "2021-07-01T10:03:13+00:00", "_links": {"display": "https://xe03v5buli4.typeform.com/to/kRt99jlK"}}, "emitted_at": 1674208910341} +{"stream": "forms", "data": {"id": "XtrcGoGJ", "type": "quiz", "title": "Basic Form", "workspace": {"href": "https://api.typeform.com/workspaces/sDaAqs"}, "theme": {"href": "https://api.typeform.com/themes/qHWOQ7"}, "settings": {"language": "en", "progress_bar": "proportion", "meta": {"allow_indexing": false}, "hide_navigation": false, "is_public": true, "is_trial": false, "show_progress_bar": true, "show_typeform_branding": true, "are_uploads_public": false, "show_time_to_complete": true, "show_number_of_submissions": false, "show_cookie_consent": false, "show_question_number": true, "show_key_hint_on_choices": true, "pro_subdomain_enabled": false, "capabilities": {"e2e_encryption": {"enabled": false, "modifiable": false}}}, "thankyou_screens": [{"id": "Xg85PhXqk4HR", "ref": "01F8N53B82QB6T2VM7ASP16198", "title": "", "type": "thankyou_screen", "properties": {"show_button": true, "share_icons": true, "button_mode": "reload", "button_text": "reload"}}, {"id": "DefaultTyScreen", "ref": "default_tys", "title": "Thanks for completing this typeform\nNow *create your own* \u2014 it's free, easy, & beautiful", "type": "thankyou_screen", "properties": {"show_button": true, "share_icons": false, "button_mode": "default_redirect", "button_text": "Create a *typeform*"}, "attachment": {"type": "image", "href": "https://images.typeform.com/images/2dpnUBBkz2VN"}}], "fields": [{"id": "8VK4KwNd0DgB", "title": "Hello, what's your name?", "ref": "01F8N53B7KPZ2A1DWGZTTK9SKG", "properties": {}, "validations": {"required": false}, "type": "short_text", "attachment": {"type": "image", "href": "https://images.typeform.com/images/WMALzu59xbXQ"}, "layout": {"type": "split", "attachment": {"type": "image", "href": "https://images.typeform.com/images/WMALzu59xbXQ"}}}, {"id": "HbNDNK4LLOXB", "title": "Fill your email here:", "ref": "b7980774-f17f-43bc-920b-586e03398f03", "properties": {}, "validations": {"required": false}, "type": "email"}, {"id": "5l7cx4NRa7aX", "title": "enter site", "ref": "e98312ff-df57-4de2-82ae-3617e6dd32ab", "properties": {}, "validations": {"required": false}, "type": "website"}, {"id": "6lGZzhNfrqwB", "title": "Multi-Select question.", "ref": "43153da3-fbbc-443e-b66f-1752770c0e0a", "properties": {"randomize": false, "allow_multiple_selection": true, "allow_other_choice": false, "vertical_alignment": true, "choices": [{"id": "3HfyxDo5JoXf", "ref": "f83999f6-c869-47cc-af2f-f22b628a0fdb", "label": "choice 3"}, {"id": "03VP9UxCwCLT", "ref": "27b8dfcb-ef16-4ad7-b2be-734ec24c34ca", "label": "choice 4"}, {"id": "ELm7HbFr0OOq", "ref": "ce51ab49-2cce-490d-b831-309337c79fa0", "label": "choice2"}, {"id": "acwDGU8NeO2A", "ref": "74ef0411-0c8a-4c09-a6f3-7a62b0745f68", "label": "choice1"}]}, "validations": {"required": false}, "type": "multiple_choice"}, {"id": "X6dq0mumvtKq", "title": "Nice to meet you, {{field:01F8N53B7KPZ2A1DWGZTTK9SKG}}, how is your day going?", "ref": "01F8N53B8293QHVDDHT84RZR6K", "properties": {"randomize": false, "allow_multiple_selection": false, "allow_other_choice": false, "vertical_alignment": true, "choices": [{"id": "FWQrVLFdHroI", "ref": "01F8N53B82JXPXZ1B53BMJY0X2", "label": "Terrific!"}, {"id": "7jNEfjJ2cDAl", "ref": "01F8N53B82RE3YZK7RR50KNRQ0", "label": "Not so well..."}]}, "validations": {"required": false}, "type": "multiple_choice"}], "created_at": "2021-06-20T16:47:13+00:00", "last_updated_at": "2022-06-20T10:19:58+00:00", "published_at": "2021-06-20T16:47:26+00:00", "_links": {"display": "https://xe03v5buli4.typeform.com/to/XtrcGoGJ"}}, "emitted_at": 1674208910581} {"stream":"responses","data":{"landing_id":"fr2wm964fnyxpdx9a8tfr2wmlph34hqi","token":"fr2wm964fnyxpdx9a8tfr2wmlph34hqi","response_id":"fr2wm964fnyxpdx9a8tfr2wmlph34hqi","landed_at":"2022-11-08T21:59:53Z","submitted_at":"2022-11-08T22:00:24Z","metadata":{"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36","platform":"other","referer":"https://xe03v5buli4.typeform.com/to/VWO7mLtl","network_id":"8a0111039f","browser":"default"},"hidden":{},"calculated":{"score":0},"answers":[{"field":{"id":"ZdzF0rrvsVdB","ref":"01GHC6KQ5Y6S9ZQH5CHKZPT1RM","type":"multiple_choice"},"type":"choices","choices":{"ids":["nLpt4rvNjFB3","4xpK9sqA06eL","jQHb3mqslOsZ","wS5FKMUnMgqR","uvmLX80Loava","7ubtgCrW2meb","iI0hDpta14Kk"],"refs":["01GHC6KQ5Y155J0F550BGYYS1A","01GHC6KQ5YBATX0CFENVVB5BYG","1c392fa3-e693-49fe-b334-3a5cddc1db6f","2ac396a3-1b8e-4e56-b36d-d1f27c1b834d","8fffd3a8-1e96-421d-a605-a7029bd55e97","17403cc9-74cd-49d1-856a-be6662b3b497","e149c19f-8b61-4ff0-a17a-e9e65c3a8fee"],"labels":["Dec 12-16","Dec 19-23","Jan 9-14","Jan 16-20","Jan 22-26","Jan30 - Feb3","Feb 19-24"]}}]},"emitted_at":1673035160703} {"stream":"responses","data":{"landing_id":"0dc8djmlrkmxuwu7s7mmia0dc8dj4a1r","token":"0dc8djmlrkmxuwu7s7mmia0dc8dj4a1r","response_id":"0dc8djmlrkmxuwu7s7mmia0dc8dj4a1r","landed_at":"2022-11-08T22:08:39Z","submitted_at":"2022-11-08T22:10:04Z","metadata":{"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36","platform":"other","referer":"https://xe03v5buli4.typeform.com/to/VWO7mLtl","network_id":"d4b74277d2","browser":"default"},"hidden":{},"calculated":{"score":0},"answers":[{"field":{"id":"ZdzF0rrvsVdB","ref":"01GHC6KQ5Y6S9ZQH5CHKZPT1RM","type":"multiple_choice"},"type":"choices","choices":{"ids":["nLpt4rvNjFB3","wS5FKMUnMgqR","jQHb3mqslOsZ","51q0g4fTFtYc","vi3iwtpETqlb","iI0hDpta14Kk"],"refs":["01GHC6KQ5Y155J0F550BGYYS1A","2ac396a3-1b8e-4e56-b36d-d1f27c1b834d","1c392fa3-e693-49fe-b334-3a5cddc1db6f","3a1295b4-97b9-4986-9c37-f1af1d72501d","54edf52a-c9c7-4bc4-a5a6-bd86115f5adb","e149c19f-8b61-4ff0-a17a-e9e65c3a8fee"],"labels":["Dec 12-16","Jan 16-20","Jan 9-14","Feb 6 - 11","Feb 13-17","Feb 19-24"]}}]},"emitted_at":1673035160703} {"stream":"responses","data":{"landing_id":"ng2hh3i6cy7ikeyorbnl0ng2hh3icyvq","token":"ng2hh3i6cy7ikeyorbnl0ng2hh3icyvq","response_id":"ng2hh3i6cy7ikeyorbnl0ng2hh3icyvq","landed_at":"2022-11-09T06:16:08Z","submitted_at":"2022-11-09T06:16:10Z","metadata":{"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36","platform":"other","referer":"https://xe03v5buli4.typeform.com/to/VWO7mLtl","network_id":"2be9dd4bab","browser":"default"},"hidden":{},"calculated":{"score":0},"answers":[{"field":{"id":"ZdzF0rrvsVdB","ref":"01GHC6KQ5Y6S9ZQH5CHKZPT1RM","type":"multiple_choice"},"type":"choices","choices":{"ids":["nLpt4rvNjFB3","wS5FKMUnMgqR","uvmLX80Loava","7ubtgCrW2meb","51q0g4fTFtYc","vi3iwtpETqlb","iI0hDpta14Kk"],"refs":["01GHC6KQ5Y155J0F550BGYYS1A","2ac396a3-1b8e-4e56-b36d-d1f27c1b834d","8fffd3a8-1e96-421d-a605-a7029bd55e97","17403cc9-74cd-49d1-856a-be6662b3b497","3a1295b4-97b9-4986-9c37-f1af1d72501d","54edf52a-c9c7-4bc4-a5a6-bd86115f5adb","e149c19f-8b61-4ff0-a17a-e9e65c3a8fee"],"labels":["Dec 12-16","Jan 16-20","Jan 22-26","Jan30 - Feb3","Feb 6 - 11","Feb 13-17","Feb 19-24"]}}]},"emitted_at":1673035160855} From 09592ab0a1e9ace2f352d9972b25e1a7ac4557bf Mon Sep 17 00:00:00 2001 From: darynaishchenko <80129833+darynaishchenko@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:35:25 +0200 Subject: [PATCH 005/195] fixed expected records for projects and project_detail streams (#21640) --- .../source-sentry/integration_tests/expected_records.jsonl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/airbyte-integrations/connectors/source-sentry/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-sentry/integration_tests/expected_records.jsonl index a616e5ece9766..877be28416d85 100644 --- a/airbyte-integrations/connectors/source-sentry/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-sentry/integration_tests/expected_records.jsonl @@ -1,5 +1,5 @@ {"stream": "events", "data": {"id": "b82cb40291414a90a5b3fb9fe0b646a9", "groupID": "3879509212", "eventID": "b82cb40291414a90a5b3fb9fe0b646a9", "projectID": "5942472", "size": 8070, "entries": [{"data": {"formatted": "This is an example Python exception"}, "type": "message"}, {"data": {"frames": [{"filename": "raven/base.py", "absPath": "/home/ubuntu/.virtualenvs/getsentry/src/raven/raven/base.py", "module": "raven.base", "package": null, "platform": null, "instructionAddr": null, "symbolAddr": null, "function": "build_msg", "rawFunction": null, "symbol": null, "context": [[298, " frames = stack"], [299, ""], [300, " data.update({"], [301, " 'sentry.interfaces.Stacktrace': {"], [302, " 'frames': get_stack_info(frames,"], [303, " transformer=self.transform)"], [304, " },"], [305, " })"], [306, ""], [307, " if 'sentry.interfaces.Stacktrace' in data:"], [308, " if self.include_paths:"]], "lineNo": 303, "colNo": null, "inApp": false, "trust": null, "errors": null, "vars": {"'culprit'": null, "'data'": {"'message'": "u'This is a test message generated using ``raven test``'", "'sentry.interfaces.Message'": {"'message'": "u'This is a test message generated using ``raven test``'", "'params'": []}}, "'date'": "datetime.datetime(2013, 8, 13, 3, 8, 24, 880386)", "'event_id'": "'54a322436e1b47b88e239b78998ae742'", "'event_type'": "'raven.events.Message'", "'extra'": {"'go_deeper'": [["{\"'bar'\":[\"'baz'\"],\"'foo'\":\"'bar'\"}"]], "'loadavg'": [0.37255859375, 0.5341796875, 0.62939453125], "'user'": "'dcramer'"}, "'frames'": "", "'handler'": "", "'k'": "'sentry.interfaces.Message'", "'kwargs'": {"'level'": 20, "'message'": "'This is a test message generated using ``raven test``'"}, "'public_key'": null, "'result'": {"'message'": "u'This is a test message generated using ``raven test``'", "'sentry.interfaces.Message'": {"'message'": "u'This is a test message generated using ``raven test``'", "'params'": []}}, "'self'": "", "'stack'": true, "'tags'": null, "'time_spent'": null, "'v'": {"'message'": "u'This is a test message generated using ``raven test``'", "'params'": []}}}, {"filename": "raven/base.py", "absPath": "/home/ubuntu/.virtualenvs/getsentry/src/raven/raven/base.py", "module": "raven.base", "package": null, "platform": null, "instructionAddr": null, "symbolAddr": null, "function": "capture", "rawFunction": null, "symbol": null, "context": [[454, " if not self.is_enabled():"], [455, " return"], [456, ""], [457, " data = self.build_msg("], [458, " event_type, data, date, time_spent, extra, stack, tags=tags,"], [459, " **kwargs)"], [460, ""], [461, " self.send(**data)"], [462, ""], [463, " return (data.get('event_id'),)"], [464, ""]], "lineNo": 459, "colNo": null, "inApp": false, "trust": null, "errors": null, "vars": {"'data'": null, "'date'": null, "'event_type'": "'raven.events.Message'", "'extra'": {"'go_deeper'": [["{\"'bar'\":[\"'baz'\"],\"'foo'\":\"'bar'\"}"]], "'loadavg'": [0.37255859375, 0.5341796875, 0.62939453125], "'user'": "'dcramer'"}, "'kwargs'": {"'level'": 20, "'message'": "'This is a test message generated using ``raven test``'"}, "'self'": "", "'stack'": true, "'tags'": null, "'time_spent'": null}}, {"filename": "raven/base.py", "absPath": "/home/ubuntu/.virtualenvs/getsentry/src/raven/raven/base.py", "module": "raven.base", "package": null, "platform": null, "instructionAddr": null, "symbolAddr": null, "function": "captureMessage", "rawFunction": null, "symbol": null, "context": [[572, " \"\"\""], [573, " Creates an event from ``message``."], [574, ""], [575, " >>> client.captureMessage('My event just happened!')"], [576, " \"\"\""], [577, " return self.capture('raven.events.Message', message=message, **kwargs)"], [578, ""], [579, " def captureException(self, exc_info=None, **kwargs):"], [580, " \"\"\""], [581, " Creates an event from an exception."], [582, ""]], "lineNo": 577, "colNo": null, "inApp": false, "trust": null, "errors": null, "vars": {"'kwargs'": {"'data'": null, "'extra'": {"'go_deeper'": ["[{\"'bar'\":[\"'baz'\"],\"'foo'\":\"'bar'\"}]"], "'loadavg'": [0.37255859375, 0.5341796875, 0.62939453125], "'user'": "'dcramer'"}, "'level'": 20, "'stack'": true, "'tags'": null}, "'message'": "'This is a test message generated using ``raven test``'", "'self'": ""}}, {"filename": "raven/scripts/runner.py", "absPath": "/home/ubuntu/.virtualenvs/getsentry/src/raven/raven/scripts/runner.py", "module": "raven.scripts.runner", "package": null, "platform": null, "instructionAddr": null, "symbolAddr": null, "function": "send_test_message", "rawFunction": null, "symbol": null, "context": [[72, " level=logging.INFO,"], [73, " stack=True,"], [74, " tags=options.get('tags', {}),"], [75, " extra={"], [76, " 'user': get_uid(),"], [77, " 'loadavg': get_loadavg(),"], [78, " },"], [79, " ))"], [80, ""], [81, " if client.state.did_fail():"], [82, " print('error!')"]], "lineNo": 77, "colNo": null, "inApp": false, "trust": null, "errors": null, "vars": {"'client'": "", "'data'": null, "'k'": "'secret_key'", "'options'": {"'data'": null, "'tags'": null}}}, {"filename": "raven/scripts/runner.py", "absPath": "/home/ubuntu/.virtualenvs/getsentry/src/raven/raven/scripts/runner.py", "module": "raven.scripts.runner", "package": null, "platform": null, "instructionAddr": null, "symbolAddr": null, "function": "main", "rawFunction": null, "symbol": null, "context": [[107, " print(\"Using DSN configuration:\")"], [108, " print(\" \", dsn)"], [109, " print()"], [110, ""], [111, " client = Client(dsn, include_paths=['raven'])"], [112, " send_test_message(client, opts.__dict__)"]], "lineNo": 112, "colNo": null, "inApp": false, "trust": null, "errors": null, "vars": {"'args'": ["'test'", "'https://ebc35f33e151401f9deac549978bda11:f3403f81e12e4c24942d505f086b2cad@sentry.io/1'"], "'client'": "", "'dsn'": "'https://ebc35f33e151401f9deac549978bda11:f3403f81e12e4c24942d505f086b2cad@sentry.io/1'", "'opts'": "", "'parser'": "", "'root'": ""}}], "framesOmitted": null, "registers": null, "hasSystemFrames": false}, "type": "stacktrace"}, {"data": {"method": "GET", "url": "http://example.com/foo", "query": [["foo", "bar"]], "fragment": null, "data": {"hello": "world"}, "headers": [["Content-Type", "application/json"], ["Referer", "http://example.com"], ["User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36"]], "cookies": [["foo", "bar"], ["biz", "baz"]], "env": {"ENV": "prod"}, "inferredContentType": "application/json"}, "type": "request"}], "dist": null, "message": "This is an example Python exception", "title": "This is an example Python exception", "location": null, "user": {"id": "1", "email": "sentry@example.com", "username": "sentry", "ip_address": "127.0.0.1", "name": "Sentry", "data": null}, "contexts": {"browser": {"name": "Chrome", "version": "28.0.1500", "type": "browser"}, "client_os": {"name": "Windows", "version": "8", "type": "os"}}, "sdk": null, "context": {"emptyList": [], "emptyMap": {}, "length": 10837790, "results": [1, 2, 3, 4, 5], "session": {"foo": "bar"}, "unauthorized": false, "url": "http://example.org/foo/bar/"}, "packages": {"my.package": "1.0.0"}, "type": "default", "metadata": {"title": "This is an example Python exception"}, "tags": [{"key": "browser", "value": "Chrome 28.0.1500"}, {"key": "browser.name", "value": "Chrome"}, {"key": "client_os", "value": "Windows 8"}, {"key": "client_os.name", "value": "Windows"}, {"key": "environment", "value": "prod"}, {"key": "level", "value": "error"}, {"key": "sample_event", "value": "yes"}, {"key": "server_name", "value": "web01.example.org"}, {"key": "url", "value": "http://example.com/foo"}, {"key": "user", "value": "id:1", "query": "user.id:\"1\""}], "platform": "python", "dateReceived": "2023-01-17T08:56:35.677376Z", "errors": [], "occurrence": null, "_meta": {"entries": {}, "message": null, "user": null, "contexts": null, "sdk": null, "context": null, "packages": null, "tags": {}}, "crashFile": null, "culprit": "raven.scripts.runner in main", "dateCreated": "2023-01-17T08:55:35Z", "fingerprints": ["3a2b45089d0211943e5a6645fb4cea3f"], "groupingConfig": {"id": "newstyle:2019-10-29", "enhancements": "eJybzDRxY3J-bm5-npWRgaGlroGxrpHxBABcYgcZ"}}, "emitted_at": 1673945830994} {"stream": "issues", "data": {"id": "3879509212", "shareId": null, "shortId": "AIRBYTE-09-3", "title": "This is an example Python exception", "culprit": "raven.scripts.runner in main", "permalink": "https://sentry.io/organizations/airbyte-09/issues/3879509212/", "logger": null, "level": "error", "status": "unresolved", "statusDetails": {}, "isPublic": false, "platform": "python", "project": {"id": "5942472", "name": "airbyte-09", "slug": "airbyte-09", "platform": "python"}, "type": "default", "metadata": {"title": "This is an example Python exception"}, "numComments": 0, "assignedTo": null, "isBookmarked": false, "isSubscribed": false, "subscriptionDetails": null, "hasSeen": true, "annotations": [], "issueType": "error", "issueCategory": "error", "isUnhandled": false, "count": "1", "userCount": 1, "firstSeen": "2023-01-17T08:55:35.676000Z", "lastSeen": "2023-01-17T08:55:35.676000Z"}, "emitted_at": 1673945832193} -{"stream": "project_detail", "data": {"id": "5942472", "slug": "airbyte-09", "name": "airbyte-09", "isPublic": false, "isBookmarked": false, "color": "#803fbf", "dateCreated": "2021-09-02T07:42:22.421223Z", "firstEvent": null, "firstTransactionEvent": false, "hasSessions": false, "hasProfiles": false, "hasReplays": false, "hasMinifiedStackTrace": false, "features": ["alert-filters", "minidump", "race-free-group-creation", "similarity-indexing", "similarity-view", "releases"], "status": "active", "platform": "python", "isInternal": false, "isMember": true, "hasAccess": true, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "team": {"id": "1170523", "slug": "airbyte", "name": "Airbyte"}, "teams": [{"id": "1170523", "slug": "airbyte", "name": "Airbyte"}], "latestRelease": {"id": 289364918, "version": "checkout-app@3.2", "status": "open", "shortVersion": "checkout-app@3.2", "versionInfo": {"package": "checkout-app", "version": {"raw": "3.2", "major": 3, "minor": 2, "patch": 0, "pre": null, "buildCode": null, "components": 2}, "description": "3.2", "buildHash": null}, "ref": null, "url": null, "dateReleased": null, "dateCreated": "2021-09-02T08:10:12.826000Z", "data": {}, "newGroups": 0, "owner": null, "commitCount": 0, "lastCommit": null, "deployCount": 0, "lastDeploy": null, "authors": [], "projects": [{"id": 5942472, "slug": "airbyte-09", "name": "airbyte-09", "newGroups": 0, "platform": "python", "platforms": [], "hasHealthData": false}], "firstEvent": null, "lastEvent": null, "currentProjectMeta": {}, "userAgent": null}, "options": {"sentry:token": "5006ad000bc111ec95cd8e5fccda0a6a", "sentry:option-epoch": 7, "sentry:csp_ignored_sources_defaults": true, "sentry:csp_ignored_sources": "", "sentry:reprocessing_active": false, "sentry:performance_issue_creation_rate": null, "filters:blacklisted_ips": "", "filters:releases": "", "filters:error_messages": "", "feedback:branding": true}, "digestsMinDelay": 300, "digestsMaxDelay": 1800, "subjectPrefix": "", "allowedDomains": ["*"], "resolveAge": 0, "dataScrubber": true, "dataScrubberDefaults": true, "safeFields": [], "storeCrashReports": null, "sensitiveFields": [], "subjectTemplate": "$shortID - $title", "securityToken": "5006ad000bc111ec95cd8e5fccda0a6a", "securityTokenHeader": null, "verifySSL": false, "scrubIPAddresses": false, "scrapeJavaScript": true, "groupingConfig": "newstyle:2019-10-29", "groupingEnhancements": "", "groupingEnhancementsBase": null, "secondaryGroupingExpiry": 0, "secondaryGroupingConfig": null, "groupingAutoUpdate": true, "fingerprintingRules": "", "organization": {"id": "985996", "slug": "airbyte-09", "status": {"id": "active", "name": "active"}, "name": "Airbyte", "dateCreated": "2021-09-02T07:41:55.899035Z", "isEarlyAdopter": false, "require2FA": false, "requireEmailVerification": false, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "features": ["india-promotion", "metrics-extraction", "auto-start-free-trial", "dynamic-sampling", "integrations-stacktrace-link", "source-maps-cta", "new-weekly-report", "release-health-return-metrics", "alert-crash-free-metrics", "performance-onboarding-checklist", "promotion-mobperf-discount20", "dashboards-template", "discover-query-builder-as-landing-page", "custom-event-title", "shared-issues", "performance-mep-bannerless-ui", "discover-events-rate-limit", "derive-code-mappings", "promotion-mobperf-gift50kerr", "invite-members-rate-limits", "discover-quick-context", "minute-resolution-sessions", "issue-actions-v2", "event-attachments", "performance-transaction-name-only-search-indexed", "am2-billing", "profiling", "release-health-drop-sessions", "transaction-metrics-extraction", "issue-alert-incompatible-rules", "performance-span-histogram-view", "enable-zendesk-support", "track-button-click-events", "performance-new-widget-designs", "ondemand-budgets", "advanced-search", "integrations-deployment", "mep-rollout-flag", "scim-orgmember-roles", "skip-trial-ending-email", "org-subdomains", "metric-alert-chartcuterie", "issue-alert-test-notifications", "slack-overage-notifications", "monitors", "onboarding", "promotion-be-adoption-enabled", "symbol-sources", "issue-alert-preview", "performance-issues-all-events-tab", "performance-view", "open-membership", "issue-alert-fallback-targeting"], "links": {"organizationUrl": "https://airbyte-09.sentry.io", "regionUrl": "https://us.sentry.io"}, "hasAuthProvider": false}, "plugins": [{"id": "asana", "name": "Asana", "slug": "asana", "shortName": "Asana", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nImprove your productivity by creating tasks in Asana directly\nfrom Sentry issues. This integration also allows you to link Sentry\nissues to existing tasks in Asana.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to an Asana ticket in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Asana tickets.", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "bitbucket", "name": "Bitbucket", "slug": "bitbucket", "shortName": "Bitbucket", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Integrate Bitbucket issues by linking a repository to a project.", "features": ["commits", "issue-basic"], "featureDescriptions": [{"description": "Track commits and releases (learn more\n [here](https://docs.sentry.io/learn/releases/))", "featureGate": "commits"}, {"description": "Create Bitbucket issues from Sentry", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Bitbucket issues", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "github", "name": "GitHub", "slug": "github", "shortName": "GitHub", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Integrate GitHub issues by linking a repository to a project.", "features": ["commits", "issue-basic"], "featureDescriptions": [{"description": "Authorize repositories to be added to your Sentry organization to augment\n sentry issues with commit data with [deployment\n tracking](https://docs.sentry.io/learn/releases/).", "featureGate": "commits"}, {"description": "Create and link Sentry issue groups directly to a GitHub issue or pull\n request in any of your repositories, providing a quick way to jump from\n Sentry bug to tracked issue or PR!", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "gitlab", "name": "GitLab", "slug": "gitlab", "shortName": "GitLab", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Integrate GitLab issues by linking a repository to a project", "features": ["commits", "issue-basic"], "featureDescriptions": [{"description": "Track commits and releases (learn more\n [here](https://docs.sentry.io/learn/releases/))", "featureGate": "commits"}, {"description": "Resolve Sentry issues via GitLab commits and merge requests by\n including `Fixes PROJ-ID` in the message", "featureGate": "commits"}, {"description": "Create GitLab issues from Sentry", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing GitLab issues", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "heroku", "name": "Heroku", "slug": "heroku", "shortName": "Heroku", "type": "release-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "\n

Add Sentry as a deploy hook to automatically track new releases.

\n
heroku addons:create deployhooks:http --url=https://sentry.io/api/hooks/release/heroku/5942472/cd92fd5564e9d4a2b82dd03ad2d539a1a2b83ea13e2e205507d2f8d3c513d864/
\n ", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry"}, "isDeprecated": false, "isHidden": false, "description": "Integrate Heroku release tracking.", "features": ["deployment"], "featureDescriptions": [{"description": "Integrate Heroku release tracking.", "featureGate": "deployment"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "jira", "name": "JIRA", "slug": "jira", "shortName": "JIRA", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Integrate JIRA issues by linking a project.", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to a Jira ticket in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "opsgenie", "name": "OpsGenie", "slug": "opsgenie", "shortName": "OpsGenie", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry"}, "isDeprecated": false, "isHidden": false, "description": "\nTrigger alerts in Opsgenie from Sentry.\n\nOpsgenie is a cloud-based service for dev & ops teams, providing reliable\nalerts, on-call schedule management and escalations. OpsGenie integrates with\nmonitoring tools & services, ensures the right people are notified. This\nplugin only supports issue alerts.\n", "features": ["alert-rule", "incident-management"], "featureDescriptions": [{"description": "Manage incidents and outages by sending Sentry notifications to OpsGenie.", "featureGate": "incident-management"}, {"description": "Configure Sentry rules to trigger notifications based on conditions you set.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "pagerduty", "name": "PagerDuty", "slug": "pagerduty", "shortName": "PagerDuty", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Send alerts to PagerDuty.", "features": ["alert-rule", "incident-management"], "featureDescriptions": [{"description": "Manage incidents and outages by sending Sentry notifications to PagerDuty.", "featureGate": "incident-management"}, {"description": "Configure rule based PagerDuty alerts to automatically be triggered in a specific\n service - or in multiple services!", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "phabricator", "name": "Phabricator", "slug": "phabricator", "shortName": "Phabricator", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nImprove your productivity by creating tickets in Phabricator directly from Sentry issues.\nThis integration also allows you to link Sentry issues to existing tickets in Phabricator.\n\nPhabricator is a set of tools for developing software. It includes applications for\ncode review, repository hosting, bug tracking, project management, and more.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to a Phabricator ticket in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Phabricator tickets.", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "pivotal", "name": "Pivotal Tracker", "slug": "pivotal", "shortName": "Pivotal Tracker", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nImprove your productivity by creating tickets in Pivotal Tracker directly from Sentry issues.\nThis integration also allows you to link Sentry issues to existing tickets in Pivotal Tracker.\n\nPivotal Tracker is a straightforward project-planning tool that helps software development\nteams form realistic expectations about when work might be completed based on the teams\nongoing performance. Tracker visualizes your projects in the form of stories\nmoving through your workflow, encouraging you to break down projects into manageable\nchunks and have important conversations about deliverables and scope.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to a Pivotal Tracker ticket in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Pivotal Tracker tickets.", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "pushover", "name": "Pushover", "slug": "pushover", "shortName": "Pushover", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nGet notified of Sentry alerts on any device using the Pushover integration.\n\nPushover makes it easy to get real-time notifications on your Android, iPhone, iPad, and Desktop.\n", "features": ["mobile", "alert-rule"], "featureDescriptions": [{"description": "Have Pushover notifications get sent to your mobile device with the Pushover app.", "featureGate": "mobile"}, {"description": "Configure Sentry rules to trigger notifications based on conditions you set.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "redmine", "name": "Redmine", "slug": "redmine", "shortName": "Redmine", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nCreate issues in Redmine directly from Sentry. This integration also\nallows you to link Sentry issues to existing tickets in Redmine.\n\nRedmine is a flexible project management web application. Written using\nthe Ruby on Rails framework, it is cross-platform and cross-database.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to an Redmine issue in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Redmine issue.", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "sessionstack", "name": "SessionStack", "slug": "sessionstack", "shortName": "SessionStack", "type": "default", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": ["sessionstack"], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "Watch SessionStack recordings in Sentry.", "features": ["session-replay"], "featureDescriptions": [{"description": "Watch the SessionStack session replay of a user in a video widget embedded in the Sentry UI for an issue.", "featureGate": "session-replay"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "slack", "name": "Slack", "slug": "slack", "shortName": "Slack", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Post notifications to a Slack channel.", "features": ["alert-rule"], "featureDescriptions": [{"description": "Configure rule based Slack notifications to automatically be posted into a\n specific channel. Want any error that's happening more than 100 times a\n minute to be posted in `#critical-errors`? Setup a rule for it!", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "trello", "name": "Trello", "slug": "trello", "shortName": "Trello", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nCreate cards in Trello directly from Sentry. This integration also allows\nyou to link Sentry issues to existing cards in Trello.\n\nTrello is the easy, free, flexible, and visual way to manage your projects\nand organize anything, trusted by millions of people from all over the world.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to an Trello card in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Trello cards", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Trello Setup Instructions", "url": "https://github.com/getsentry/sentry/blob/master/src/sentry_plugins/trello/Trello_Instructions.md"}, {"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "twilio", "name": "Twilio (SMS)", "slug": "twilio", "shortName": "Twilio (SMS)", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nGet notified of Sentry alerts via SMS.\n\nTwilio allows users to send and receive text messages globally with\nthe API that over a million developers depend on.\n", "features": ["mobile", "alert-rule"], "featureDescriptions": [{"description": "Set up SMS notifications to be sent to your mobile device via Twilio.", "featureGate": "mobile"}, {"description": "Configure Sentry rules to trigger notifications based on conditions you set.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Documentation", "url": "https://github.com/getsentry/sentry/blob/master/src/sentry_plugins/twilio/Twilio_Instructions.md"}, {"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins/twilio"}, {"title": "Twilio", "url": "https://www.twilio.com/"}]}, {"id": "victorops", "name": "VictorOps", "slug": "victorops", "shortName": "VictorOps", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nTrigger alerts in VictorOps from Sentry.\n\nVictorOps is incident response software purpose-built for teams powering the\nevolution of software. With on-call basics, cross-team collaboration, and\nstreamlined visibility, we champion the engineers powering innovation and uptime.\n", "features": ["alert-rule", "incident-management"], "featureDescriptions": [{"description": "Manage incidents and outages by sending Sentry notifications to VictorOps.", "featureGate": "incident-management"}, {"description": "Configure Sentry rules to trigger notifications based on conditions you set.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "webhooks", "name": "WebHooks", "slug": "webhooks", "shortName": "WebHooks", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.1.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nTrigger outgoing HTTP POST requests from Sentry.\n\nNote: To configure webhooks over multiple projects, we recommend setting up an\nInternal Integration.\n", "features": ["alert-rule"], "featureDescriptions": [{"description": "Configure rule based outgoing HTTP POST requests from Sentry.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry/plugins/sentry_webhooks"}, {"title": "Internal Integrations", "url": "https://docs.sentry.io/workflow/integrations/integration-platform/#internal-integrations"}]}], "platforms": [], "processingIssues": 0, "defaultEnvironment": null, "relayPiiConfig": null, "builtinSymbolSources": ["ios", "microsoft", "android"], "dynamicSampling": null, "dynamicSamplingBiases": [{"id": "boostEnvironments", "active": true}, {"id": "boostLatestRelease", "active": true}, {"id": "ignoreHealthChecks", "active": true}, {"id": "boostKeyTransactions", "active": true}], "performanceIssueCreationRate": 1.0, "eventProcessing": {"symbolicationDegraded": false}, "symbolSources": "[]"}, "emitted_at": 1673945833626} -{"stream": "projects", "data": {"id": "6712547", "slug": "demo-integration", "name": "demo-integration", "isPublic": false, "isBookmarked": false, "color": "#bf833f", "dateCreated": "2022-09-02T15:01:28.946777Z", "firstEvent": "2022-09-02T15:36:50.870000Z", "firstTransactionEvent": false, "hasSessions": false, "hasProfiles": false, "hasReplays": false, "hasMinifiedStackTrace": false, "features": ["alert-filters", "minidump", "race-free-group-creation", "similarity-indexing", "similarity-view"], "status": "active", "platform": "javascript-react", "isInternal": false, "isMember": true, "hasAccess": true, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "organization": {"id": "985996", "slug": "airbyte-09", "status": {"id": "active", "name": "active"}, "name": "Airbyte", "dateCreated": "2021-09-02T07:41:55.899035Z", "isEarlyAdopter": false, "require2FA": false, "requireEmailVerification": false, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "features": ["auto-start-free-trial", "dynamic-sampling", "india-promotion", "performance-onboarding-checklist", "enable-zendesk-support", "custom-event-title", "derive-code-mappings", "performance-mep-bannerless-ui", "shared-issues", "discover-events-rate-limit", "event-attachments", "advanced-search", "org-subdomains", "release-health-drop-sessions", "metrics-extraction", "discover-query-builder-as-landing-page", "promotion-mobperf-gift50kerr", "source-maps-cta", "issue-alert-incompatible-rules", "issue-alert-fallback-targeting", "new-weekly-report", "scim-orgmember-roles", "skip-trial-ending-email", "minute-resolution-sessions", "release-health-return-metrics", "open-membership", "ondemand-budgets", "track-button-click-events", "slack-overage-notifications", "metric-alert-chartcuterie", "profiling", "performance-span-histogram-view", "onboarding", "performance-transaction-name-only-search-indexed", "alert-crash-free-metrics", "transaction-metrics-extraction", "issue-actions-v2", "issue-alert-preview", "promotion-mobperf-discount20", "am2-billing", "invite-members-rate-limits", "dashboards-template", "symbol-sources", "integrations-deployment", "integrations-stacktrace-link", "discover-quick-context", "issue-alert-test-notifications", "mep-rollout-flag", "performance-new-widget-designs", "monitors", "promotion-be-adoption-enabled", "performance-issues-all-events-tab", "performance-view"], "links": {"organizationUrl": "https://airbyte-09.sentry.io", "regionUrl": "https://us.sentry.io"}, "hasAuthProvider": false}}, "emitted_at": 1673945834670} -{"stream": "projects", "data": {"id": "5942472", "slug": "airbyte-09", "name": "airbyte-09", "isPublic": false, "isBookmarked": false, "color": "#803fbf", "dateCreated": "2021-09-02T07:42:22.421223Z", "firstEvent": null, "firstTransactionEvent": false, "hasSessions": false, "hasProfiles": false, "hasReplays": false, "hasMinifiedStackTrace": false, "features": ["alert-filters", "minidump", "race-free-group-creation", "similarity-indexing", "similarity-view", "releases"], "status": "active", "platform": "python", "isInternal": false, "isMember": true, "hasAccess": true, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "organization": {"id": "985996", "slug": "airbyte-09", "status": {"id": "active", "name": "active"}, "name": "Airbyte", "dateCreated": "2021-09-02T07:41:55.899035Z", "isEarlyAdopter": false, "require2FA": false, "requireEmailVerification": false, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "features": ["auto-start-free-trial", "dynamic-sampling", "india-promotion", "performance-onboarding-checklist", "enable-zendesk-support", "custom-event-title", "derive-code-mappings", "performance-mep-bannerless-ui", "shared-issues", "discover-events-rate-limit", "event-attachments", "advanced-search", "org-subdomains", "release-health-drop-sessions", "metrics-extraction", "discover-query-builder-as-landing-page", "promotion-mobperf-gift50kerr", "source-maps-cta", "issue-alert-incompatible-rules", "issue-alert-fallback-targeting", "new-weekly-report", "scim-orgmember-roles", "skip-trial-ending-email", "minute-resolution-sessions", "release-health-return-metrics", "open-membership", "ondemand-budgets", "track-button-click-events", "slack-overage-notifications", "metric-alert-chartcuterie", "profiling", "performance-span-histogram-view", "onboarding", "performance-transaction-name-only-search-indexed", "alert-crash-free-metrics", "transaction-metrics-extraction", "issue-actions-v2", "issue-alert-preview", "promotion-mobperf-discount20", "am2-billing", "invite-members-rate-limits", "dashboards-template", "symbol-sources", "integrations-deployment", "integrations-stacktrace-link", "discover-quick-context", "issue-alert-test-notifications", "mep-rollout-flag", "performance-new-widget-designs", "monitors", "promotion-be-adoption-enabled", "performance-issues-all-events-tab", "performance-view"], "links": {"organizationUrl": "https://airbyte-09.sentry.io", "regionUrl": "https://us.sentry.io"}, "hasAuthProvider": false}}, "emitted_at": 1673945834672} \ No newline at end of file +{"stream": "project_detail", "data": {"id": "5942472", "slug": "airbyte-09", "name": "airbyte-09", "isPublic": false, "isBookmarked": false, "color": "#803fbf", "dateCreated": "2021-09-02T07:42:22.421223Z", "firstEvent": null, "firstTransactionEvent": false, "hasSessions": false, "hasProfiles": false, "hasReplays": false, "hasMinifiedStackTrace": false, "features": ["alert-filters", "minidump", "race-free-group-creation", "similarity-indexing", "similarity-view", "releases"], "status": "active", "platform": "python", "isInternal": false, "isMember": true, "hasAccess": true, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "team": {"id": "1170523", "slug": "airbyte", "name": "Airbyte"}, "teams": [{"id": "1170523", "slug": "airbyte", "name": "Airbyte"}], "latestRelease": {"id": 289364918, "version": "checkout-app@3.2", "status": "open", "shortVersion": "checkout-app@3.2", "versionInfo": {"package": "checkout-app", "version": {"raw": "3.2", "major": 3, "minor": 2, "patch": 0, "pre": null, "buildCode": null, "components": 2}, "description": "3.2", "buildHash": null}, "ref": null, "url": null, "dateReleased": null, "dateCreated": "2021-09-02T08:10:12.826000Z", "data": {}, "newGroups": 0, "owner": null, "commitCount": 0, "lastCommit": null, "deployCount": 0, "lastDeploy": null, "authors": [], "projects": [{"id": 5942472, "slug": "airbyte-09", "name": "airbyte-09", "newGroups": 0, "platform": "python", "platforms": ["python"], "hasHealthData": false}], "firstEvent": null, "lastEvent": null, "currentProjectMeta": {}, "userAgent": null}, "options": {"sentry:token": "5006ad000bc111ec95cd8e5fccda0a6a", "sentry:option-epoch": 7, "sentry:csp_ignored_sources_defaults": true, "sentry:csp_ignored_sources": "", "sentry:reprocessing_active": false, "sentry:performance_issue_creation_rate": null, "filters:blacklisted_ips": "", "filters:releases": "", "filters:error_messages": "", "feedback:branding": true}, "digestsMinDelay": 300, "digestsMaxDelay": 1800, "subjectPrefix": "", "allowedDomains": ["*"], "resolveAge": 0, "dataScrubber": true, "dataScrubberDefaults": true, "safeFields": [], "storeCrashReports": null, "sensitiveFields": [], "subjectTemplate": "$shortID - $title", "securityToken": "5006ad000bc111ec95cd8e5fccda0a6a", "securityTokenHeader": null, "verifySSL": false, "scrubIPAddresses": false, "scrapeJavaScript": true, "groupingConfig": "newstyle:2019-10-29", "groupingEnhancements": "", "groupingEnhancementsBase": null, "secondaryGroupingExpiry": 0, "secondaryGroupingConfig": null, "groupingAutoUpdate": true, "fingerprintingRules": "", "organization": {"id": "985996", "slug": "airbyte-09", "status": {"id": "active", "name": "active"}, "name": "Airbyte", "dateCreated": "2021-09-02T07:41:55.899035Z", "isEarlyAdopter": false, "require2FA": false, "requireEmailVerification": false, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "features": ["issue-alert-test-notifications", "india-promotion", "metric-alert-chartcuterie", "performance-issues-all-events-tab", "alert-crash-free-metrics", "discover-query-builder-as-landing-page", "dashboards-template", "metrics-extraction", "skip-trial-ending-email", "release-health-drop-sessions", "performance-transaction-name-only-search-indexed", "promotion-be-adoption-enabled", "new-weekly-report", "derive-code-mappings", "slack-overage-notifications", "monitors", "track-button-click-events", "shared-issues", "minute-resolution-sessions", "event-attachments", "discover-events-rate-limit", "issue-alert-preview", "integrations-deployment", "session-replay-ui", "issue-actions-v2", "ondemand-budgets", "profiling", "source-maps-cta", "promotion-mobperf-discount20", "org-subdomains", "integrations-stacktrace-link", "enable-zendesk-support", "scim-orgmember-roles", "issue-alert-incompatible-rules", "mep-rollout-flag", "dynamic-sampling", "auto-start-free-trial", "issue-alert-fallback-targeting", "am2-billing", "advanced-search", "invite-members-rate-limits", "performance-new-widget-designs", "release-health-return-metrics", "performance-view", "open-membership", "discover-quick-context", "session-replay", "performance-span-histogram-view", "symbol-sources", "custom-event-title", "performance-onboarding-checklist", "performance-mep-bannerless-ui", "onboarding", "transaction-metrics-extraction", "promotion-mobperf-gift50kerr"], "links": {"organizationUrl": "https://airbyte-09.sentry.io", "regionUrl": "https://us.sentry.io"}, "hasAuthProvider": false}, "plugins": [{"id": "asana", "name": "Asana", "slug": "asana", "shortName": "Asana", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nImprove your productivity by creating tasks in Asana directly\nfrom Sentry issues. This integration also allows you to link Sentry\nissues to existing tasks in Asana.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to an Asana ticket in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Asana tickets.", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "bitbucket", "name": "Bitbucket", "slug": "bitbucket", "shortName": "Bitbucket", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Integrate Bitbucket issues by linking a repository to a project.", "features": ["commits", "issue-basic"], "featureDescriptions": [{"description": "Track commits and releases (learn more\n [here](https://docs.sentry.io/learn/releases/))", "featureGate": "commits"}, {"description": "Create Bitbucket issues from Sentry", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Bitbucket issues", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "github", "name": "GitHub", "slug": "github", "shortName": "GitHub", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Integrate GitHub issues by linking a repository to a project.", "features": ["commits", "issue-basic"], "featureDescriptions": [{"description": "Authorize repositories to be added to your Sentry organization to augment\n sentry issues with commit data with [deployment\n tracking](https://docs.sentry.io/learn/releases/).", "featureGate": "commits"}, {"description": "Create and link Sentry issue groups directly to a GitHub issue or pull\n request in any of your repositories, providing a quick way to jump from\n Sentry bug to tracked issue or PR!", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "gitlab", "name": "GitLab", "slug": "gitlab", "shortName": "GitLab", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Integrate GitLab issues by linking a repository to a project", "features": ["commits", "issue-basic"], "featureDescriptions": [{"description": "Track commits and releases (learn more\n [here](https://docs.sentry.io/learn/releases/))", "featureGate": "commits"}, {"description": "Resolve Sentry issues via GitLab commits and merge requests by\n including `Fixes PROJ-ID` in the message", "featureGate": "commits"}, {"description": "Create GitLab issues from Sentry", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing GitLab issues", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "heroku", "name": "Heroku", "slug": "heroku", "shortName": "Heroku", "type": "release-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "\n

Add Sentry as a deploy hook to automatically track new releases.

\n
heroku addons:create deployhooks:http --url=https://sentry.io/api/hooks/release/heroku/5942472/cd92fd5564e9d4a2b82dd03ad2d539a1a2b83ea13e2e205507d2f8d3c513d864/
\n ", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry"}, "isDeprecated": false, "isHidden": false, "description": "Integrate Heroku release tracking.", "features": ["deployment"], "featureDescriptions": [{"description": "Integrate Heroku release tracking.", "featureGate": "deployment"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "jira", "name": "JIRA", "slug": "jira", "shortName": "JIRA", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Integrate JIRA issues by linking a project.", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to a Jira ticket in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "opsgenie", "name": "OpsGenie", "slug": "opsgenie", "shortName": "OpsGenie", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry"}, "isDeprecated": false, "isHidden": false, "description": "\nTrigger alerts in Opsgenie from Sentry.\n\nOpsgenie is a cloud-based service for dev & ops teams, providing reliable\nalerts, on-call schedule management and escalations. OpsGenie integrates with\nmonitoring tools & services, ensures the right people are notified. This\nplugin only supports issue alerts.\n", "features": ["incident-management", "alert-rule"], "featureDescriptions": [{"description": "Manage incidents and outages by sending Sentry notifications to OpsGenie.", "featureGate": "incident-management"}, {"description": "Configure Sentry rules to trigger notifications based on conditions you set.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "pagerduty", "name": "PagerDuty", "slug": "pagerduty", "shortName": "PagerDuty", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Send alerts to PagerDuty.", "features": ["incident-management", "alert-rule"], "featureDescriptions": [{"description": "Manage incidents and outages by sending Sentry notifications to PagerDuty.", "featureGate": "incident-management"}, {"description": "Configure rule based PagerDuty alerts to automatically be triggered in a specific\n service - or in multiple services!", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "phabricator", "name": "Phabricator", "slug": "phabricator", "shortName": "Phabricator", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nImprove your productivity by creating tickets in Phabricator directly from Sentry issues.\nThis integration also allows you to link Sentry issues to existing tickets in Phabricator.\n\nPhabricator is a set of tools for developing software. It includes applications for\ncode review, repository hosting, bug tracking, project management, and more.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to a Phabricator ticket in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Phabricator tickets.", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "pivotal", "name": "Pivotal Tracker", "slug": "pivotal", "shortName": "Pivotal Tracker", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nImprove your productivity by creating tickets in Pivotal Tracker directly from Sentry issues.\nThis integration also allows you to link Sentry issues to existing tickets in Pivotal Tracker.\n\nPivotal Tracker is a straightforward project-planning tool that helps software development\nteams form realistic expectations about when work might be completed based on the teams\nongoing performance. Tracker visualizes your projects in the form of stories\nmoving through your workflow, encouraging you to break down projects into manageable\nchunks and have important conversations about deliverables and scope.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to a Pivotal Tracker ticket in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Pivotal Tracker tickets.", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "pushover", "name": "Pushover", "slug": "pushover", "shortName": "Pushover", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nGet notified of Sentry alerts on any device using the Pushover integration.\n\nPushover makes it easy to get real-time notifications on your Android, iPhone, iPad, and Desktop.\n", "features": ["mobile", "alert-rule"], "featureDescriptions": [{"description": "Have Pushover notifications get sent to your mobile device with the Pushover app.", "featureGate": "mobile"}, {"description": "Configure Sentry rules to trigger notifications based on conditions you set.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "redmine", "name": "Redmine", "slug": "redmine", "shortName": "Redmine", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nCreate issues in Redmine directly from Sentry. This integration also\nallows you to link Sentry issues to existing tickets in Redmine.\n\nRedmine is a flexible project management web application. Written using\nthe Ruby on Rails framework, it is cross-platform and cross-database.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to an Redmine issue in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Redmine issue.", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "sessionstack", "name": "SessionStack", "slug": "sessionstack", "shortName": "SessionStack", "type": "default", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": ["sessionstack"], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "Watch SessionStack recordings in Sentry.", "features": ["session-replay"], "featureDescriptions": [{"description": "Watch the SessionStack session replay of a user in a video widget embedded in the Sentry UI for an issue.", "featureGate": "session-replay"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "slack", "name": "Slack", "slug": "slack", "shortName": "Slack", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": true, "description": "Post notifications to a Slack channel.", "features": ["alert-rule"], "featureDescriptions": [{"description": "Configure rule based Slack notifications to automatically be posted into a\n specific channel. Want any error that's happening more than 100 times a\n minute to be posted in `#critical-errors`? Setup a rule for it!", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "trello", "name": "Trello", "slug": "trello", "shortName": "Trello", "type": "issue-tracking", "canDisable": true, "isTestable": false, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nCreate cards in Trello directly from Sentry. This integration also allows\nyou to link Sentry issues to existing cards in Trello.\n\nTrello is the easy, free, flexible, and visual way to manage your projects\nand organize anything, trusted by millions of people from all over the world.\n", "features": ["issue-basic"], "featureDescriptions": [{"description": "Create and link Sentry issue groups directly to an Trello card in any of your\n projects, providing a quick way to jump from a Sentry bug to tracked ticket!", "featureGate": "issue-basic"}, {"description": "Link Sentry issues to existing Trello cards", "featureGate": "issue-basic"}], "resourceLinks": [{"title": "Trello Setup Instructions", "url": "https://github.com/getsentry/sentry/blob/master/src/sentry_plugins/trello/Trello_Instructions.md"}, {"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "twilio", "name": "Twilio (SMS)", "slug": "twilio", "shortName": "Twilio (SMS)", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nGet notified of Sentry alerts via SMS.\n\nTwilio allows users to send and receive text messages globally with\nthe API that over a million developers depend on.\n", "features": ["mobile", "alert-rule"], "featureDescriptions": [{"description": "Set up SMS notifications to be sent to your mobile device via Twilio.", "featureGate": "mobile"}, {"description": "Configure Sentry rules to trigger notifications based on conditions you set.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Documentation", "url": "https://github.com/getsentry/sentry/blob/master/src/sentry_plugins/twilio/Twilio_Instructions.md"}, {"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins/twilio"}, {"title": "Twilio", "url": "https://www.twilio.com/"}]}, {"id": "victorops", "name": "VictorOps", "slug": "victorops", "shortName": "VictorOps", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nTrigger alerts in VictorOps from Sentry.\n\nVictorOps is incident response software purpose-built for teams powering the\nevolution of software. With on-call basics, cross-team collaboration, and\nstreamlined visibility, we champion the engineers powering innovation and uptime.\n", "features": ["incident-management", "alert-rule"], "featureDescriptions": [{"description": "Manage incidents and outages by sending Sentry notifications to VictorOps.", "featureGate": "incident-management"}, {"description": "Configure Sentry rules to trigger notifications based on conditions you set.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry_plugins"}]}, {"id": "webhooks", "name": "WebHooks", "slug": "webhooks", "shortName": "WebHooks", "type": "notification", "canDisable": true, "isTestable": true, "hasConfiguration": true, "metadata": {}, "contexts": [], "status": "unknown", "assets": [], "doc": "", "firstPartyAlternative": null, "deprecationDate": null, "altIsSentryApp": null, "enabled": false, "version": "23.2.0.dev0", "author": {"name": "Sentry Team", "url": "https://github.com/getsentry/sentry"}, "isDeprecated": false, "isHidden": false, "description": "\nTrigger outgoing HTTP POST requests from Sentry.\n\nNote: To configure webhooks over multiple projects, we recommend setting up an\nInternal Integration.\n", "features": ["alert-rule"], "featureDescriptions": [{"description": "Configure rule based outgoing HTTP POST requests from Sentry.", "featureGate": "alert-rule"}], "resourceLinks": [{"title": "Report Issue", "url": "https://github.com/getsentry/sentry/issues"}, {"title": "View Source", "url": "https://github.com/getsentry/sentry/tree/master/src/sentry/plugins/sentry_webhooks"}, {"title": "Internal Integrations", "url": "https://docs.sentry.io/workflow/integrations/integration-platform/#internal-integrations"}]}], "platforms": ["python"], "processingIssues": 0, "defaultEnvironment": null, "relayPiiConfig": null, "builtinSymbolSources": ["ios", "microsoft", "android"], "dynamicSampling": null, "dynamicSamplingBiases": [{"id": "boostEnvironments", "active": true}, {"id": "boostLatestRelease", "active": true}, {"id": "ignoreHealthChecks", "active": true}, {"id": "boostKeyTransactions", "active": true}], "performanceIssueCreationRate": 1.0, "eventProcessing": {"symbolicationDegraded": false}, "symbolSources": "[]"}, "emitted_at": 1674207986931} +{"stream": "projects", "data": {"id": "6712547", "slug": "demo-integration", "name": "demo-integration", "isPublic": false, "isBookmarked": false, "color": "#bf833f", "dateCreated": "2022-09-02T15:01:28.946777Z", "firstEvent": "2022-09-02T15:36:50.870000Z", "firstTransactionEvent": false, "hasSessions": false, "hasProfiles": false, "hasReplays": false, "hasMinifiedStackTrace": false, "features": ["alert-filters", "minidump", "race-free-group-creation", "similarity-indexing", "similarity-view"], "status": "active", "platform": "javascript-react", "isInternal": false, "isMember": true, "hasAccess": true, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "organization": {"id": "985996", "slug": "airbyte-09", "status": {"id": "active", "name": "active"}, "name": "Airbyte", "dateCreated": "2021-09-02T07:41:55.899035Z", "isEarlyAdopter": false, "require2FA": false, "requireEmailVerification": false, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "features": ["performance-transaction-name-only-search-indexed", "symbol-sources", "alert-crash-free-metrics", "auto-start-free-trial", "dashboards-template", "track-button-click-events", "issue-actions-v2", "slack-overage-notifications", "new-weekly-report", "custom-event-title", "open-membership", "advanced-search", "monitors", "ondemand-budgets", "metric-alert-chartcuterie", "discover-query-builder-as-landing-page", "performance-view", "promotion-mobperf-discount20", "am2-billing", "promotion-be-adoption-enabled", "performance-span-histogram-view", "discover-quick-context", "org-subdomains", "profiling", "issue-alert-incompatible-rules", "event-attachments", "transaction-metrics-extraction", "onboarding", "skip-trial-ending-email", "performance-mep-bannerless-ui", "shared-issues", "enable-zendesk-support", "release-health-return-metrics", "invite-members-rate-limits", "session-replay", "integrations-deployment", "discover-events-rate-limit", "performance-issues-all-events-tab", "scim-orgmember-roles", "integrations-stacktrace-link", "promotion-mobperf-gift50kerr", "issue-alert-fallback-targeting", "mep-rollout-flag", "issue-alert-test-notifications", "performance-new-widget-designs", "source-maps-cta", "performance-onboarding-checklist", "release-health-drop-sessions", "india-promotion", "derive-code-mappings", "metrics-extraction", "session-replay-ui", "minute-resolution-sessions", "dynamic-sampling", "issue-alert-preview"], "links": {"organizationUrl": "https://airbyte-09.sentry.io", "regionUrl": "https://us.sentry.io"}, "hasAuthProvider": false}}, "emitted_at": 1674208203145} +{"stream": "projects", "data": {"id": "5942472", "slug": "airbyte-09", "name": "airbyte-09", "isPublic": false, "isBookmarked": false, "color": "#803fbf", "dateCreated": "2021-09-02T07:42:22.421223Z", "firstEvent": null, "firstTransactionEvent": false, "hasSessions": false, "hasProfiles": false, "hasReplays": false, "hasMinifiedStackTrace": false, "features": ["alert-filters", "minidump", "race-free-group-creation", "similarity-indexing", "similarity-view", "releases"], "status": "active", "platform": "python", "isInternal": false, "isMember": true, "hasAccess": true, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "organization": {"id": "985996", "slug": "airbyte-09", "status": {"id": "active", "name": "active"}, "name": "Airbyte", "dateCreated": "2021-09-02T07:41:55.899035Z", "isEarlyAdopter": false, "require2FA": false, "requireEmailVerification": false, "avatar": {"avatarType": "letter_avatar", "avatarUuid": null}, "features": ["performance-transaction-name-only-search-indexed", "symbol-sources", "alert-crash-free-metrics", "auto-start-free-trial", "dashboards-template", "track-button-click-events", "issue-actions-v2", "slack-overage-notifications", "new-weekly-report", "custom-event-title", "open-membership", "advanced-search", "monitors", "ondemand-budgets", "metric-alert-chartcuterie", "discover-query-builder-as-landing-page", "performance-view", "promotion-mobperf-discount20", "am2-billing", "promotion-be-adoption-enabled", "performance-span-histogram-view", "discover-quick-context", "org-subdomains", "profiling", "issue-alert-incompatible-rules", "event-attachments", "transaction-metrics-extraction", "onboarding", "skip-trial-ending-email", "performance-mep-bannerless-ui", "shared-issues", "enable-zendesk-support", "release-health-return-metrics", "invite-members-rate-limits", "session-replay", "integrations-deployment", "discover-events-rate-limit", "performance-issues-all-events-tab", "scim-orgmember-roles", "integrations-stacktrace-link", "promotion-mobperf-gift50kerr", "issue-alert-fallback-targeting", "mep-rollout-flag", "issue-alert-test-notifications", "performance-new-widget-designs", "source-maps-cta", "performance-onboarding-checklist", "release-health-drop-sessions", "india-promotion", "derive-code-mappings", "metrics-extraction", "session-replay-ui", "minute-resolution-sessions", "dynamic-sampling", "issue-alert-preview"], "links": {"organizationUrl": "https://airbyte-09.sentry.io", "regionUrl": "https://us.sentry.io"}, "hasAuthProvider": false}}, "emitted_at": 1674208203145} \ No newline at end of file From 8a95c5c720b3db67369aae7f886d15e44d6db42f Mon Sep 17 00:00:00 2001 From: Gopi Krishna <34994746+bgopikrishna@users.noreply.github.com> Date: Fri, 20 Jan 2023 20:15:47 +0530 Subject: [PATCH 006/195] removed unused props clickable, wasActive from button component (#18124) Co-authored-by: Krishna (kc) Glick Co-authored-by: perangel Co-authored-by: Conor Co-authored-by: Marcos Marx --- airbyte-webapp/src/components/ui/Button/Button.tsx | 2 -- airbyte-webapp/src/components/ui/Button/types.tsx | 2 -- .../pages/ConnectorsPage/components/UpgradeAllButton.tsx | 1 - .../ConnectorForm/components/Sections/auth/GoogleAuthButton.tsx | 1 - .../Connector/RequestConnectorModal/RequestConnectorModal.tsx | 1 - 5 files changed, 7 deletions(-) diff --git a/airbyte-webapp/src/components/ui/Button/Button.tsx b/airbyte-webapp/src/components/ui/Button/Button.tsx index 10d375a0294f3..4a5aaeee536fa 100644 --- a/airbyte-webapp/src/components/ui/Button/Button.tsx +++ b/airbyte-webapp/src/components/ui/Button/Button.tsx @@ -14,10 +14,8 @@ export const Button = React.forwardRef((props, r variant = "primary", children, className, - clickable, icon, isLoading, - wasActive, width, disabled, ...buttonProps diff --git a/airbyte-webapp/src/components/ui/Button/types.tsx b/airbyte-webapp/src/components/ui/Button/types.tsx index f05e9a6d5f996..5971ab601e719 100644 --- a/airbyte-webapp/src/components/ui/Button/types.tsx +++ b/airbyte-webapp/src/components/ui/Button/types.tsx @@ -4,13 +4,11 @@ type ButtonSize = "xs" | "sm" | "lg"; export type ButtonVariant = "primary" | "secondary" | "danger" | "light" | "clear" | "dark"; export interface ButtonProps extends React.ButtonHTMLAttributes { - clickable?: boolean; full?: boolean; icon?: React.ReactElement; iconPosition?: "left" | "right"; isLoading?: boolean; size?: ButtonSize; variant?: ButtonVariant; - wasActive?: boolean; width?: number; } diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/UpgradeAllButton.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/UpgradeAllButton.tsx index 3f76768c2778e..9c6e1a990917f 100644 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/UpgradeAllButton.tsx +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/UpgradeAllButton.tsx @@ -50,7 +50,6 @@ const UpgradeAllButton: React.FC = ({ onUpdate, isLoading, className={styles.updateButton} onClick={onUpdate} isLoading={isLoading} - wasActive={hasSuccess} icon={hasSuccess ? undefined : } > {hasSuccess ? : } diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/auth/GoogleAuthButton.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/auth/GoogleAuthButton.tsx index dd85acdc12292..e10e2d51a128a 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/auth/GoogleAuthButton.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/auth/GoogleAuthButton.tsx @@ -17,7 +17,6 @@ const StyledButton = styled.button` line-height: 15px; outline: none; padding: 0 10px 0 0; - pointer-events: ${(props) => (props.wasActive && !props.clickable ? "none" : "all")}; text-align: center; text-decoration: none; width: ${(props) => (props.full ? "100%" : "auto")}; diff --git a/airbyte-webapp/src/views/Connector/RequestConnectorModal/RequestConnectorModal.tsx b/airbyte-webapp/src/views/Connector/RequestConnectorModal/RequestConnectorModal.tsx index ce41bad367939..bce087e17bbc2 100644 --- a/airbyte-webapp/src/views/Connector/RequestConnectorModal/RequestConnectorModal.tsx +++ b/airbyte-webapp/src/views/Connector/RequestConnectorModal/RequestConnectorModal.tsx @@ -167,7 +167,6 @@ const RequestConnectorModal: React.FC = ({ className={styles.requestButton} // type="submit" onClick={handleSubmit} - wasActive={hasFeedback} > {hasFeedback ? : } From 1b52c30ea58d979eb120c3f50ce6d437044b0f5c Mon Sep 17 00:00:00 2001 From: Cole Snodgrass Date: Fri, 20 Jan 2023 08:53:01 -0800 Subject: [PATCH 007/195] remove dependency declared twice (#21628) * remove dependency declared twice * remove dependency declared twice --- .../bases/standard-destination-test/build.gradle | 1 - .../bases/standard-source-test/build.gradle | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/airbyte-integrations/bases/standard-destination-test/build.gradle b/airbyte-integrations/bases/standard-destination-test/build.gradle index bb98faae7b653..fc0f369fdbbf6 100644 --- a/airbyte-integrations/bases/standard-destination-test/build.gradle +++ b/airbyte-integrations/bases/standard-destination-test/build.gradle @@ -9,7 +9,6 @@ dependencies { implementation project(':airbyte-json-validation') implementation project(':airbyte-integrations:bases:base-java') implementation project(':airbyte-protocol:protocol-models') - implementation project(':airbyte-commons-worker') implementation(enforcedPlatform('org.junit:junit-bom:5.8.2')) implementation 'org.junit.jupiter:junit-jupiter-api' diff --git a/airbyte-integrations/bases/standard-source-test/build.gradle b/airbyte-integrations/bases/standard-source-test/build.gradle index a006bbc02d765..ba8fde811deb9 100644 --- a/airbyte-integrations/bases/standard-source-test/build.gradle +++ b/airbyte-integrations/bases/standard-source-test/build.gradle @@ -17,7 +17,6 @@ dependencies { implementation project(':airbyte-config:config-models') implementation project(':airbyte-config:config-persistence') implementation project(':airbyte-protocol:protocol-models') - implementation project(':airbyte-commons-worker') implementation 'org.mockito:mockito-core:4.6.1' implementation 'net.sourceforge.argparse4j:argparse4j:0.8.1' @@ -30,7 +29,7 @@ dependencies { def getFullPath(String className) { def matchingFiles = project.fileTree("src/main/java") - .filter { file -> file.getName().equals("${className}.java".toString())}.asCollection() + .filter { file -> file.getName().equals("${className}.java".toString()) }.asCollection() if (matchingFiles.size() == 0) { throw new IllegalArgumentException("Ambiguous class name ${className}: no file found.") } @@ -51,14 +50,15 @@ task generateSourceTestDocs(type: Javadoc) { destinationDir = javadocOutputDir doLast { - def className = "SourceAcceptanceTest" // this can be made into a list once we have multiple standard tests, and can also be used for destinations + def className = "SourceAcceptanceTest" + // this can be made into a list once we have multiple standard tests, and can also be used for destinations def pathInPackage = getFullPath(className) def stdSrcTest = project.file("${javadocOutputDir}/${pathInPackage}.html").readLines().join("\n") def methodList = Jsoup.parse(stdSrcTest).body().select("section.methodDetails>ul>li>section") def md = "" - for (methodInfo in methodList){ + for (methodInfo in methodList) { def annotations = methodInfo.select(".memberSignature>.annotations").text() - if (!annotations.contains("@Test")){ + if (!annotations.contains("@Test")) { continue } def methodName = methodInfo.selectFirst("div>span.memberName").text() @@ -73,7 +73,7 @@ task generateSourceTestDocs(type: Javadoc) { outputDoc.append md } - outputs.upToDateWhen {false} + outputs.upToDateWhen { false } } project.build.dependsOn(generateSourceTestDocs) From e67bb115ba645738bf5e3557f9cb81d1360351b9 Mon Sep 17 00:00:00 2001 From: Topher Lubaway Date: Fri, 20 Jan 2023 13:11:09 -0600 Subject: [PATCH 008/195] Changes AC test check to check exited ps (#21672) some docker compose changes no longer show exited processes. this broke out test this change should fix master tested in a runner that failed --- tools/bin/acceptance_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bin/acceptance_test.sh b/tools/bin/acceptance_test.sh index 628ab3e245255..95ab614f356a5 100755 --- a/tools/bin/acceptance_test.sh +++ b/tools/bin/acceptance_test.sh @@ -13,7 +13,7 @@ get_epoch_time() { } check_success() { - docker compose ps | grep "^$1" | grep -ie 'exit 0' -ie 'exited (0)' >/dev/null || (echo "$1 didn't run successfully"; exit 1) + docker compose ps --all | grep "^$1" | grep -ie 'exit 0' -ie 'exited (0)' >/dev/null || (echo "$1 didn't run successfully"; exit 1) } ## From 0562b9672c4094a8de22ac1174199eca6c8b46b0 Mon Sep 17 00:00:00 2001 From: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:06:46 -0500 Subject: [PATCH 009/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=8E=A8=20Fix=20str?= =?UTF-8?q?eam=20table=20heading=20design=20issues=20(#21554)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use ConnectorHeaderGroupIcon in new streams table header, align checkbox with icon * Make info icon 11px to match design --- .../next/CatalogTreeTableRow.module.scss | 2 +- .../next/StreamConnectionHeader.module.scss | 6 +--- .../next/StreamConnectionHeader.tsx | 11 ++---- .../CreateConnectionForm.test.tsx.snap | 36 +++++++++---------- .../src/components/icons/InfoIcon.tsx | 2 +- .../ConnectionReplicationPage.test.tsx.snap | 32 ++++++++--------- 6 files changed, 40 insertions(+), 49 deletions(-) diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.module.scss index 328c3911b03e5..3321f25733af9 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableRow.module.scss @@ -40,7 +40,7 @@ } %streamRowCheckboxCell, .streamRowCheckboxCell { - max-width: 43px; + max-width: 53px; text-align: center; font-size: 10px; line-height: 13px; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.module.scss index 51a42dc86c0b6..9187a28778ef7 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.module.scss @@ -35,6 +35,7 @@ $icon-size: 15px; .destinationSection { display: flex; flex: 1 1 120px; + align-items: center; } .destination { @@ -42,11 +43,6 @@ $icon-size: 15px; flex: 2 1 217px; } -.icon { - width: $icon-size; - height: $icon-size; -} - .arrowContainer { flex: 1 0 20px; } diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.tsx index dd3070f6a5678..20efe70b4eeb2 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamConnectionHeader.tsx @@ -1,16 +1,13 @@ import classnames from "classnames"; -import { FormattedMessage } from "react-intl"; import { ArrowRightIcon } from "components/icons/ArrowRightIcon"; import { Heading } from "components/ui/Heading"; import { useNewTableDesignExperiment } from "hooks/connection/useNewTableDesignExperiment"; import { useConnectionFormService } from "hooks/services/ConnectionForm/ConnectionFormService"; -import { getIcon } from "utils/imageUtils"; import styles from "./StreamConnectionHeader.module.scss"; - -export const renderIcon = (icon?: string): JSX.Element =>
{getIcon(icon)}
; +import { ConnectorHeaderGroupIcon } from "./StreamDetailsPanel/StreamFieldsTable/ConnectorHeaderGroupIcon"; export const StreamConnectionHeader: React.FC = () => { const { @@ -22,9 +19,8 @@ export const StreamConnectionHeader: React.FC = () => { return (
- {renderIcon(source.icon)}{" "} - +
@@ -32,9 +28,8 @@ export const StreamConnectionHeader: React.FC = () => {
- {renderIcon(destination.icon)}{" "} - +
diff --git a/airbyte-webapp/src/components/connection/CreateConnectionForm/__snapshots__/CreateConnectionForm.test.tsx.snap b/airbyte-webapp/src/components/connection/CreateConnectionForm/__snapshots__/CreateConnectionForm.test.tsx.snap index b3ab2efbb873a..a590788738923 100644 --- a/airbyte-webapp/src/components/connection/CreateConnectionForm/__snapshots__/CreateConnectionForm.test.tsx.snap +++ b/airbyte-webapp/src/components/connection/CreateConnectionForm/__snapshots__/CreateConnectionForm.test.tsx.snap @@ -44,9 +44,9 @@ exports[`CreateConnectionForm should render 1`] = ` > ( - + Date: Fri, 20 Jan 2023 14:19:53 -0800 Subject: [PATCH 010/195] Allow all origin in cors (#21668) * Allow all origin in cors * Update cors filter --- airbyte-server/src/main/resources/application.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/airbyte-server/src/main/resources/application.yml b/airbyte-server/src/main/resources/application.yml index 3c4ebd3a862f9..53e670c2c523a 100644 --- a/airbyte-server/src/main/resources/application.yml +++ b/airbyte-server/src/main/resources/application.yml @@ -19,6 +19,10 @@ micronaut: port: 8001 cors: enabled: true + configurations: + web: + allowedOrigins: + - ^.*$ airbyte: cloud: storage: From 5257f69e043f02030c3564ed70f945a6df9e776b Mon Sep 17 00:00:00 2001 From: Michael Siega <109092231+mfsiega-airbyte@users.noreply.github.com> Date: Fri, 20 Jan 2023 23:26:31 +0100 Subject: [PATCH 011/195] fix column selection handling for syncs without cursors (#21647) --- .../handlers/helpers/CatalogConverter.java | 13 ++- .../handlers/ConnectionsHandlerTest.java | 105 +++++++++--------- 2 files changed, 62 insertions(+), 56 deletions(-) diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java index fb0bcd3dc7618..8864c1b8130fb 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java @@ -69,16 +69,21 @@ private static io.airbyte.protocol.models.AirbyteStream toProtocol(final Airbyte } } // Only include the selected fields. + // NOTE: we verified above that each selected field has at least one element in the field path. final Set selectedFieldNames = config.getSelectedFields().stream().map((field) -> field.getFieldPath().get(0)).collect(Collectors.toSet()); // TODO(mfsiega-airbyte): we only check the top level of the cursor/primary key fields because we // don't support filtering nested fields yet. - if (!selectedFieldNames.contains(config.getCursorField().get(0)) && config.getSyncMode().equals(SyncMode.INCREMENTAL)) { + if (config.getSyncMode().equals(SyncMode.INCREMENTAL) // INCREMENTAL sync mode, AND + && !config.getCursorField().isEmpty() // There is a cursor configured, AND + && !selectedFieldNames.contains(config.getCursorField().get(0))) { // The cursor isn't in the selected fields. throw new JsonValidationException("Cursor field cannot be de-selected in INCREMENTAL syncs"); } - for (final List primaryKeyComponent : config.getPrimaryKey()) { - if (!selectedFieldNames.contains(primaryKeyComponent.get(0)) && config.getDestinationSyncMode().equals(DestinationSyncMode.APPEND_DEDUP)) { - throw new JsonValidationException("Primary key field cannot be de-selected in DEDUP mode"); + if (config.getDestinationSyncMode().equals(DestinationSyncMode.APPEND_DEDUP)) { + for (final List primaryKeyComponent : config.getPrimaryKey()) { + if (!selectedFieldNames.contains(primaryKeyComponent.get(0))) { + throw new JsonValidationException("Primary key field cannot be de-selected in DEDUP mode"); + } } } for (final String selectedFieldName : selectedFieldNames) { diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionsHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionsHandlerTest.java index 8563232078599..9a2364a8cf454 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionsHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionsHandlerTest.java @@ -221,20 +221,8 @@ void setUp() throws JsonValidationException, ConfigNotFoundException, IOExceptio @Nested class CreateConnection { - @Test - void testCreateConnection() throws JsonValidationException, ConfigNotFoundException, IOException { - - final AirbyteCatalog catalog = ConnectionHelpers.generateBasicApiCatalog(); - - // set a defaultGeography on the workspace as EU, but expect connection to be - // created AUTO because the ConnectionCreate geography takes precedence over the workspace - // defaultGeography. - final StandardWorkspace workspace = new StandardWorkspace() - .withWorkspaceId(workspaceId) - .withDefaultGeography(Geography.EU); - when(configRepository.getStandardWorkspaceNoSecrets(workspaceId, true)).thenReturn(workspace); - - final ConnectionCreate connectionCreate = new ConnectionCreate() + private ConnectionCreate buildConnectionCreateRequest(final StandardSync standardSync, final AirbyteCatalog catalog) { + return new ConnectionCreate() .sourceId(standardSync.getSourceId()) .destinationId(standardSync.getDestinationId()) .operationIds(standardSync.getOperationIds()) @@ -252,6 +240,22 @@ void testCreateConnection() throws JsonValidationException, ConfigNotFoundExcept .memoryLimit(standardSync.getResourceRequirements().getMemoryLimit())) .sourceCatalogId(standardSync.getSourceCatalogId()) .geography(ApiPojoConverters.toApiGeography(standardSync.getGeography())); + } + + @Test + void testCreateConnection() throws JsonValidationException, ConfigNotFoundException, IOException { + + final AirbyteCatalog catalog = ConnectionHelpers.generateBasicApiCatalog(); + + // set a defaultGeography on the workspace as EU, but expect connection to be + // created AUTO because the ConnectionCreate geography takes precedence over the workspace + // defaultGeography. + final StandardWorkspace workspace = new StandardWorkspace() + .withWorkspaceId(workspaceId) + .withDefaultGeography(Geography.EU); + when(configRepository.getStandardWorkspaceNoSecrets(workspaceId, true)).thenReturn(workspace); + + final ConnectionCreate connectionCreate = buildConnectionCreateRequest(standardSync, catalog); final ConnectionRead actualConnectionRead = connectionsHandler.createConnection(connectionCreate); @@ -277,23 +281,7 @@ void testCreateConnectionUsesDefaultGeographyFromWorkspace() throws JsonValidati final AirbyteCatalog catalog = ConnectionHelpers.generateBasicApiCatalog(); // don't set a geography on the ConnectionCreate to force inheritance from workspace default - final ConnectionCreate connectionCreate = new ConnectionCreate() - .sourceId(standardSync.getSourceId()) - .destinationId(standardSync.getDestinationId()) - .operationIds(standardSync.getOperationIds()) - .name(PRESTO_TO_HUDI) - .namespaceDefinition(NamespaceDefinitionType.SOURCE) - .namespaceFormat(null) - .prefix(PRESTO_TO_HUDI_PREFIX) - .status(ConnectionStatus.ACTIVE) - .schedule(ConnectionHelpers.generateBasicConnectionSchedule()) - .syncCatalog(catalog) - .resourceRequirements(new io.airbyte.api.model.generated.ResourceRequirements() - .cpuRequest(standardSync.getResourceRequirements().getCpuRequest()) - .cpuLimit(standardSync.getResourceRequirements().getCpuLimit()) - .memoryRequest(standardSync.getResourceRequirements().getMemoryRequest()) - .memoryLimit(standardSync.getResourceRequirements().getMemoryLimit())) - .sourceCatalogId(standardSync.getSourceCatalogId()); + final ConnectionCreate connectionCreate = buildConnectionCreateRequest(standardSync, catalog).geography(null); // set the workspace default to EU final StandardWorkspace workspace = new StandardWorkspace() @@ -319,29 +307,12 @@ void testCreateConnectionWithSelectedFields() throws IOException, JsonValidation .withDefaultGeography(Geography.AUTO); when(configRepository.getStandardWorkspaceNoSecrets(workspaceId, true)).thenReturn(workspace); - final AirbyteCatalog catalog = ConnectionHelpers.generateApiCatalogWithTwoFields(); + final AirbyteCatalog catalogWithSelectedFields = ConnectionHelpers.generateApiCatalogWithTwoFields(); // Only select one of the two fields. - catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true) + catalogWithSelectedFields.getStreams().get(0).getConfig().fieldSelectionEnabled(true) .selectedFields(List.of(new SelectedFieldInfo().addFieldPathItem(FIELD_NAME))); - final ConnectionCreate connectionCreate = new ConnectionCreate() - .sourceId(standardSync.getSourceId()) - .destinationId(standardSync.getDestinationId()) - .operationIds(standardSync.getOperationIds()) - .name(PRESTO_TO_HUDI) - .namespaceDefinition(NamespaceDefinitionType.SOURCE) - .namespaceFormat(null) - .prefix(PRESTO_TO_HUDI_PREFIX) - .status(ConnectionStatus.ACTIVE) - .schedule(ConnectionHelpers.generateBasicConnectionSchedule()) - .syncCatalog(catalog) - .resourceRequirements(new io.airbyte.api.model.generated.ResourceRequirements() - .cpuRequest(standardSync.getResourceRequirements().getCpuRequest()) - .cpuLimit(standardSync.getResourceRequirements().getCpuLimit()) - .memoryRequest(standardSync.getResourceRequirements().getMemoryRequest()) - .memoryLimit(standardSync.getResourceRequirements().getMemoryLimit())) - .sourceCatalogId(standardSync.getSourceCatalogId()) - .geography(ApiPojoConverters.toApiGeography(standardSync.getGeography())); + final ConnectionCreate connectionCreate = buildConnectionCreateRequest(standardSync, catalogWithSelectedFields); final ConnectionRead actualConnectionRead = connectionsHandler.createConnection(connectionCreate); @@ -354,6 +325,35 @@ void testCreateConnectionWithSelectedFields() throws IOException, JsonValidation verify(configRepository).writeStandardSync(standardSync); } + @Test + void testCreateFullRefreshConnectionWithSelectedFields() throws IOException, JsonValidationException, ConfigNotFoundException { + final StandardWorkspace workspace = new StandardWorkspace() + .withWorkspaceId(workspaceId) + .withDefaultGeography(Geography.AUTO); + when(configRepository.getStandardWorkspaceNoSecrets(workspaceId, true)).thenReturn(workspace); + + final AirbyteCatalog fullRefreshCatalogWithSelectedFields = ConnectionHelpers.generateApiCatalogWithTwoFields(); + fullRefreshCatalogWithSelectedFields.getStreams().get(0).getConfig() + .fieldSelectionEnabled(true) + .selectedFields(List.of(new SelectedFieldInfo().addFieldPathItem(FIELD_NAME))) + .cursorField(null) + .syncMode(SyncMode.FULL_REFRESH); + + final ConnectionCreate connectionCreate = buildConnectionCreateRequest(standardSync, fullRefreshCatalogWithSelectedFields); + + final ConnectionRead actualConnectionRead = connectionsHandler.createConnection(connectionCreate); + + final ConnectionRead expectedConnectionRead = ConnectionHelpers.generateExpectedConnectionRead(standardSync); + + assertEquals(expectedConnectionRead, actualConnectionRead); + + standardSync + .withFieldSelectionData(new FieldSelectionData().withAdditionalProperty("null/users-data0", true)) + .getCatalog().getStreams().get(0).withSyncMode(io.airbyte.protocol.models.SyncMode.FULL_REFRESH).withCursorField(null); + + verify(configRepository).writeStandardSync(standardSync); + } + @Test void testFieldSelectionRemoveCursorFails() throws JsonValidationException, ConfigNotFoundException, IOException { // Test that if we try to de-select a field that's being used for the cursor, the request will fail. @@ -365,7 +365,8 @@ void testFieldSelectionRemoveCursorFails() throws JsonValidationException, Confi catalogForUpdate.getStreams().get(0).getConfig() .fieldSelectionEnabled(true) .selectedFields(List.of(new SelectedFieldInfo().addFieldPathItem(FIELD_NAME))) - .cursorField(List.of(SECOND_FIELD_NAME)); + .cursorField(List.of(SECOND_FIELD_NAME)) + .syncMode(SyncMode.INCREMENTAL); final ConnectionUpdate connectionUpdate = new ConnectionUpdate() .connectionId(standardSync.getConnectionId()) From 2d65d62a65e5867c10dad166ff0144275013153c Mon Sep 17 00:00:00 2001 From: Eugene Date: Sat, 21 Jan 2023 00:37:07 +0200 Subject: [PATCH 012/195] =?UTF-8?q?=F0=9F=90=9BDestination-Snowflake:=20up?= =?UTF-8?q?dated=20check=20method=20to=20handle=20more=20possible=20s3=20a?= =?UTF-8?q?nd=20gcs=20stagings=20issues=20(#21450)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [18312] Destination-Snowflake: updated check method to handle more possible s3 and gcs stagings issues --- .../seed/destination_definitions.yaml | 2 +- .../resources/seed/destination_specs.yaml | 2 +- .../s3/csv/CsvSerializedBuffer.java | 6 ++--- .../jdbc/copy/CopyDestination.java | 2 +- .../destination-snowflake/Dockerfile | 2 +- .../SnowflakeGcsStagingDestination.java | 20 ++++++++++++---- ...SnowflakeInternalStagingSqlOperations.java | 11 +++++---- .../SnowflakeS3StagingDestination.java | 24 ++++++++++++++++++- ...flakeGcsCopyDestinationAcceptanceTest.java | 21 ++++++++++++++++ ...opyEncryptedDestinationAcceptanceTest.java | 20 ++++++++++++++++ .../SnowflakeTestSourceOperations.java | 21 ++++++++++++++++ docs/integrations/destinations/snowflake.md | 3 ++- 12 files changed, 115 insertions(+), 19 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml index 39285b789ebe5..d84582706ba2f 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml @@ -348,7 +348,7 @@ - name: Snowflake destinationDefinitionId: 424892c4-daac-4491-b35d-c6688ba547ba dockerRepository: airbyte/destination-snowflake - dockerImageTag: 0.4.42 + dockerImageTag: 0.4.43 documentationUrl: https://docs.airbyte.com/integrations/destinations/snowflake icon: snowflake.svg normalizationConfig: diff --git a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml index 859ec2b6d8abe..aa768b304061f 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml @@ -6109,7 +6109,7 @@ supported_destination_sync_modes: - "overwrite" - "append" -- dockerImage: "airbyte/destination-snowflake:0.4.42" +- dockerImage: "airbyte/destination-snowflake:0.4.43" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/snowflake" connectionSpecification: diff --git a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/csv/CsvSerializedBuffer.java b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/csv/CsvSerializedBuffer.java index 0dbb695e5b017..f16b454c745e8 100644 --- a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/csv/CsvSerializedBuffer.java +++ b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/csv/CsvSerializedBuffer.java @@ -31,9 +31,9 @@ public class CsvSerializedBuffer extends BaseSerializedBuffer { private CSVPrinter csvPrinter; private CSVFormat csvFormat; - protected CsvSerializedBuffer(final BufferStorage bufferStorage, - final CsvSheetGenerator csvSheetGenerator, - final boolean compression) + public CsvSerializedBuffer(final BufferStorage bufferStorage, + final CsvSheetGenerator csvSheetGenerator, + final boolean compression) throws Exception { super(bufferStorage); this.csvSheetGenerator = csvSheetGenerator; diff --git a/airbyte-integrations/connectors/destination-jdbc/src/main/java/io/airbyte/integrations/destination/jdbc/copy/CopyDestination.java b/airbyte-integrations/connectors/destination-jdbc/src/main/java/io/airbyte/integrations/destination/jdbc/copy/CopyDestination.java index 51ba727276484..85d5c733bd675 100644 --- a/airbyte-integrations/connectors/destination-jdbc/src/main/java/io/airbyte/integrations/destination/jdbc/copy/CopyDestination.java +++ b/airbyte-integrations/connectors/destination-jdbc/src/main/java/io/airbyte/integrations/destination/jdbc/copy/CopyDestination.java @@ -97,7 +97,7 @@ protected void performCreateInsertTestOnDestination(final String outputSchema, final JdbcDatabase database, final NamingConventionTransformer nameTransformer) throws Exception { - AbstractJdbcDestination.attemptSQLCreateAndDropTableOperations(outputSchema, database, nameTransformer, getSqlOperations()); + AbstractJdbcDestination.attemptTableOperations(outputSchema, database, nameTransformer, getSqlOperations(), true); } } diff --git a/airbyte-integrations/connectors/destination-snowflake/Dockerfile b/airbyte-integrations/connectors/destination-snowflake/Dockerfile index fca0e9654d410..4b8f627b28ea2 100644 --- a/airbyte-integrations/connectors/destination-snowflake/Dockerfile +++ b/airbyte-integrations/connectors/destination-snowflake/Dockerfile @@ -20,5 +20,5 @@ RUN tar xf ${APPLICATION}.tar --strip-components=1 ENV ENABLE_SENTRY true -LABEL io.airbyte.version=0.4.42 +LABEL io.airbyte.version=0.4.43 LABEL io.airbyte.name=airbyte/destination-snowflake diff --git a/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeGcsStagingDestination.java b/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeGcsStagingDestination.java index d451dab54d52d..ac3fdfc832d74 100644 --- a/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeGcsStagingDestination.java +++ b/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeGcsStagingDestination.java @@ -5,9 +5,11 @@ package io.airbyte.integrations.destination.snowflake; import static io.airbyte.integrations.destination.snowflake.SnowflakeS3StagingDestination.isPurgeStagingData; +import static java.nio.charset.StandardCharsets.UTF_8; import com.fasterxml.jackson.databind.JsonNode; import com.google.auth.oauth2.GoogleCredentials; +import com.google.cloud.WriteChannel; import com.google.cloud.storage.BlobId; import com.google.cloud.storage.BlobInfo; import com.google.cloud.storage.Storage; @@ -29,6 +31,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Map; @@ -83,12 +86,19 @@ public AirbyteConnectionStatus check(final JsonNode config) { } private static void attemptWriteAndDeleteGcsObject(final GcsConfig gcsConfig, final String outputTableName) throws IOException { - final var storage = getStorageClient(gcsConfig); - final var blobId = BlobId.of(gcsConfig.getBucketName(), "check-content/" + outputTableName); - final var blobInfo = BlobInfo.newBuilder(blobId).build(); + final Storage storageClient = getStorageClient(gcsConfig); + final BlobId blobId = BlobId.of(gcsConfig.getBucketName(), "check-content/" + outputTableName); + final BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build(); - storage.create(blobInfo, "".getBytes(StandardCharsets.UTF_8)); - storage.delete(blobId); + storageClient.create(blobInfo); + + try (WriteChannel writer = storageClient.writer(blobInfo)) { + // Try to write a dummy message to make sure user has all required permissions + final byte[] content = "Hello, World!".getBytes(UTF_8); + writer.write(ByteBuffer.wrap(content, 0, content.length)); + } finally { + storageClient.delete(blobId); + } } public static Storage getStorageClient(final GcsConfig gcsConfig) throws IOException { diff --git a/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeInternalStagingSqlOperations.java b/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeInternalStagingSqlOperations.java index e1765ecbd5bfc..2f917fe7d4746 100644 --- a/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeInternalStagingSqlOperations.java +++ b/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeInternalStagingSqlOperations.java @@ -134,7 +134,8 @@ public void createStageIfNotExists(final JdbcDatabase database, final String sta } /** - * Creates a SQL query to create a staging folder. This query will create a staging folder if one previously did not exist + * Creates a SQL query to create a staging folder. This query will create a staging folder if one + * previously did not exist * * @param stageName name of the staging folder * @return SQL query string @@ -157,8 +158,8 @@ public void copyIntoTmpTableFromStage(final JdbcDatabase database, } /** - * Creates a SQL query to bulk copy data into fully qualified destination table - * See https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html for more context + * Creates a SQL query to bulk copy data into fully qualified destination table See + * https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html for more context * * @param stageName name of staging folder * @param stagingPath path of staging folder to data files @@ -200,8 +201,8 @@ public void cleanUpStage(final JdbcDatabase database, final String stageName, fi } /** - * Creates a SQL query used to remove staging files that were just staged - * See https://docs.snowflake.com/en/sql-reference/sql/remove.html for more context + * Creates a SQL query used to remove staging files that were just staged See + * https://docs.snowflake.com/en/sql-reference/sql/remove.html for more context * * @param stageName name of staging folder * @return SQL query string diff --git a/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3StagingDestination.java b/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3StagingDestination.java index ead94c94ba9eb..bf1f5c220c3c1 100644 --- a/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3StagingDestination.java +++ b/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3StagingDestination.java @@ -13,15 +13,18 @@ import io.airbyte.integrations.destination.NamingConventionTransformer; import io.airbyte.integrations.destination.jdbc.AbstractJdbcDestination; import io.airbyte.integrations.destination.record_buffer.FileBuffer; +import io.airbyte.integrations.destination.record_buffer.InMemoryBuffer; import io.airbyte.integrations.destination.s3.AesCbcEnvelopeEncryption; import io.airbyte.integrations.destination.s3.AesCbcEnvelopeEncryption.KeyType; import io.airbyte.integrations.destination.s3.EncryptionConfig; import io.airbyte.integrations.destination.s3.S3DestinationConfig; import io.airbyte.integrations.destination.s3.csv.CsvSerializedBuffer; +import io.airbyte.integrations.destination.s3.csv.StagingDatabaseCsvSheetGenerator; import io.airbyte.integrations.destination.staging.StagingConsumerFactory; import io.airbyte.protocol.models.v0.AirbyteConnectionStatus; import io.airbyte.protocol.models.v0.AirbyteConnectionStatus.Status; import io.airbyte.protocol.models.v0.AirbyteMessage; +import io.airbyte.protocol.models.v0.AirbyteRecordMessage; import io.airbyte.protocol.models.v0.ConfiguredAirbyteCatalog; import java.util.Collections; import java.util.Map; @@ -90,7 +93,26 @@ private static void attemptStageOperations(final String outputSchema, final String outputTableName = namingResolver.getIdentifier("_airbyte_connection_test_" + UUID.randomUUID()); final String stageName = sqlOperations.getStageName(outputSchema, outputTableName); sqlOperations.createStageIfNotExists(database, stageName); - sqlOperations.dropStageIfExists(database, stageName); + + // try to make test write to make sure we have required role + try { + final CsvSerializedBuffer csvSerializedBuffer = new CsvSerializedBuffer( + new InMemoryBuffer(".csv"), + new StagingDatabaseCsvSheetGenerator(), + true); + + // create a dummy stream\records that will bed used to test uploading + csvSerializedBuffer.accept(new AirbyteRecordMessage() + .withData(Jsons.jsonNode(Map.of("testKey", "testValue"))) + .withEmittedAt(System.currentTimeMillis())); + csvSerializedBuffer.flush(); + + sqlOperations.uploadRecordsToStage(database, csvSerializedBuffer, outputSchema, stageName, + stageName.endsWith("/") ? stageName : stageName + "/"); + } finally { + // drop created tmp stage + sqlOperations.dropStageIfExists(database, stageName); + } } @Override diff --git a/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeGcsCopyDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeGcsCopyDestinationAcceptanceTest.java index 1e8e5863d5db1..eb85788f6c642 100644 --- a/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeGcsCopyDestinationAcceptanceTest.java +++ b/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeGcsCopyDestinationAcceptanceTest.java @@ -4,14 +4,23 @@ package io.airbyte.integrations.destination.snowflake; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + import com.fasterxml.jackson.databind.JsonNode; import com.google.common.base.Preconditions; import io.airbyte.commons.io.IOs; import io.airbyte.commons.json.Jsons; +import io.airbyte.config.StandardCheckConnectionOutput; +import io.airbyte.config.StandardCheckConnectionOutput.Status; import java.nio.file.Path; +import org.junit.jupiter.api.Test; public class SnowflakeGcsCopyDestinationAcceptanceTest extends SnowflakeInsertDestinationAcceptanceTest { + private static final String NO_GCS_PRIVILEGES_ERR_MSG = + "Permission 'storage.objects.create' denied on resource (or it may not exist)."; + @Override public JsonNode getStaticConfig() { final JsonNode copyConfig = Jsons.deserialize(IOs.readFile(Path.of("secrets/copy_gcs_config.json"))); @@ -20,4 +29,16 @@ public JsonNode getStaticConfig() { return copyConfig; } + @Test + public void testCheckWithNoProperGcsPermissionConnection() throws Exception { + // Config to user (creds) that has no permission to schema + final JsonNode config = Jsons.deserialize(IOs.readFile( + Path.of("secrets/copy_insufficient_gcs_roles_config.json"))); + + StandardCheckConnectionOutput standardCheckConnectionOutput = runCheck(config); + + assertEquals(Status.FAILED, standardCheckConnectionOutput.getStatus()); + assertThat(standardCheckConnectionOutput.getMessage()).contains(NO_GCS_PRIVILEGES_ERR_MSG); + } + } diff --git a/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3CopyEncryptedDestinationAcceptanceTest.java b/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3CopyEncryptedDestinationAcceptanceTest.java index 2fba654e1c02b..61bcb7b9f71ea 100644 --- a/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3CopyEncryptedDestinationAcceptanceTest.java +++ b/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3CopyEncryptedDestinationAcceptanceTest.java @@ -4,14 +4,22 @@ package io.airbyte.integrations.destination.snowflake; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + import com.fasterxml.jackson.databind.JsonNode; import com.google.common.base.Preconditions; import io.airbyte.commons.io.IOs; import io.airbyte.commons.json.Jsons; +import io.airbyte.config.StandardCheckConnectionOutput; +import io.airbyte.config.StandardCheckConnectionOutput.Status; import java.nio.file.Path; +import org.junit.jupiter.api.Test; public class SnowflakeS3CopyEncryptedDestinationAcceptanceTest extends SnowflakeInsertDestinationAcceptanceTest { + private static final String NO_S3_PRIVILEGES_ERR_MSG = "Could not connect with provided configuration."; + @Override public JsonNode getStaticConfig() { final JsonNode copyConfig = Jsons.deserialize(IOs.readFile(Path.of("secrets/copy_s3_encrypted_config.json"))); @@ -20,4 +28,16 @@ public JsonNode getStaticConfig() { return copyConfig; } + @Test + public void testCheckWithNoProperS3PermissionConnection() throws Exception { + // Config to user (creds) that has no permission to schema + final JsonNode config = Jsons.deserialize(IOs.readFile( + Path.of("secrets/copy_s3_wrong_location_config.json"))); + + StandardCheckConnectionOutput standardCheckConnectionOutput = runCheck(config); + + assertEquals(Status.FAILED, standardCheckConnectionOutput.getStatus()); + assertThat(standardCheckConnectionOutput.getMessage()).contains(NO_S3_PRIVILEGES_ERR_MSG); + } + } diff --git a/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeTestSourceOperations.java b/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeTestSourceOperations.java index f2958524dcdfc..46ee859f39091 100644 --- a/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeTestSourceOperations.java +++ b/airbyte-integrations/connectors/destination-snowflake/src/test-integration/java/io/airbyte/integrations/destination/snowflake/SnowflakeTestSourceOperations.java @@ -4,6 +4,9 @@ package io.airbyte.integrations.destination.snowflake; +import static io.airbyte.db.jdbc.DateTimeConverter.putJavaSQLDate; +import static io.airbyte.db.jdbc.DateTimeConverter.putJavaSQLTime; + import com.fasterxml.jackson.databind.node.ObjectNode; import io.airbyte.db.jdbc.JdbcSourceOperations; import io.airbyte.integrations.standardtest.destination.DestinationAcceptanceTestUtils; @@ -17,4 +20,22 @@ protected void putString(ObjectNode node, String columnName, ResultSet resultSet DestinationAcceptanceTestUtils.putStringIntoJson(resultSet.getString(index), columnName, node); } + @Override + protected void putDate(final ObjectNode node, + final String columnName, + final ResultSet resultSet, + final int index) + throws SQLException { + putJavaSQLDate(node, columnName, resultSet, index); + } + + @Override + protected void putTime(final ObjectNode node, + final String columnName, + final ResultSet resultSet, + final int index) + throws SQLException { + putJavaSQLTime(node, columnName, resultSet, index); + } + } diff --git a/docs/integrations/destinations/snowflake.md b/docs/integrations/destinations/snowflake.md index 9a690157e3865..b9c6ba290ce20 100644 --- a/docs/integrations/destinations/snowflake.md +++ b/docs/integrations/destinations/snowflake.md @@ -277,7 +277,8 @@ Now that you have set up the Snowflake destination connector, check out the foll | Version | Date | Pull Request | Subject | |:--------|:-----------|:-----------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------| -| 0.4.41 | 2023-01-12 | [\#21342](https://github.com/airbytehq/airbyte/pull/21342) | Better handling for conflicting destination streams | +| 0.4.43 | 2023-01-20 | [\#21450](https://github.com/airbytehq/airbyte/pull/21450) | Updated Check methods to handle more possible s3 and gcs stagings issues | +| 0.4.42 | 2023-01-12 | [\#21342](https://github.com/airbytehq/airbyte/pull/21342) | Better handling for conflicting destination streams | | 0.4.41 | 2022-12-16 | [\#20566](https://github.com/airbytehq/airbyte/pull/20566) | Improve spec to adhere to standards | | 0.4.40 | 2022-11-11 | [\#19302](https://github.com/airbytehq/airbyte/pull/19302) | Set jdbc application env variable depends on env - airbyte_oss or airbyte_cloud | | 0.4.39 | 2022-11-09 | [\#18970](https://github.com/airbytehq/airbyte/pull/18970) | Updated "check" connection method to handle more errors | From ff3726eb59daec3a3a245d13186bda6cc99ddeae Mon Sep 17 00:00:00 2001 From: Joe Bell Date: Fri, 20 Jan 2023 15:09:20 -0800 Subject: [PATCH 013/195] Add Docker Debugging Fixture (#21357) * docker debugging options * refactor image shortening method * remove testing annotation * comment updates * debugging docker docs --- .../workers/process/DockerProcessFactory.java | 29 ++++ .../workers/process/ProcessFactory.java | 21 ++- docker-compose.debug.yaml | 10 ++ .../connector-development/debugging-docker.md | 137 ++++++++++++++++++ 4 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 docs/connector-development/debugging-docker.md diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java index 5ed26798030b7..ea4092d87f524 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java @@ -20,9 +20,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.TimeUnit; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -120,6 +123,7 @@ public Process create(final String jobType, LOGGER.info("Creating docker container = {} with resources {}", containerName, resourceRequirements); cmd.add("--name"); cmd.add(containerName); + cmd.addAll(localDebuggingOptions(containerName)); if (networkName != null) { cmd.add("--network"); @@ -169,6 +173,31 @@ public Process create(final String jobType, } } + /** + * !! ONLY FOR DEBUGGING, SHOULD NOT BE USED IN PRODUCTION !! If you set the DEBUG_CONTAINER_IMAGE + * environment variable, and it matches the image name of a spawned container, this method will add + * the necessary params to connect a debugger. For example, to enable this for + * `destination-bigquery` start the services locally with: ``` VERSION="dev" + * DEBUG_CONTAINER_IMAGE="destination-bigquery" docker compose -f docker-compose.yaml -f + * docker-compose.debug.yaml up ``` Additionally you may have to update the image version of your + * target image to 'dev' in the UI of your local airbyte platform. See the + * `docker-compose.debug.yaml` file for more context. + * + * @param containerName the name of the container which could be debugged. + * @return A list with debugging arguments or an empty list + */ + static List localDebuggingOptions(final String containerName) { + final boolean shouldAddDebuggerOptions = + Optional.ofNullable(System.getenv("DEBUG_CONTAINER_IMAGE")).filter(StringUtils::isNotEmpty) + .map(ProcessFactory.extractShortImageName(containerName)::equals).orElse(false) + && Optional.ofNullable(System.getenv("DEBUG_CONTAINER_JAVA_OPTS")).isPresent(); + if (shouldAddDebuggerOptions) { + return List.of("-e", "JAVA_TOOL_OPTIONS=" + System.getenv("DEBUG_CONTAINER_JAVA_OPTS"), "-p5005:5005"); + } else { + return Collections.emptyList(); + } + } + private Path rebasePath(final Path jobRoot) { final Path relativePath = workspaceRoot.relativize(jobRoot); return DATA_MOUNT_DESTINATION.resolve(relativePath); diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java index d9cf45084a068..e57ebf6fbf28e 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java @@ -64,11 +64,8 @@ Process create(String jobType, * can be used by the factories implementing this interface for easier operations. */ static String createProcessName(final String fullImagePath, final String jobType, final String jobId, final int attempt, final int lenLimit) { - final var noVersion = fullImagePath.split(VERSION_DELIMITER)[0]; - - final var nameParts = noVersion.split(DOCKER_DELIMITER); - var imageName = nameParts[nameParts.length - 1]; + var imageName = extractShortImageName(fullImagePath); final var randSuffix = RandomStringUtils.randomAlphabetic(5).toLowerCase(); final String suffix = jobType + "-" + jobId + "-" + attempt + "-" + randSuffix; @@ -90,4 +87,20 @@ static String createProcessName(final String fullImagePath, final String jobType return processName.substring(m.start()); } + /** + * Docker image names are by convention separated by slashes. The last portion is the image's name. + * This is followed by a colon and a version number. e.g. airbyte/scheduler:v1 or + * gcr.io/my-project/my-project:v2. + * + * @param fullImagePath the image name with repository and version ex + * gcr.io/my-project/image-name:v2 + * @return the image name without the repo and version, ex. image-name + */ + static String extractShortImageName(final String fullImagePath) { + final var noVersion = fullImagePath.split(VERSION_DELIMITER)[0]; + + final var nameParts = noVersion.split(DOCKER_DELIMITER); + return nameParts[nameParts.length - 1]; + } + } diff --git a/docker-compose.debug.yaml b/docker-compose.debug.yaml index a93fa0b4b2861..3c890301e2edf 100644 --- a/docker-compose.debug.yaml +++ b/docker-compose.debug.yaml @@ -27,3 +27,13 @@ services: networks: - airbyte_internal - airbyte_public + worker: + environment: + - DEBUG_CONTAINER_IMAGE=${DEBUG_CONTAINER_IMAGE} + - DEBUG_CONTAINER_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 + server: + # You will need to create a remote JVM debugging Run Configuration + # If you're on a Mac you will need to obtain the IP address of the container + # The value of DEBUG_SERVER_JAVA_OPTIONS should be the same as DEBUG_CONTAINER_JAVA_OPTS above + environment: + - JAVA_TOOL_OPTIONS=${DEBUG_SERVER_JAVA_OPTIONS} diff --git a/docs/connector-development/debugging-docker.md b/docs/connector-development/debugging-docker.md new file mode 100644 index 0000000000000..8808ef8e9ad0c --- /dev/null +++ b/docs/connector-development/debugging-docker.md @@ -0,0 +1,137 @@ +# Debugging Docker Containers +This guide will cover debugging **JVM docker containers** either started via Docker Compose or started by the +worker container, such as a Destination container. This guide will assume use of [IntelliJ Community edition](https://www.jetbrains.com/idea/), +however the steps could be applied to another IDE or debugger. + +## Prerequisites +You should have the airbyte repo downloaded and should be able to [run the platform locally](/deploying-airbyte/local-deployment). +Also, if you're on macOS you will need to follow the installation steps for [Docker Mac Connect](https://github.com/chipmk/docker-mac-net-connect). + +## Connecting your debugger +This solution utilizes the environment variable `JAVA_TOOL_OPTIONS` which when set to a specific value allows us to connect our debugger. +We will also be setting up a **Remote JVM Debug** run configuration in IntelliJ which uses the IP address or hostname to connect. + +> **Note** +> The [Docker Mac Connect](https://github.com/chipmk/docker-mac-net-connect) tool is what makes it possible for macOS users to connect to a docker container +> by IP address. + +### Docker Compose Extension +By default, the `docker compose` command will look for a `docker-compose.yaml` file in your directory and execute its instructions. However, you can +provide multiple files to the `docker compose` command with the `-f` option. You can read more about how Docker compose combines or overrides values when +you provide multiple files [on Docker's Website](https://docs.docker.com/compose/extends/). + +In the Airbyte repo, there is already another file `docker-compose.debug.yaml` which extends the `docker-compose.yaml` file. Our goal is to set the +`JAVA_TOOL_OPTIONS` environment variable in the environment of the container we wish to debug. If you look at the `server` configuration under `services` +in the `docker-compose.debug.yaml` file, it should look like this: +```yaml + server: + environment: + - JAVA_TOOL_OPTIONS=${DEBUG_SERVER_JAVA_OPTIONS} +``` +What this is saying is: For the Service `server` add an environment variable `JAVA_TOOL_OPTIONS` with the value of the variable `DEBUG_SERVER_JAVA_OPTIONS`. +`DEBUG_SERVER_JAVA_OPTIONS` has no default value, so if we don't provide one, `JAVA_TOOL_OPTIONS` will be blank or empty. When running the `docker compose` command, +Docker will look to your local environment variables, to see if you have set a value for `DEBUG_SERVER_JAVA_OPTIONS` and copy that value. To set this value +you can either `export` the variable in your environment prior to running the `docker compose` command, or prepend the variable to the command. For our debugging purposes, +we want the value to be `-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005` so to connect our debugger to the `server` container, run the following: + +```bash +DEBUG_SERVER_JAVA_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005" VERSION="dev" docker compose -f docker-compose.yaml -f docker-compose.debug.yaml up +``` + +> **Note** +> This command also passes in the `VERSION=dev` environment variable, which is recommended from the comments in the `docker-compose.debug.yaml` + +### Connecting the Debugger +Now we need to connect our debugger. In IntelliJ, open `Edit Configurations...` from the run menu (Or search for `Edit Configurations` in the command palette). +Create a new *Remote JVM Debug* Run configuration. The `host` option defaults to `localhost` which if you're on Linux you can leave this unchanged. +On a Mac however, you need to find the IP address of your container. **Make sure you've installed and started the [Docker Mac Connect](https://github.com/chipmk/docker-mac-net-connect) +service prior to running the `docker compose` command**. With your containers running, run the following command to easily fetch the IP addresses: + +```bash +$ docker inspect $(docker ps -q ) --format='{{ printf "%-50s" .Name}} {{printf "%-50s" .Config.Image}} {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' +/airbyte-proxy airbyte/proxy:dev 172.18.0.10172.19.0.4 +/airbyte-server airbyte/server:dev 172.18.0.9 +/airbyte-worker airbyte/worker:dev 172.18.0.8 +/airbyte-source sha256:5eea76716a190d10fd866f5ac6498c8306382f55c6d910231d37a749ad305960 172.17.0.2 +/airbyte-connector-builder-server airbyte/connector-builder-server:dev 172.18.0.6 +/airbyte-webapp airbyte/webapp:dev 172.18.0.7 +/airbyte-cron airbyte/cron:dev 172.18.0.5 +/airbyte-temporal airbyte/temporal:dev 172.18.0.2 +/airbyte-db airbyte/db:dev 172.18.0.4172.19.0.3 +/airbyte-temporal-ui temporalio/web:1.13.0 172.18.0.3172.19.0.2 +``` +You should see an entry for `/airbyte-server` which is the container we've been targeting so copy its IP address (`172.18.0.9` in the example output above) +and replace `localhost` in your IntelliJ Run configuration with the IP address. + +Save your Remote JVM Debug run configuration and run it with the debug option. You should now be able to place breakpoints in any code that is being executed by the +`server` container. If you need to debug another container from the original `docker-compose.yaml` file, you could modify the `docker-compose.debug.yaml` file with a similar option. + +### Debugging Containers Launched by the Worker container +The Airbyte platform launches some containers as needed at runtime, which are not defined in the `docker-compose.yaml` file. These containers are the source or destination +tasks, among other things. But if we can't pass environment variables to them through the `docker-compose.debug.yaml` file, then how can we set the +`JAVA_TOOL_OPTIONS` environment variable? Well, the answer is that we can *pass it through* the container which launches the other containers - the `worker` container. + +For this example, lets say that we want to debug something that happens in the `destination-postgres` connector container. To follow along with this example, you will +need to have set up a connection which uses postgres as a destination, however if you want to use a different connector like `source-postgres`, `destination-bigquery`, etc. that's fine. + +In the `docker-compose.debug.yaml` file you should see an entry for the `worker` service which looks like this +```yaml + worker: + environment: + - DEBUG_CONTAINER_IMAGE=${DEBUG_CONTAINER_IMAGE} + - DEBUG_CONTAINER_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 +``` +Similar to the previous debugging example, we want to pass an environment variable to the `docker compose` command. This time we're setting the +`DEBUG_CONTAINER_IMAGE` environment variable to the name of the container we're targeting. For our example that is `destination-postgres` so run the command: +```bash +DEBUG_CONTAINER_IMAGE="destination-postgres" VERSION="dev" docker compose -f docker-compose.yaml -f docker-compose.debug.yaml up +``` +The `worker` container now has an environment variable `DEBUG_CONTAINER_IMAGE` with a value of `destination-postgres` which when it compares when it is +spawning containers. If the container name matches the environment variable, it will set the `JAVA_TOOL_OPTIONS` environment variable in the container to +the value of its `DEBUG_CONTAINER_JAVA_OPTS` environment variable, which is the same value we used in the `server` example. + +#### Connecting the Debugger to a Worker Spawned Container +To connect your debugger, **the container must be running**. This `destination-postgres` container will only run when we're running one of its tasks, +such as when a replication is running. Navigate to a connection in your local Airbyte instance at http://localhost:8000 which uses postgres as a destination. +If you ran through the [Postgres to Postgres replication tutorial](https://airbyte.com/tutorials/postgres-replication), you can use this connection. + +On the connection page, trigger a manual sync with the "Sync now" button. Because we set the `suspend` option to `y` in our `JAVA_TOOL_OPTIONS` the +container will pause all execution until the debugger is connected. This can be very useful for methods which run very quickly, such as the Check method. +However, this could be very detrimental if it were pushed into a production environment. For now, it gives us time to set a new Remote JVM Debug Configuraiton. + +This container will have a different IP than the `server` Remote JVM Debug Run configuration we set up earlier. So lets set up a new one with the IP of +the `destination-postgres` container: + +```bash +$ docker inspect $(docker ps -q ) --format='{{ printf "%-50s" .Name}} {{printf "%-50s" .Config.Image}} {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' +/destination-postgres-write-52-0-grbsw airbyte/destination-postgres:0.3.26 +/airbyte-proxy airbyte/proxy:dev 172.18.0.10172.19.0.4 +/airbyte-worker airbyte/worker:dev 172.18.0.8 +/airbyte-server airbyte/server:dev 172.18.0.9 +/airbyte-destination postgres 172.17.0.3 +/airbyte-source sha256:5eea76716a190d10fd866f5ac6498c8306382f55c6d910231d37a749ad305960 172.17.0.2 +/airbyte-connector-builder-server airbyte/connector-builder-server:dev 172.18.0.6 +/airbyte-webapp airbyte/webapp:dev 172.18.0.7 +/airbyte-cron airbyte/cron:dev 172.18.0.5 +/airbyte-temporal airbyte/temporal:dev 172.18.0.3 +/airbyte-db airbyte/db:dev 172.18.0.2172.19.0.3 +/airbyte-temporal-ui temporalio/web:1.13.0 172.18.0.4172.19.0.2 +``` + +Huh? No IP address, weird. Interestingly enough, all the IPs are sequential but there is one missing, `172.18.0.1`. If we attempt to use that IP in remote debugger, it works! + +You can now add breakpoints and debug any code which would be executed in the `destination-postgres` container. + +Happy Debugging! + +## Gotchas +So now that your debugger is set up, what else is there to know? + +### Code changes +When you're debugging, you might want to make a code change. Anytime you make a code change, your code will become out of sync with the container which is run by the platform. +Essentially this means that after you've made a change you will need to rebuild the docker container you're debugging. Additionally, for the connector containers, you may have to navigate to +"Settings" in your local Airbyte Platform's web UI and change the version of the container to `dev`. See you connector's `README` for details on how to rebuild the container image. + +### Ports +In this tutorial we've been using port `5005` for all debugging. It's the default, so we haven't changed it. If you need to debug *multiple* containers however, they will clash on this port. +If you need to do this, you will have to modify your setup to use another port that is not in use. From 680f5da491b3810649b377b72a5292610717619f Mon Sep 17 00:00:00 2001 From: Alex Birdsall Date: Fri, 20 Jan 2023 15:39:17 -0800 Subject: [PATCH 014/195] :window: :handshake: Free connectors program confirmation UI (#21623) * Extract STRIPE_SUCCESS_QUERY to hook for reuse Also updates the query string itself so it's no longer identical to the pre-existing checkout success query: this means that a one-off credit transaction triggered from the credits page won't be mistaken for enrollment. * Hide banners, show pop-up after successful enrollment * Show confirmation when user requests verification email * Reraise sendEmailVerification errors, so calling code can register success-only actions in a `.then` callback * Increase the z-index of the Toast UI, so that pop-up notifications aren't obscured by an active modal --- .../src/components/ui/Toast/Toast.module.scss | 1 + .../EnrollmentModal/EnrollmentModal.tsx | 3 +- .../useShowEnrollmentModal.tsx | 20 ++++++++++- .../InlineEnrollmentCallout.tsx | 5 ++- .../LargeEnrollmentCallout.tsx | 4 ++- .../hooks/useFreeConnectorProgram.ts | 33 ++++++++++++++++++- .../src/packages/cloud/locales/en.json | 2 ++ .../cloud/services/auth/AuthService.tsx | 1 + .../views/credits/CreditsPage/CreditsPage.tsx | 4 +-- .../components/EmailVerificationHint.tsx | 3 +- .../ConnectionPage/ConnectionPageTitle.tsx | 6 ++-- airbyte-webapp/src/scss/_z-indices.scss | 10 +++--- 12 files changed, 75 insertions(+), 17 deletions(-) diff --git a/airbyte-webapp/src/components/ui/Toast/Toast.module.scss b/airbyte-webapp/src/components/ui/Toast/Toast.module.scss index 42d4ac5840fe7..d14a776aa30b1 100644 --- a/airbyte-webapp/src/components/ui/Toast/Toast.module.scss +++ b/airbyte-webapp/src/components/ui/Toast/Toast.module.scss @@ -43,6 +43,7 @@ $toast-bottom-margin: 27px; position: fixed; box-sizing: border-box; bottom: $toast-bottom-margin; + margin-left: calc(vars.$width-size-menu / 2); left: 50%; transform: translate(-50%, 0); z-index: z-indices.$notification; diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/EnrollmentModal.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/EnrollmentModal.tsx index b580fb1d4adf0..bdbee6b827e50 100644 --- a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/EnrollmentModal.tsx +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/EnrollmentModal.tsx @@ -12,6 +12,7 @@ import { Text } from "components/ui/Text"; import { StripeCheckoutSessionCreate, StripeCheckoutSessionRead } from "packages/cloud/lib/domain/stripe"; +import { STRIPE_SUCCESS_QUERY } from "../hooks/useFreeConnectorProgram"; import { ReactComponent as CardSVG } from "./cards.svg"; import { ReactComponent as ConnectorGridSvg } from "./connectorGrid.svg"; import styles from "./EnrollmentModal.module.scss"; @@ -19,8 +20,6 @@ import { ReactComponent as FreeAlphaBetaPillsSVG } from "./free-alpha-beta-pills import { ReactComponent as FreeSVG } from "./free.svg"; import { ReactComponent as MailSVG } from "./mail.svg"; -const STRIPE_SUCCESS_QUERY = "stripeCheckoutSuccess"; - interface EnrollmentModalContentProps { closeModal: () => void; createCheckout: (p: StripeCheckoutSessionCreate) => Promise; diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/useShowEnrollmentModal.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/useShowEnrollmentModal.tsx index 632c615399e8c..bf1849e28d7a6 100644 --- a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/useShowEnrollmentModal.tsx +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/useShowEnrollmentModal.tsx @@ -1,4 +1,9 @@ +import { useIntl } from "react-intl"; + +import { ToastType } from "components/ui/Toast"; + import { useModalService } from "hooks/services/Modal"; +import { useNotificationService } from "hooks/services/Notification"; import { useAuthService } from "packages/cloud/services/auth/AuthService"; import { useStripeCheckout } from "packages/cloud/services/stripe/StripeService"; import { useCurrentWorkspaceId } from "services/workspaces/WorkspacesService"; @@ -10,6 +15,19 @@ export const useShowEnrollmentModal = () => { const { mutateAsync: createCheckout } = useStripeCheckout(); const workspaceId = useCurrentWorkspaceId(); const { emailVerified, sendEmailVerification } = useAuthService(); + const { formatMessage } = useIntl(); + const { registerNotification } = useNotificationService(); + + const verifyEmail = () => + sendEmailVerification() + .then(() => { + registerNotification({ + id: "fcp/verify-email", + text: formatMessage({ id: "freeConnectorProgram.enrollmentModal.validationEmailConfirmation" }), + type: ToastType.INFO, + }); + }) + .catch(); // don't crash the page on error return { showEnrollmentModal: () => { @@ -21,7 +39,7 @@ export const useShowEnrollmentModal = () => { createCheckout={createCheckout} closeModal={closeModal} emailVerified={emailVerified} - sendEmailVerification={sendEmailVerification} + sendEmailVerification={verifyEmail} /> ), }); diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout.tsx index bde66bf2d6693..09a425906a9da 100644 --- a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout.tsx +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout.tsx @@ -5,6 +5,7 @@ import { Callout } from "components/ui/Callout"; import { Text } from "components/ui/Text"; import { useShowEnrollmentModal } from "./EnrollmentModal"; +import { useFreeConnectorProgram } from "./hooks/useFreeConnectorProgram"; import styles from "./InlineEnrollmentCallout.module.scss"; export const EnrollLink: React.FC> = ({ children }) => { @@ -17,7 +18,9 @@ export const EnrollLink: React.FC> = ({ children }) = ); }; export const InlineEnrollmentCallout: React.FC = () => { - return ( + const { userDidEnroll } = useFreeConnectorProgram(); + + return userDidEnroll ? null : ( { const { showEnrollmentModal } = useShowEnrollmentModal(); + const { userDidEnroll } = useFreeConnectorProgram(); - return ( + return userDidEnroll ? null : ( diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/hooks/useFreeConnectorProgram.ts b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/hooks/useFreeConnectorProgram.ts index 014a43014a6cd..2a2cdbe460d4e 100644 --- a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/hooks/useFreeConnectorProgram.ts +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/hooks/useFreeConnectorProgram.ts @@ -1,12 +1,21 @@ +import { useState } from "react"; +import { useIntl } from "react-intl"; import { useQuery } from "react-query"; +import { useSearchParams } from "react-router-dom"; +import { useEffectOnce } from "react-use"; + +import { ToastType } from "components/ui/Toast"; import { useExperiment } from "hooks/services/Experiment"; +import { useNotificationService } from "hooks/services/Notification"; import { useConfig } from "packages/cloud/services/config"; import { useDefaultRequestMiddlewares } from "services/useDefaultRequestMiddlewares"; import { useCurrentWorkspaceId } from "services/workspaces/WorkspacesService"; import { webBackendGetFreeConnectorProgramInfoForWorkspace } from "../lib/api"; +export const STRIPE_SUCCESS_QUERY = "fcpEnrollmentSuccess"; + export const useFreeConnectorProgram = () => { const workspaceId = useCurrentWorkspaceId(); const { cloudApiUrl } = useConfig(); @@ -14,8 +23,25 @@ export const useFreeConnectorProgram = () => { const middlewares = useDefaultRequestMiddlewares(); const requestOptions = { config, middlewares }; const freeConnectorProgramEnabled = useExperiment("workspace.freeConnectorsProgram.visible", false); + const [searchParams, setSearchParams] = useSearchParams(); + const [userDidEnroll, setUserDidEnroll] = useState(false); + const { formatMessage } = useIntl(); + const { registerNotification } = useNotificationService(); - return useQuery(["freeConnectorProgramInfo", workspaceId], () => + useEffectOnce(() => { + if (searchParams.has(STRIPE_SUCCESS_QUERY)) { + // Remove the stripe parameter from the URL + setSearchParams({}, { replace: true }); + setUserDidEnroll(true); + registerNotification({ + id: "fcp/enrolled", + text: formatMessage({ id: "freeConnectorProgram.enroll.success" }), + type: ToastType.SUCCESS, + }); + } + }); + + const enrollmentStatusQuery = useQuery(["freeConnectorProgramInfo", workspaceId], () => webBackendGetFreeConnectorProgramInfoForWorkspace({ workspaceId }, requestOptions).then( ({ hasEligibleConnector, hasPaymentAccountSaved }) => { const userIsEligibleToEnroll = !hasPaymentAccountSaved && hasEligibleConnector; @@ -27,4 +53,9 @@ export const useFreeConnectorProgram = () => { } ) ); + + return { + enrollmentStatusQuery, + userDidEnroll, + }; }; diff --git a/airbyte-webapp/src/packages/cloud/locales/en.json b/airbyte-webapp/src/packages/cloud/locales/en.json index 69b6a4cc69af1..25bb28b00a51c 100644 --- a/airbyte-webapp/src/packages/cloud/locales/en.json +++ b/airbyte-webapp/src/packages/cloud/locales/en.json @@ -183,11 +183,13 @@ "freeConnectorProgram.title": "Free Connector Program", "freeConnectorProgram.enrollNow": "Enroll now!", "freeConnectorProgram.enroll.description": "Enroll in the Free Connector Program to use Alpha and Beta connectors for free.", + "freeConnectorProgram.enroll.success": "Successfully enrolled in the Free Connector Program", "freeConnectorProgram.enrollmentModal.title": "Free connector program", "freeConnectorProgram.enrollmentModal.free": "Alpha and Beta Connectors are free while you're in the program.The whole Connection is free until both Connectors have move into General Availability (GA)", "freeConnectorProgram.enrollmentModal.emailNotification": "We will let you know through email before a Connector you use moves to GA", "freeConnectorProgram.enrollmentModal.cardOnFile": "When both Connectors are in GA, the Connection will no longer be free. You'll need to have a credit card on file to enroll so Airbyte can handle a Connection's transition to paid service.", "freeConnectorProgram.enrollmentModal.unvalidatedEmailWarning": "You need to verify your email address before you can enroll in the Free Connector Program. Re-send verification email.", + "freeConnectorProgram.enrollmentModal.validationEmailConfirmation": "Verification email sent", "freeConnectorProgram.enrollmentModal.cancelButtonText": "Cancel", "freeConnectorProgram.enrollmentModal.enrollButtonText": "Enroll now!", "freeConnectorProgram.enrollmentModal.unvalidatedEmailButtonText": "Resend email validation", diff --git a/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx b/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx index 1fa84ac07a4da..fdccf84cfdca5 100644 --- a/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx +++ b/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx @@ -273,6 +273,7 @@ export const AuthenticationProvider: React.FC> type: ToastType.ERROR, }); } + throw error; } }, async verifyEmail(code: string): Promise { diff --git a/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/CreditsPage.tsx b/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/CreditsPage.tsx index 7395779491c11..447d98f5b8760 100644 --- a/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/CreditsPage.tsx +++ b/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/CreditsPage.tsx @@ -20,8 +20,8 @@ import styles from "./CreditsPage.module.scss"; const CreditsPage: React.FC = () => { const { emailVerified } = useAuthService(); useTrackPage(PageTrackingCodes.CREDITS); - const { data: freeConnectorProgramInfo } = useFreeConnectorProgram(); - const { showEnrollmentUi } = freeConnectorProgramInfo || {}; + const { enrollmentStatusQuery } = useFreeConnectorProgram(); + const { showEnrollmentUi } = enrollmentStatusQuery.data || {}; return ( = ({ className }) => { const [isEmailResend, setIsEmailResend] = useState(false); const onResendVerificationMail = async () => { - await sendEmailVerification(); + // the shared error handling inside `sendEmailVerification` suffices + await sendEmailVerification().catch(); setIsEmailResend(true); }; diff --git a/airbyte-webapp/src/pages/connections/ConnectionPage/ConnectionPageTitle.tsx b/airbyte-webapp/src/pages/connections/ConnectionPage/ConnectionPageTitle.tsx index a98a76ec19053..86e7194be2777 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionPage/ConnectionPageTitle.tsx +++ b/airbyte-webapp/src/pages/connections/ConnectionPage/ConnectionPageTitle.tsx @@ -26,8 +26,8 @@ export const ConnectionPageTitle: React.FC = () => { const { connection } = useConnectionEditService(); - const { data: freeConnectorProgramInfo } = useFreeConnectorProgram(); - const displayEnrollmentCallout = freeConnectorProgramInfo?.showEnrollmentUi; + const { enrollmentStatusQuery } = useFreeConnectorProgram(); + const { showEnrollmentUi } = enrollmentStatusQuery.data || {}; const steps = useMemo(() => { const steps = [ @@ -80,7 +80,7 @@ export const ConnectionPageTitle: React.FC = () => {
- {displayEnrollmentCallout && } + {showEnrollmentUi && }
diff --git a/airbyte-webapp/src/scss/_z-indices.scss b/airbyte-webapp/src/scss/_z-indices.scss index 71ec0051a4ca0..752c0b00ecb38 100644 --- a/airbyte-webapp/src/scss/_z-indices.scss +++ b/airbyte-webapp/src/scss/_z-indices.scss @@ -1,11 +1,11 @@ -$tooltip: 9999 + 3; +$tooltip: 9999 + 4; +$notification: 9999 + 3; $datepicker: 9999 + 2; $modal: 9999 + 1; $sidebar: 9999; -$panelSplitter: 0; -$dropdownMenu: 2; -$notification: 20; -$schemaChangesBackdrop: 3; $schemaChangesBackdropContent: 4; +$schemaChangesBackdrop: 3; +$dropdownMenu: 2; $switchSliderBefore: 1; $tableScroll: 1; +$panelSplitter: 0; From 6026465c52b7755dfc4a0b5c92bc229fa84f7db4 Mon Sep 17 00:00:00 2001 From: Anne <102554163+alovew@users.noreply.github.com> Date: Fri, 20 Jan 2023 16:32:23 -0800 Subject: [PATCH 015/195] Remove jobPersistence dependency (#21625) * Remove JobPersistence from ConfigFetchActivityImpl --- airbyte-api/src/main/openapi/config.yaml | 30 + .../workers/config/ApiClientBeanFactory.java | 6 + .../server/apis/JobsApiController.java | 8 + .../server/converters/JobConverter.java | 6 + .../server/handlers/JobHistoryHandler.java | 12 + .../activities/ConfigFetchActivityImpl.java | 40 +- .../activities/ConfigFetchActivityTest.java | 74 +-- .../api/generated-api-html/index.html | 622 ++++++++++-------- 8 files changed, 477 insertions(+), 321 deletions(-) diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index 79ec520942b2c..2107c31066f7e 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -1989,6 +1989,28 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" + /v1/jobs/get_last_replication_job: + post: + tags: + - jobs + operationId: getLastReplicationJob + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ConnectionIdRequestBody" + required: true + responses: + "200": + description: Successful operation + content: + application/json: + schema: + $ref: "#/components/schemas/JobOptionalRead" + "404": + $ref: "#/components/responses/NotFoundResponse" + "422": + $ref: "#/components/responses/InvalidInputResponse" /v1/jobs/get_light: post: tags: @@ -3907,6 +3929,9 @@ components: updatedAt: type: integer format: int64 + startedAt: + type: integer + format: int64 status: $ref: "#/components/schemas/JobStatus" resetConfig: @@ -4142,6 +4167,11 @@ components: properties: job: $ref: "#/components/schemas/JobRead" + JobOptionalRead: + type: object + properties: + job: + $ref: "#/components/schemas/JobRead" JobDebugInfoRead: type: object required: diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/config/ApiClientBeanFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/config/ApiClientBeanFactory.java index d7e5d80407c0c..47f2c7cded307 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/config/ApiClientBeanFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/config/ApiClientBeanFactory.java @@ -11,6 +11,7 @@ import io.airbyte.api.client.AirbyteApiClient; import io.airbyte.api.client.generated.ConnectionApi; import io.airbyte.api.client.generated.DestinationApi; +import io.airbyte.api.client.generated.JobsApi; import io.airbyte.api.client.generated.SourceApi; import io.airbyte.api.client.generated.WorkspaceApi; import io.airbyte.api.client.invoker.generated.ApiClient; @@ -72,6 +73,11 @@ public SourceApi sourceApi(@Named("apiClient") final ApiClient apiClient) { return new SourceApi(apiClient); } + @Singleton + public JobsApi jobsApi(@Named("apiClient") final ApiClient apiClient) { + return new JobsApi(apiClient); + } + @Singleton public DestinationApi destinationApi(final ApiClient apiClient) { return new DestinationApi(apiClient); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java index f09d331038a24..9fadce045d05c 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java @@ -6,11 +6,13 @@ import io.airbyte.api.generated.JobsApi; import io.airbyte.api.model.generated.AttemptNormalizationStatusReadList; +import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.JobDebugInfoRead; import io.airbyte.api.model.generated.JobIdRequestBody; import io.airbyte.api.model.generated.JobInfoLightRead; import io.airbyte.api.model.generated.JobInfoRead; import io.airbyte.api.model.generated.JobListRequestBody; +import io.airbyte.api.model.generated.JobOptionalRead; import io.airbyte.api.model.generated.JobReadList; import io.airbyte.server.handlers.JobHistoryHandler; import io.airbyte.server.handlers.SchedulerHandler; @@ -63,6 +65,12 @@ public JobInfoLightRead getJobInfoLight(final JobIdRequestBody jobIdRequestBody) return ApiHelper.execute(() -> jobHistoryHandler.getJobInfoLight(jobIdRequestBody)); } + @Post("/get_last_replication_job") + @Override + public JobOptionalRead getLastReplicationJob(final ConnectionIdRequestBody connectionIdRequestBody) { + return ApiHelper.execute(() -> jobHistoryHandler.getLastReplicationJob(connectionIdRequestBody)); + } + @Post("/list") @Override public JobReadList listJobsFor(final JobListRequestBody jobListRequestBody) { diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/JobConverter.java b/airbyte-server/src/main/java/io/airbyte/server/converters/JobConverter.java index 289d1458003e0..9a3d479749e0f 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/JobConverter.java +++ b/airbyte-server/src/main/java/io/airbyte/server/converters/JobConverter.java @@ -19,6 +19,7 @@ import io.airbyte.api.model.generated.JobDebugRead; import io.airbyte.api.model.generated.JobInfoLightRead; import io.airbyte.api.model.generated.JobInfoRead; +import io.airbyte.api.model.generated.JobOptionalRead; import io.airbyte.api.model.generated.JobRead; import io.airbyte.api.model.generated.JobStatus; import io.airbyte.api.model.generated.JobWithAttemptsRead; @@ -72,6 +73,10 @@ public JobInfoLightRead getJobInfoLightRead(final Job job) { return new JobInfoLightRead().job(getJobRead(job)); } + public JobOptionalRead getJobOptionalRead(final Job job) { + return new JobOptionalRead().job(getJobRead(job)); + } + public static JobDebugRead getDebugJobInfoRead(final JobInfoRead jobInfoRead, final SourceDefinitionRead sourceDefinitionRead, final DestinationDefinitionRead destinationDefinitionRead, @@ -103,6 +108,7 @@ public static JobRead getJobRead(final Job job) { .resetConfig(extractResetConfigIfReset(job).orElse(null)) .createdAt(job.getCreatedAtInSecond()) .updatedAt(job.getUpdatedAtInSecond()) + .startedAt(job.getStartedAtInSecond().isPresent() ? job.getStartedAtInSecond().get() : null) .status(Enums.convertTo(job.getStatus(), JobStatus.class)); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/JobHistoryHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/JobHistoryHandler.java index d12fdad8a77cc..579e0b4672a4e 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/JobHistoryHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/JobHistoryHandler.java @@ -10,6 +10,7 @@ import io.airbyte.api.model.generated.AttemptRead; import io.airbyte.api.model.generated.AttemptStats; import io.airbyte.api.model.generated.AttemptStreamStats; +import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionRead; import io.airbyte.api.model.generated.DestinationDefinitionIdRequestBody; import io.airbyte.api.model.generated.DestinationDefinitionRead; @@ -21,6 +22,7 @@ import io.airbyte.api.model.generated.JobInfoLightRead; import io.airbyte.api.model.generated.JobInfoRead; import io.airbyte.api.model.generated.JobListRequestBody; +import io.airbyte.api.model.generated.JobOptionalRead; import io.airbyte.api.model.generated.JobRead; import io.airbyte.api.model.generated.JobReadList; import io.airbyte.api.model.generated.JobWithAttemptsRead; @@ -194,6 +196,16 @@ public JobInfoLightRead getJobInfoLight(final JobIdRequestBody jobIdRequestBody) return jobConverter.getJobInfoLightRead(job); } + public JobOptionalRead getLastReplicationJob(final ConnectionIdRequestBody connectionIdRequestBody) throws IOException { + Optional job = jobPersistence.getLastReplicationJob(connectionIdRequestBody.getConnectionId()); + if (job.isEmpty()) { + return new JobOptionalRead(); + } else { + return jobConverter.getJobOptionalRead(job.get()); + } + + } + public JobDebugInfoRead getJobDebugInfo(final JobIdRequestBody jobIdRequestBody) throws ConfigNotFoundException, IOException, JsonValidationException { final Job job = jobPersistence.getJob(jobIdRequestBody.getId()); diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityImpl.java index 74ee4d751b9b3..6e935af243a24 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityImpl.java @@ -10,6 +10,7 @@ import com.google.common.annotations.VisibleForTesting; import datadog.trace.api.Trace; import io.airbyte.api.client.generated.ConnectionApi; +import io.airbyte.api.client.generated.JobsApi; import io.airbyte.api.client.generated.WorkspaceApi; import io.airbyte.api.client.invoker.generated.ApiException; import io.airbyte.api.client.model.generated.ConnectionIdRequestBody; @@ -20,11 +21,11 @@ import io.airbyte.api.client.model.generated.ConnectionScheduleDataCron; import io.airbyte.api.client.model.generated.ConnectionScheduleType; import io.airbyte.api.client.model.generated.ConnectionStatus; +import io.airbyte.api.client.model.generated.JobOptionalRead; +import io.airbyte.api.client.model.generated.JobRead; import io.airbyte.api.client.model.generated.WorkspaceRead; import io.airbyte.commons.temporal.exception.RetryableException; import io.airbyte.metrics.lib.ApmTraceUtils; -import io.airbyte.persistence.job.JobPersistence; -import io.airbyte.persistence.job.models.Job; import io.micronaut.context.annotation.Value; import jakarta.inject.Named; import jakarta.inject.Singleton; @@ -61,19 +62,19 @@ public class ConfigFetchActivityImpl implements ConfigFetchActivity { UUID.fromString("226edbc1-4a9c-4401-95a9-90435d667d9d")); private static final long SCHEDULING_NOISE_CONSTANT = 15; - private final JobPersistence jobPersistence; + private final JobsApi jobsApi; private final WorkspaceApi workspaceApi; private final Integer syncJobMaxAttempts; private final Supplier currentSecondsSupplier; private final ConnectionApi connectionApi; @VisibleForTesting - protected ConfigFetchActivityImpl(final JobPersistence jobPersistence, + protected ConfigFetchActivityImpl(final JobsApi jobsApi, final WorkspaceApi workspaceApi, @Value("${airbyte.worker.sync.max-attempts}") final Integer syncJobMaxAttempts, @Named("currentSecondsSupplier") final Supplier currentSecondsSupplier, final ConnectionApi connectionApi) { - this.jobPersistence = jobPersistence; + this.jobsApi = jobsApi; this.workspaceApi = workspaceApi; this.syncJobMaxAttempts = syncJobMaxAttempts; this.currentSecondsSupplier = currentSecondsSupplier; @@ -104,21 +105,22 @@ public ScheduleRetrieverOutput getTimeToWait(final ScheduleRetrieverInput input) * * This method consumes the `scheduleType` and `scheduleData` fields. */ - private ScheduleRetrieverOutput getTimeToWaitFromScheduleType(final ConnectionRead connectionRead, final UUID connectionId) throws IOException { + private ScheduleRetrieverOutput getTimeToWaitFromScheduleType(final ConnectionRead connectionRead, final UUID connectionId) + throws IOException, ApiException { if (connectionRead.getScheduleType() == ConnectionScheduleType.MANUAL || connectionRead.getStatus() != ConnectionStatus.ACTIVE) { // Manual syncs wait for their first run return new ScheduleRetrieverOutput(Duration.ofDays(100 * 365)); } - final Optional previousJobOptional = jobPersistence.getLastReplicationJob(connectionId); + final JobOptionalRead previousJobOptional = jobsApi.getLastReplicationJob(new ConnectionIdRequestBody().connectionId(connectionId)); if (connectionRead.getScheduleType() == ConnectionScheduleType.BASIC) { - if (previousJobOptional.isEmpty()) { + if (previousJobOptional.getJob() == null) { // Basic schedules don't wait for their first run. return new ScheduleRetrieverOutput(Duration.ZERO); } - final Job previousJob = previousJobOptional.get(); - final long prevRunStart = previousJob.getStartedAtInSecond().orElse(previousJob.getCreatedAtInSecond()); + final long prevRunStart = previousJobOptional.getJob().getStartedAt() != null ? previousJobOptional.getJob().getStartedAt() + : previousJobOptional.getJob().getCreatedAt(); final long nextRunStart = prevRunStart + getIntervalInSecond(connectionRead.getScheduleData().getBasicSchedule()); final Duration timeToWait = Duration.ofSeconds( Math.max(0, nextRunStart - currentSecondsSupplier.get())); @@ -135,9 +137,10 @@ private ScheduleRetrieverOutput getTimeToWaitFromScheduleType(final ConnectionRe // us from multiple executions for the same scheduled time, since cron only has a 1-minute // resolution. final long earliestNextRun = Math.max(currentSecondsSupplier.get() * MS_PER_SECOND, - (previousJobOptional.isPresent() - ? previousJobOptional.get().getStartedAtInSecond().orElse(previousJobOptional.get().getCreatedAtInSecond()) - + MIN_CRON_INTERVAL_SECONDS + (previousJobOptional.getJob() != null + ? previousJobOptional.getJob().getStartedAt() != null ? previousJobOptional.getJob().getStartedAt() + MIN_CRON_INTERVAL_SECONDS + : previousJobOptional.getJob().getCreatedAt() + + MIN_CRON_INTERVAL_SECONDS : currentSecondsSupplier.get()) * MS_PER_SECOND); final Date nextRunStart = cronExpression.getNextValidTimeAfter(new Date(earliestNextRun)); Duration timeToWait = Duration.ofSeconds( @@ -185,21 +188,22 @@ private Duration addSchedulingNoiseForAllowListedWorkspace(Duration timeToWait, * * This method consumes the `schedule` field. */ - private ScheduleRetrieverOutput getTimeToWaitFromLegacy(final ConnectionRead connectionRead, final UUID connectionId) throws IOException { + private ScheduleRetrieverOutput getTimeToWaitFromLegacy(final ConnectionRead connectionRead, final UUID connectionId) + throws IOException, ApiException { if (connectionRead.getSchedule() == null || connectionRead.getStatus() != ConnectionStatus.ACTIVE) { // Manual syncs wait for their first run return new ScheduleRetrieverOutput(Duration.ofDays(100 * 365)); } - final Optional previousJobOptional = jobPersistence.getLastReplicationJob(connectionId); + final JobOptionalRead previousJobOptional = jobsApi.getLastReplicationJob(new ConnectionIdRequestBody().connectionId(connectionId)); - if (previousJobOptional.isEmpty() && connectionRead.getSchedule() != null) { + if (previousJobOptional.getJob() == null && connectionRead.getSchedule() != null) { // Non-manual syncs don't wait for their first run return new ScheduleRetrieverOutput(Duration.ZERO); } - final Job previousJob = previousJobOptional.get(); - final long prevRunStart = previousJob.getStartedAtInSecond().orElse(previousJob.getCreatedAtInSecond()); + final JobRead previousJob = previousJobOptional.getJob(); + final long prevRunStart = previousJob.getStartedAt() != null ? previousJob.getStartedAt() : previousJob.getCreatedAt(); final long nextRunStart = prevRunStart + getIntervalInSecond(connectionRead.getSchedule()); diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityTest.java index 320df0ac0af4d..d372d91b3377e 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/ConfigFetchActivityTest.java @@ -8,6 +8,7 @@ import static org.mockito.Mockito.when; import io.airbyte.api.client.generated.ConnectionApi; +import io.airbyte.api.client.generated.JobsApi; import io.airbyte.api.client.generated.WorkspaceApi; import io.airbyte.api.client.invoker.generated.ApiException; import io.airbyte.api.client.model.generated.ConnectionRead; @@ -18,10 +19,10 @@ import io.airbyte.api.client.model.generated.ConnectionScheduleDataCron; import io.airbyte.api.client.model.generated.ConnectionScheduleType; import io.airbyte.api.client.model.generated.ConnectionStatus; +import io.airbyte.api.client.model.generated.JobOptionalRead; +import io.airbyte.api.client.model.generated.JobRead; import io.airbyte.api.client.model.generated.WorkspaceRead; import io.airbyte.config.persistence.ConfigNotFoundException; -import io.airbyte.persistence.job.JobPersistence; -import io.airbyte.persistence.job.models.Job; import io.airbyte.validation.json.JsonValidationException; import io.airbyte.workers.temporal.scheduling.activities.ConfigFetchActivity.ScheduleRetrieverInput; import io.airbyte.workers.temporal.scheduling.activities.ConfigFetchActivity.ScheduleRetrieverOutput; @@ -29,7 +30,6 @@ import java.time.Duration; import java.time.Instant; import java.util.Calendar; -import java.util.Optional; import java.util.TimeZone; import java.util.UUID; import org.assertj.core.api.Assertions; @@ -47,12 +47,12 @@ class ConfigFetchActivityTest { private static final Integer SYNC_JOB_MAX_ATTEMPTS = 3; @Mock - private JobPersistence mJobPersistence; + private JobsApi mJobsApi; @Mock private WorkspaceApi mWorkspaceApi; @Mock - private Job mJob; + private JobRead mJobRead; @Mock private ConnectionApi mConnectionApi; @@ -103,7 +103,7 @@ class ConfigFetchActivityTest { @BeforeEach void setup() { configFetchActivity = - new ConfigFetchActivityImpl(mJobPersistence, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, + new ConfigFetchActivityImpl(mJobsApi, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> Instant.now().getEpochSecond(), mConnectionApi); } @@ -113,8 +113,8 @@ class TimeToWaitTest { @Test @DisplayName("Test that the job gets scheduled if it is not manual and if it is the first run with legacy schedule schema") void testFirstJobNonManual() throws IOException, JsonValidationException, ConfigNotFoundException, ApiException { - when(mJobPersistence.getLastReplicationJob(connectionId)) - .thenReturn(Optional.empty()); + when(mJobsApi.getLastReplicationJob(any())) + .thenReturn(new JobOptionalRead()); when(mConnectionApi.getConnection(any())) .thenReturn(connectionReadWithLegacySchedule); @@ -173,13 +173,13 @@ void testDeleted() throws ApiException { @DisplayName("Test we will wait the required amount of time with legacy config") void testWait() throws IOException, JsonValidationException, ConfigNotFoundException, ApiException { configFetchActivity = - new ConfigFetchActivityImpl(mJobPersistence, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> 60L * 3, mConnectionApi); + new ConfigFetchActivityImpl(mJobsApi, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> 60L * 3, mConnectionApi); - when(mJob.getStartedAtInSecond()) - .thenReturn(Optional.of(60L)); + when(mJobRead.getStartedAt()) + .thenReturn(60L); - when(mJobPersistence.getLastReplicationJob(connectionId)) - .thenReturn(Optional.of(mJob)); + when(mJobsApi.getLastReplicationJob(any())) + .thenReturn(new JobOptionalRead().job(mJobRead)); when(mConnectionApi.getConnection(any())) .thenReturn(connectionReadWithLegacySchedule); @@ -196,13 +196,13 @@ void testWait() throws IOException, JsonValidationException, ConfigNotFoundExcep @DisplayName("Test we will not wait if we are late in the legacy schedule schema") void testNotWaitIfLate() throws IOException, ApiException { configFetchActivity = - new ConfigFetchActivityImpl(mJobPersistence, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> 60L * 10, mConnectionApi); + new ConfigFetchActivityImpl(mJobsApi, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> 60L * 10, mConnectionApi); - when(mJob.getStartedAtInSecond()) - .thenReturn(Optional.of(60L)); + when(mJobRead.getStartedAt()) + .thenReturn(60L); - when(mJobPersistence.getLastReplicationJob(connectionId)) - .thenReturn(Optional.of(mJob)); + when(mJobsApi.getLastReplicationJob(any())) + .thenReturn(new JobOptionalRead().job(mJobRead)); when(mConnectionApi.getConnection(any())) .thenReturn(connectionReadWithLegacySchedule); @@ -234,8 +234,8 @@ void testManualScheduleType() throws ApiException { @Test @DisplayName("Test that the job will be immediately scheduled if it is a BASIC_SCHEDULE type on the first run") void testBasicScheduleTypeFirstRun() throws IOException, ApiException { - when(mJobPersistence.getLastReplicationJob(connectionId)) - .thenReturn(Optional.empty()); + when(mJobsApi.getLastReplicationJob(any())) + .thenReturn(new JobOptionalRead()); when(mConnectionApi.getConnection(any())) .thenReturn(connectionReadWithBasicScheduleType); @@ -251,13 +251,13 @@ void testBasicScheduleTypeFirstRun() throws IOException, ApiException { @Test @DisplayName("Test that we will wait the required amount of time with a BASIC_SCHEDULE type on a subsequent run") void testBasicScheduleSubsequentRun() throws IOException, ApiException { - configFetchActivity = new ConfigFetchActivityImpl(mJobPersistence, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> 60L * 3, mConnectionApi); + configFetchActivity = new ConfigFetchActivityImpl(mJobsApi, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> 60L * 3, mConnectionApi); - when(mJob.getStartedAtInSecond()) - .thenReturn(Optional.of(60L)); + when(mJobRead.getStartedAt()) + .thenReturn(60L); - when(mJobPersistence.getLastReplicationJob(connectionId)) - .thenReturn(Optional.of(mJob)); + when(mJobsApi.getLastReplicationJob(any())) + .thenReturn(new JobOptionalRead().job(mJobRead)); when(mConnectionApi.getConnection(any())) .thenReturn(connectionReadWithBasicScheduleType); @@ -282,11 +282,11 @@ void testCronScheduleSubsequentRun() throws IOException, JsonValidationException when(mWorkspaceApi.getWorkspaceByConnectionId(any())).thenReturn(new WorkspaceRead().workspaceId(UUID.randomUUID())); configFetchActivity = - new ConfigFetchActivityImpl(mJobPersistence, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, + new ConfigFetchActivityImpl(mJobsApi, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> mockRightNow.getTimeInMillis() / 1000L, mConnectionApi); - when(mJobPersistence.getLastReplicationJob(connectionId)) - .thenReturn(Optional.of(mJob)); + when(mJobsApi.getLastReplicationJob(any())) + .thenReturn(new JobOptionalRead().job(mJobRead)); when(mConnectionApi.getConnection(any())) .thenReturn(connectionReadWithCronScheduleType); @@ -311,12 +311,12 @@ void testCronScheduleMinimumInterval() throws IOException, JsonValidationExcepti when(mWorkspaceApi.getWorkspaceByConnectionId(any())).thenReturn(new WorkspaceRead().workspaceId(UUID.randomUUID())); configFetchActivity = - new ConfigFetchActivityImpl(mJobPersistence, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, + new ConfigFetchActivityImpl(mJobsApi, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> mockRightNow.getTimeInMillis() / 1000L, mConnectionApi); - when(mJob.getStartedAtInSecond()).thenReturn(Optional.of(mockRightNow.getTimeInMillis() / 1000L)); - when(mJobPersistence.getLastReplicationJob(connectionId)) - .thenReturn(Optional.of(mJob)); + when(mJobRead.getStartedAt()).thenReturn(mockRightNow.getTimeInMillis() / 1000L); + when(mJobsApi.getLastReplicationJob(any())) + .thenReturn(new JobOptionalRead().job(mJobRead)); when(mConnectionApi.getConnection(any())) .thenReturn(connectionReadWithCronScheduleType); @@ -342,12 +342,12 @@ void testCronSchedulingNoise() throws IOException, JsonValidationException, Conf .thenReturn(new WorkspaceRead().workspaceId(UUID.fromString("226edbc1-4a9c-4401-95a9-90435d667d9d"))); configFetchActivity = - new ConfigFetchActivityImpl(mJobPersistence, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, + new ConfigFetchActivityImpl(mJobsApi, mWorkspaceApi, SYNC_JOB_MAX_ATTEMPTS, () -> mockRightNow.getTimeInMillis() / 1000L, mConnectionApi); - when(mJob.getStartedAtInSecond()).thenReturn(Optional.of(mockRightNow.getTimeInMillis() / 1000L)); - when(mJobPersistence.getLastReplicationJob(connectionId)) - .thenReturn(Optional.of(mJob)); + when(mJobRead.getStartedAt()).thenReturn(mockRightNow.getTimeInMillis() / 1000L); + when(mJobsApi.getLastReplicationJob(any())) + .thenReturn(new JobOptionalRead().job(mJobRead)); when(mConnectionApi.getConnection(any())) .thenReturn(connectionReadWithCronScheduleType); @@ -368,7 +368,7 @@ class TestGetMaxAttempt { void testGetMaxAttempt() { final int maxAttempt = 15031990; configFetchActivity = - new ConfigFetchActivityImpl(mJobPersistence, mWorkspaceApi, maxAttempt, () -> Instant.now().getEpochSecond(), mConnectionApi); + new ConfigFetchActivityImpl(mJobsApi, mWorkspaceApi, maxAttempt, () -> Instant.now().getEpochSecond(), mConnectionApi); Assertions.assertThat(configFetchActivity.getMaxAttempt().getMaxAttempt()) .isEqualTo(maxAttempt); } diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index 340fc7c457940..7489b2e65eefd 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -282,6 +282,7 @@

Jobs

  • post /v1/jobs/get_debug_info
  • post /v1/jobs/get
  • post /v1/jobs/get_light
  • +
  • post /v1/jobs/get_last_replication_job
  • post /v1/jobs/list
  • Logs

    @@ -1252,6 +1253,7 @@

    Example data

    "job" : { "createdAt" : 6, "configId" : "configId", + "startedAt" : 5, "id" : 0, "resetConfig" : { "streamsToReset" : [ { @@ -1267,12 +1269,12 @@

    Example data

    "attempts" : [ { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -1280,45 +1282,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -1326,12 +1328,12 @@

    Example data

    }, { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -1339,45 +1341,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -1650,6 +1652,7 @@

    Example data

    "job" : { "createdAt" : 6, "configId" : "configId", + "startedAt" : 5, "id" : 0, "resetConfig" : { "streamsToReset" : [ { @@ -1665,12 +1668,12 @@

    Example data

    "attempts" : [ { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -1678,45 +1681,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -1724,12 +1727,12 @@

    Example data

    }, { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -1737,45 +1740,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -4189,6 +4192,7 @@

    Example data

    "job" : { "createdAt" : 6, "configId" : "configId", + "startedAt" : 5, "id" : 0, "resetConfig" : { "streamsToReset" : [ { @@ -4204,12 +4208,12 @@

    Example data

    "attempts" : [ { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -4217,45 +4221,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -4263,12 +4267,12 @@

    Example data

    }, { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -4276,45 +4280,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -4524,12 +4528,12 @@

    Example data

    "attempts" : [ { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -4537,45 +4541,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -4583,12 +4587,12 @@

    Example data

    }, { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -4596,45 +4600,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -4700,6 +4704,7 @@

    Example data

    "job" : { "createdAt" : 6, "configId" : "configId", + "startedAt" : 5, "id" : 0, "resetConfig" : { "streamsToReset" : [ { @@ -4715,12 +4720,12 @@

    Example data

    "attempts" : [ { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -4728,45 +4733,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -4774,12 +4779,12 @@

    Example data

    }, { "attempt" : { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -4787,45 +4792,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, "logs" : { "logLines" : [ "logLines", "logLines" ] @@ -4891,6 +4896,7 @@

    Example data

    "job" : { "createdAt" : 6, "configId" : "configId", + "startedAt" : 5, "id" : 0, "resetConfig" : { "streamsToReset" : [ { @@ -4924,6 +4930,79 @@

    422

    InvalidInputExceptionInfo
    +
    +
    + Up +
    post /v1/jobs/get_last_replication_job
    +
    (getLastReplicationJob)
    +
    + + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • application/json
    • +
    + +

    Request body

    +
    +
    ConnectionIdRequestBody ConnectionIdRequestBody (required)
    + +
    Body Parameter
    + +
    + + + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "job" : {
    +    "createdAt" : 6,
    +    "configId" : "configId",
    +    "startedAt" : 5,
    +    "id" : 0,
    +    "resetConfig" : {
    +      "streamsToReset" : [ {
    +        "name" : "name",
    +        "namespace" : "namespace"
    +      }, {
    +        "name" : "name",
    +        "namespace" : "namespace"
    +      } ]
    +    },
    +    "updatedAt" : 1
    +  }
    +}
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Successful operation + JobOptionalRead +

    404

    + Object with given id was not found. + NotFoundKnownExceptionInfo +

    422

    + Input failed validation + InvalidInputExceptionInfo +
    +
    Up @@ -4965,6 +5044,7 @@

    Example data

    "job" : { "createdAt" : 6, "configId" : "configId", + "startedAt" : 5, "id" : 0, "resetConfig" : { "streamsToReset" : [ { @@ -4979,12 +5059,12 @@

    Example data

    }, "attempts" : [ { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -4992,53 +5072,53 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -5046,50 +5126,51 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 } ] }, { "job" : { "createdAt" : 6, "configId" : "configId", + "startedAt" : 5, "id" : 0, "resetConfig" : { "streamsToReset" : [ { @@ -5104,12 +5185,12 @@

    Example data

    }, "attempts" : [ { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -5117,53 +5198,53 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 }, { "totalStats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "failureSummary" : { "failures" : [ { @@ -5171,45 +5252,45 @@

    Example data

    "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 }, { "retryable" : true, "stacktrace" : "stacktrace", "internalMessage" : "internalMessage", "externalMessage" : "externalMessage", - "timestamp" : 6 + "timestamp" : 7 } ], "partialSuccess" : true }, - "createdAt" : 5, - "bytesSynced" : 9, - "endedAt" : 7, + "createdAt" : 2, + "bytesSynced" : 3, + "endedAt" : 9, "streamStats" : [ { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" }, { "stats" : { - "stateMessagesEmitted" : 7, + "stateMessagesEmitted" : 1, "recordsCommitted" : 1, - "bytesEmitted" : 4, - "estimatedBytes" : 1, + "bytesEmitted" : 7, + "estimatedBytes" : 6, "estimatedRecords" : 1, - "recordsEmitted" : 2 + "recordsEmitted" : 4 }, "streamNamespace" : "streamNamespace", "streamName" : "streamName" } ], "id" : 5, - "recordsSynced" : 3, - "updatedAt" : 2 + "recordsSynced" : 2, + "updatedAt" : 7 } ] } ] } @@ -10267,6 +10348,7 @@

    Table of Contents

  • JobInfoLightRead -
  • JobInfoRead -
  • JobListRequestBody -
  • +
  • JobOptionalRead -
  • JobRead -
  • JobReadList -
  • JobStatus -
  • @@ -11185,6 +11267,13 @@

    JobListRequestBody - pagination (optional)

    +
    +

    JobOptionalRead - Up

    +
    +
    +
    job (optional)
    +
    +

    JobRead - Up

    @@ -11194,6 +11283,7 @@

    JobRead - configId

    createdAt
    Long format: int64
    updatedAt
    Long format: int64
    +
    startedAt (optional)
    Long format: int64
    status
    resetConfig (optional)
    From b0e5ea9479c27ae559d125563233b0ff4fb5522c Mon Sep 17 00:00:00 2001 From: Baz Date: Sat, 21 Jan 2023 12:44:36 +0200 Subject: [PATCH 016/195] =?UTF-8?q?=F0=9F=93=84=20=F0=9F=90=9B=20Source=20?= =?UTF-8?q?Netsuite:=20`check=5Fconnection`=20fix=20+=20edited=20public=20?= =?UTF-8?q?docs=20(#21645)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-netsuite/Dockerfile | 2 +- .../source-netsuite/source_netsuite/source.py | 8 ++- docs/integrations/sources/netsuite.md | 60 +++++++++++-------- 5 files changed, 43 insertions(+), 31 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index e7dfad1c3c127..09cccc9afda50 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1099,7 +1099,7 @@ - name: Netsuite sourceDefinitionId: 4f2f093d-ce44-4121-8118-9d13b7bfccd0 dockerRepository: airbyte/source-netsuite - dockerImageTag: 0.1.2 + dockerImageTag: 0.1.3 documentationUrl: https://docs.airbyte.com/integrations/sources/netsuite icon: netsuite.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index dc9f71b621a75..1a239c21a78d4 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -9374,7 +9374,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-netsuite:0.1.2" +- dockerImage: "airbyte/source-netsuite:0.1.3" spec: documentationUrl: "https://docsurl.com" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-netsuite/Dockerfile b/airbyte-integrations/connectors/source-netsuite/Dockerfile index 6633bd9c7308e..4e301fccfbd33 100644 --- a/airbyte-integrations/connectors/source-netsuite/Dockerfile +++ b/airbyte-integrations/connectors/source-netsuite/Dockerfile @@ -35,5 +35,5 @@ COPY source_netsuite ./source_netsuite ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.2 +LABEL io.airbyte.version=0.1.3 LABEL io.airbyte.name=airbyte/source-netsuite diff --git a/airbyte-integrations/connectors/source-netsuite/source_netsuite/source.py b/airbyte-integrations/connectors/source-netsuite/source_netsuite/source.py index cb4cff8ee66f0..a129e6fc57711 100644 --- a/airbyte-integrations/connectors/source-netsuite/source_netsuite/source.py +++ b/airbyte-integrations/connectors/source-netsuite/source_netsuite/source.py @@ -21,18 +21,20 @@ class SourceNetsuite(AbstractSource): logger: logging.Logger = logging.getLogger("airbyte") def auth(self, config: Mapping[str, Any]) -> OAuth1: + # the `realm` param should be in format of: 12345_SB1 + realm = config["realm"].replace("-", "_").upper() return OAuth1( client_key=config["consumer_key"], client_secret=config["consumer_secret"], resource_owner_key=config["token_key"], resource_owner_secret=config["token_secret"], - realm=config["realm"], + realm=realm, signature_method="HMAC-SHA256", ) def base_url(self, config: Mapping[str, Any]) -> str: - realm = config["realm"] - subdomain = realm.lower().replace("_", "-") + # the subdomain should be in format of: 12345-sb1 + subdomain = config["realm"].replace("_", "-").lower() return f"https://{subdomain}.suitetalk.api.netsuite.com" def get_session(self, auth: OAuth1) -> requests.Session: diff --git a/docs/integrations/sources/netsuite.md b/docs/integrations/sources/netsuite.md index ee62dc8d9c813..8747c21b99503 100644 --- a/docs/integrations/sources/netsuite.md +++ b/docs/integrations/sources/netsuite.md @@ -9,7 +9,7 @@ This connector implements the [SuiteTalk REST Web Services](https://docs.oracle. * Allowed access to all Account permissions options ## Airbyte OSS and Airbyte Cloud -* Realm +* Realm (Account ID) * Consumer Key * Consumer Secret * Token ID @@ -25,46 +25,55 @@ This connector implements the [SuiteTalk REST Web Services](https://docs.oracle. #### Step 2.1: Obtain Realm info 1. Login into your NetSuite [account](https://system.netsuite.com/pages/customerlogin.jsp?country=US) 2. Go to **Setup** » **Company** » **Company Information** -3. Copy your Account ID. It will looks like **1234567** if you use regular account or **1234567_SB2** if it is a Sandbox +3. Copy your Account ID (Realm). It should look like **1234567** for the `Production` env. or **1234567_SB2** - for a `Sandbox` #### Step 2.2: Enable features 1. Go to **Setup** » **Company** » **Enable Features** 2. Click on **SuiteCloud** tab -3. Scroll down to **Manage Authentication** section -4. Enable checkbox **TOKEN-BASED AUTHENTICATION** -5. Save changes +3. Scroll down to **SuiteScript** section +4. Enable checkbox for `CLIENT SUITESCRIPT` and `SERVER SUITESCRIPT` +5. Scroll down to **Manage Authentication** section +6. Enable checkbox `TOKEN-BASED AUTHENTICATION` +7. Scroll down to **SuiteTalk (Web Services)** +8. Enable checkbox `REST WEB SERVISES` +9. Save the changes #### Step 2.3: Create Integration (obtain Consumer Key and Consumer Secret) 1. Go to **Setup** » **Integration** » **Manage Integrations** » **New** -2. Fill the **Name** field. *It is a just description of integration* -3. **State** will keep **enabled** -4. Enable checkbox **Token-Based Authentication** on *Authentication* section +2. Fill the **Name** field (we recommend to put `airbyte-rest-integration` for a name) +3. Make sure the **State** is `enabled` +4. Enable checkbox `Token-Based Authentication` in **Authentication** section 5. Save changes -6. After that, **Consumer Key** and **Consumer Secret** will be showed once, copy them. -#### Step 2.4: Setup Role +6. After that, **Consumer Key** and **Consumer Secret** will be showed once (copy them to the safe place) +#### Step 2.4: Setup Role 1. Go to **Setup** » **Users/Roles** » **Manage Roles** » **New** -2. Fill the **Name** field. +2. Fill the **Name** field (we recommend to put `airbyte-integration-role` for a name) 3. Scroll down to **Permissions** tab -4. You need to select manually each record on selection lists and give at least **Read-only** level access on the next tabs: (Permissions, Reports, Lists, Setup, Custom Records). You strongly need to be careful and attentive on this point. -5. -#### Step 2.5: Setup User -1. Go to **Setup** » **Users/Roles** » **Manage Users** -2. In column _Name_ click on the user’s name you want to give access -3. Then click on **Edit** button under the user’s name +4. (REQUIRED) Click on `Transactions` and manually `add` all the dropdown entities with either `full` or `view` access level. +5. (REQUIRED) Click on `Reports` and manually `add` all the dropdown entities with either `full` or `view` access level. +6. (REQUIRED) Click on `Lists` and manually `add` all the dropdown entities with either `full` or `view` access level. +7. (REQUIRED) Click on `Setup` and manually `add` all the dropdown entities with either `full` or `view` access level. +* Make sure you've done all `REQUIRED` steps correctly, to avoid sync issues in the future. +* Please edit these params again when you `rename` or `customise` any `Object` in Netsuite for `airbyte-integration-role` to reflect such changes. + +#### Step 2.5: Setup User +1. Go to **Setup** » **Users/Roles** » **Manage Users** +2. In column `Name` click on the user’s name you want to give access to the `airbyte-integration-role` +3. Then click on **Edit** button under the user’s name 4. Scroll down to **Access** tab at the bottom -5. Select from dropdown list the role which you created in step 2.4 +5. Select from dropdown list the `airbyte-integration-role` role which you created in step 2.4 6. Save changes #### Step 2.6: Create Access Token for role 1. Go to **Setup** » **Users/Roles** » **Access Tokens** » **New** 2. Select an **Application Name** -3. Under **User** select the user you assigned the _Role_ in the step **2.4** -4. Inside **Role** select the one you gave to the user in the step **2.5** -5. Under **Token Name** you can give a descriptive name to the Token you are creating -6. Save changes -7. After that, **Token ID** and **Token Secret** will be showed once, copy them. +3. Under **User** select the user you assigned the `airbyte-integration-role` in the step **2.4** +4. Inside **Role** select the one you gave to the user in the step **2.5** +5. Under **Token Name** you can give a descriptive name to the Token you are creating (we recommend to put `airbyte-rest-integration-token` for a name) +6. Save changes +7. After that, **Token ID** and **Token Secret** will be showed once (copy them to the safe place) #### Step 2.7: Summary You have copied next parameters -* Realm (Account ID) +* Realm (Account ID) * Consumer Key * Consumer Secret * Token ID @@ -105,7 +114,7 @@ The NetSuite source connector supports the following [sync modes](https://docs.a ## Supported Streams -- Streams are generated based on `ROLE` and `USER` access to them as well as `Account` settings, make sure you're using `Admin` or any other custom `ROLE` granted to the Access Token, having the access to the NetSuite objects for data sync. +- Streams are generated based on `ROLE` and `USER` access to them as well as `Account` settings, make sure you're using the correct role assigned in our case `airbyte-integration-role` or any other custom `ROLE` granted to the Access Token, having the access to the NetSuite objects for data sync, please refer to the **Setup guide** > **Step 2.4** and **Setup guide** > **Step 2.5** ## Performance considerations @@ -116,5 +125,6 @@ The connector is restricted by Netsuite [Concurrency Limit per Integration](http | Version | Date | Pull Request | Subject | | :------ | :--------- | :------------------------------------------------------- | :-------------------------- | +| 0.1.3 | 2023-01-20 | [21645](https://github.com/airbytehq/airbyte/pull/21645) | Minor issues fix, Setup Guide corrections for public docs | | 0.1.1 | 2022-09-28 | [17304](https://github.com/airbytehq/airbyte/pull/17304) | Migrate to per-stream state | | 0.1.0 | 2022-09-15 | [16093](https://github.com/airbytehq/airbyte/pull/16093) | Initial Alpha release | From 0548d5f8493f9dcac82c928d250ff861d5ba9832 Mon Sep 17 00:00:00 2001 From: Andy Jih Date: Sat, 21 Jan 2023 10:47:43 -0800 Subject: [PATCH 017/195] minor copy change (#21681) --- airbyte-webapp/src/packages/cloud/locales/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-webapp/src/packages/cloud/locales/en.json b/airbyte-webapp/src/packages/cloud/locales/en.json index 25bb28b00a51c..d86f8b13e677c 100644 --- a/airbyte-webapp/src/packages/cloud/locales/en.json +++ b/airbyte-webapp/src/packages/cloud/locales/en.json @@ -185,8 +185,8 @@ "freeConnectorProgram.enroll.description": "Enroll in the Free Connector Program to use Alpha and Beta connectors for free.", "freeConnectorProgram.enroll.success": "Successfully enrolled in the Free Connector Program", "freeConnectorProgram.enrollmentModal.title": "Free connector program", - "freeConnectorProgram.enrollmentModal.free": "Alpha and Beta Connectors are free while you're in the program.The whole Connection is free until both Connectors have move into General Availability (GA)", - "freeConnectorProgram.enrollmentModal.emailNotification": "We will let you know through email before a Connector you use moves to GA", + "freeConnectorProgram.enrollmentModal.free": "Alpha and Beta Connectors are free while you're in the program.The whole Connection is free until both Connectors have moved into General Availability (GA)", + "freeConnectorProgram.enrollmentModal.emailNotification": "We will email you before both connectors in a connection move to GA.", "freeConnectorProgram.enrollmentModal.cardOnFile": "When both Connectors are in GA, the Connection will no longer be free. You'll need to have a credit card on file to enroll so Airbyte can handle a Connection's transition to paid service.", "freeConnectorProgram.enrollmentModal.unvalidatedEmailWarning": "You need to verify your email address before you can enroll in the Free Connector Program. Re-send verification email.", "freeConnectorProgram.enrollmentModal.validationEmailConfirmation": "Verification email sent", From 126ce3628b5c640d159d42e9b17f33f9b5ed3a5c Mon Sep 17 00:00:00 2001 From: VitaliiMaltsev <39538064+VitaliiMaltsev@users.noreply.github.com> Date: Sun, 22 Jan 2023 18:03:37 +0200 Subject: [PATCH 018/195] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20connection=20lea?= =?UTF-8?q?k=20in=20StreamingJdbcDatabase=20(#20888)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixed connection leak in StreamingJdbcDatabase * fixed checkstyle --- .../java/io/airbyte/db/jdbc/JdbcDatabase.java | 2 ++ .../io/airbyte/db/jdbc/StreamingJdbcDatabase.java | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/JdbcDatabase.java b/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/JdbcDatabase.java index 18fb509c225fb..b59c97e5db9d7 100644 --- a/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/JdbcDatabase.java +++ b/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/JdbcDatabase.java @@ -29,6 +29,8 @@ public abstract class JdbcDatabase extends SqlDatabase { protected final JdbcCompatibleSourceOperations sourceOperations; + protected Exception streamException; + protected boolean isStreamFailed; public JdbcDatabase(final JdbcCompatibleSourceOperations sourceOperations) { this.sourceOperations = sourceOperations; diff --git a/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/StreamingJdbcDatabase.java b/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/StreamingJdbcDatabase.java index ba8bd82ca9dbd..6fb7f3f60948d 100644 --- a/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/StreamingJdbcDatabase.java +++ b/airbyte-db/db-lib/src/main/java/io/airbyte/db/jdbc/StreamingJdbcDatabase.java @@ -71,6 +71,9 @@ public Stream unsafeQuery(final CheckedFunction Stream unsafeQuery(final CheckedFunction Stream toUnsafeStream(final ResultSet resultSet, - final CheckedFunction mapper, - final JdbcStreamingQueryConfig streamingConfig) { + protected Stream toUnsafeStream(final ResultSet resultSet, + final CheckedFunction mapper, + final JdbcStreamingQueryConfig streamingConfig) { return StreamSupport.stream(new Spliterators.AbstractSpliterator<>(Long.MAX_VALUE, Spliterator.ORDERED) { @Override @@ -102,7 +105,11 @@ public boolean tryAdvance(final Consumer action) { return true; } catch (final SQLException e) { LOGGER.error("SQLState: {}, Message: {}", e.getSQLState(), e.getMessage()); - throw new RuntimeException(e); + streamException = e; + isStreamFailed = true; + // throwing an exception in tryAdvance() method lead to the endless loop in Spliterator and stream + // will never close + return false; } } From b83cd5763ebe3b1a7a6e98063448b75a734e31fe Mon Sep 17 00:00:00 2001 From: Denys Davydov Date: Mon, 23 Jan 2023 10:18:21 +0200 Subject: [PATCH 019/195] Source Instagram: test strictness level high (#21602) * #19049 source instagram: test strictness level high * #19049 source instagram - upd changelog * #19049 source instagram: upd expected records * #19049 sourcte instagram: update expected records * #19049 source instagram: exclude Media stream from sat * #19049 source instagram: bypass users stream * auto-bump connector version Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-instagram/Dockerfile | 2 +- .../acceptance-test-config.yml | 88 ++++++++++++------- .../integration_tests/abnormal_state.json | 12 +++ .../configured_catalog_without_stories.json | 79 ----------------- .../integration_tests/expected_records.jsonl | 18 ++++ .../incremental_catalog.json | 19 ++++ .../connectors/source-instagram/setup.py | 2 +- .../source_instagram/streams.py | 2 + docs/integrations/sources/instagram.md | 3 +- 11 files changed, 113 insertions(+), 116 deletions(-) create mode 100644 airbyte-integrations/connectors/source-instagram/integration_tests/abnormal_state.json delete mode 100644 airbyte-integrations/connectors/source-instagram/integration_tests/configured_catalog_without_stories.json create mode 100644 airbyte-integrations/connectors/source-instagram/integration_tests/expected_records.jsonl create mode 100644 airbyte-integrations/connectors/source-instagram/integration_tests/incremental_catalog.json diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 09cccc9afda50..dd2baf95cd869 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -796,7 +796,7 @@ - name: Instagram sourceDefinitionId: 6acf6b55-4f1e-4fca-944e-1a3caef8aba8 dockerRepository: airbyte/source-instagram - dockerImageTag: 1.0.0 + dockerImageTag: 1.0.1 documentationUrl: https://docs.airbyte.com/integrations/sources/instagram icon: instagram.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 1a239c21a78d4..65312a1bcb83d 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -6648,7 +6648,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-instagram:1.0.0" +- dockerImage: "airbyte/source-instagram:1.0.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/instagram" changelogUrl: "https://docs.airbyte.com/integrations/sources/instagram" diff --git a/airbyte-integrations/connectors/source-instagram/Dockerfile b/airbyte-integrations/connectors/source-instagram/Dockerfile index 8dadf21002333..7e6ab0aa0f94e 100644 --- a/airbyte-integrations/connectors/source-instagram/Dockerfile +++ b/airbyte-integrations/connectors/source-instagram/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=1.0.0 +LABEL io.airbyte.version=1.0.1 LABEL io.airbyte.name=airbyte/source-instagram diff --git a/airbyte-integrations/connectors/source-instagram/acceptance-test-config.yml b/airbyte-integrations/connectors/source-instagram/acceptance-test-config.yml index 0a53d8267a4d8..bbbfbff25b893 100644 --- a/airbyte-integrations/connectors/source-instagram/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-instagram/acceptance-test-config.yml @@ -1,40 +1,64 @@ # See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-instagram:dev -tests: +test_strictness_level: high +acceptance_tests: spec: - - spec_path: "integration_tests/spec.json" + tests: + - spec_path: "integration_tests/spec.json" connection: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + tests: + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" discovery: - - config_path: "secrets/config.json" + tests: + - config_path: "secrets/config.json" basic_read: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog_without_stories.json" -# disabled because the only incremental stream is user_insights and its state is nested -# incremental: -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog.json" -# future_state_path: "integration_tests/abnormal_state.json" + tests: + - config_path: "secrets/config.json" + expect_records: + path: "integration_tests/expected_records.jsonl" + empty_streams: + - name: "media" + bypass_reason: "Floating data" + - name: "users" + bypass_reason: "Profile picture url is not constant" + - name: "stories" + bypass_reason: "Stories only live for 24 hours" + - name: "story_insights" + bypass_reason: "Stories only live for 24 hours, so do the insights" full_refresh: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - ignored_fields: - "user_insights": - - email_contacts - - follower_count - - get_directions_clicks - - impressions - - phone_call_clicks - - profile_views - - reach - - text_message_clicks - - website_clicks - - impressions_week - - reach_week - - impressions_days_28 - - reach_days_28 - - online_followers \ No newline at end of file + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + ignored_fields: + "user_insights": + - email_contacts + - follower_count + - get_directions_clicks + - impressions + - phone_call_clicks + - profile_views + - reach + - text_message_clicks + - website_clicks + - impressions_week + - reach_week + - impressions_days_28 + - reach_days_28 + - online_followers + incremental: + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/incremental_catalog.json" + future_state: + future_state_path: "integration_tests/abnormal_state.json" + cursor_paths: + user_insights: ["17841408147298757", "date"] + # because state is complex and stores values for different accounts on one hand + # and there's no way we can set multiple cursor paths for a single stream on the other, + # this test should be skipped as it is false negative. + # (we can not restrict accounts via config as well) + skip_comprehensive_incremental_tests: true \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-instagram/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-instagram/integration_tests/abnormal_state.json new file mode 100644 index 0000000000000..8bf6c05504872 --- /dev/null +++ b/airbyte-integrations/connectors/source-instagram/integration_tests/abnormal_state.json @@ -0,0 +1,12 @@ +[ + { + "type": "STREAM", + "stream": { + "stream_state": { + "17841408147298757": { "date": "2222-01-01T00:00:00Z" }, + "17841403112736866": { "date": "2222-01-01T00:00:00Z" } + }, + "stream_descriptor": { "name": "user_insights" } + } + } +] diff --git a/airbyte-integrations/connectors/source-instagram/integration_tests/configured_catalog_without_stories.json b/airbyte-integrations/connectors/source-instagram/integration_tests/configured_catalog_without_stories.json deleted file mode 100644 index 3df5fddbed01c..0000000000000 --- a/airbyte-integrations/connectors/source-instagram/integration_tests/configured_catalog_without_stories.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "streams": [ - { - "stream": { - "name": "media", - "json_schema": {}, - "supported_sync_modes": ["full_refresh"], - "source_defined_cursor": null, - "default_cursor_field": null, - "source_defined_primary_key": [["id"]], - "namespace": null - }, - "sync_mode": "full_refresh", - "cursor_field": null, - "destination_sync_mode": "append", - "primary_key": null - }, - { - "stream": { - "name": "media_insights", - "json_schema": {}, - "supported_sync_modes": ["full_refresh"], - "source_defined_cursor": null, - "default_cursor_field": null, - "source_defined_primary_key": [["id"]], - "namespace": null - }, - "sync_mode": "full_refresh", - "cursor_field": null, - "destination_sync_mode": "append", - "primary_key": null - }, - { - "stream": { - "name": "users", - "json_schema": {}, - "supported_sync_modes": ["full_refresh"], - "source_defined_cursor": null, - "default_cursor_field": null, - "source_defined_primary_key": [["id"]], - "namespace": null - }, - "sync_mode": "full_refresh", - "cursor_field": null, - "destination_sync_mode": "append", - "primary_key": null - }, - { - "stream": { - "name": "user_lifetime_insights", - "json_schema": {}, - "supported_sync_modes": ["full_refresh"], - "source_defined_cursor": null, - "default_cursor_field": null, - "source_defined_primary_key": null, - "namespace": null - }, - "sync_mode": "full_refresh", - "cursor_field": null, - "destination_sync_mode": "append", - "primary_key": null - }, - { - "stream": { - "name": "user_insights", - "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": true, - "default_cursor_field": ["date"], - "source_defined_primary_key": null, - "namespace": null - }, - "sync_mode": "full_refresh", - "cursor_field": null, - "destination_sync_mode": "append", - "primary_key": null - } - ] -} diff --git a/airbyte-integrations/connectors/source-instagram/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-instagram/integration_tests/expected_records.jsonl new file mode 100644 index 0000000000000..b6442a870bb78 --- /dev/null +++ b/airbyte-integrations/connectors/source-instagram/integration_tests/expected_records.jsonl @@ -0,0 +1,18 @@ +{"stream": "media_insights", "data": {"engagement": 3, "impressions": 145, "reach": 141, "saved": 1, "video_views": 50, "id": "17990014330517797", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213559669} +{"stream": "media_insights", "data": {"carousel_album_engagement": 10, "carousel_album_impressions": 844, "carousel_album_reach": 709, "saved": 2, "id": "17866123508374641", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213559966} +{"stream": "media_insights", "data": {"engagement": 30, "impressions": 474, "reach": 428, "saved": 2, "id": "18036549181220554", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213560249} +{"stream": "media_insights", "data": {"engagement": 18, "impressions": 319, "reach": 294, "saved": 0, "id": "17851446202651273", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213560576} +{"stream": "media_insights", "data": {"engagement": 30, "impressions": 188, "reach": 180, "saved": 3, "id": "17879859175449567", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213560889} +{"stream": "media_insights", "data": {"engagement": 20, "impressions": 140, "reach": 135, "saved": 2, "id": "17847571591686839", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213561193} +{"stream": "media_insights", "data": {"engagement": 22, "impressions": 100, "reach": 96, "saved": 0, "id": "18075437350133485", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213561448} +{"stream": "media_insights", "data": {"engagement": 20, "impressions": 71, "reach": 68, "saved": 2, "id": "17846350990714113", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213561747} +{"stream": "media_insights", "data": {"engagement": 15, "impressions": 65, "reach": 61, "saved": 0, "id": "17980709605286481", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213562115} +{"stream": "media_insights", "data": {"engagement": 13, "impressions": 57, "reach": 55, "saved": 0, "id": "18076537066186055", "page_id": "112704783733939", "business_account_id": "17841408147298757"}, "emitted_at": 1674213562572} +{"stream": "user_lifetime_insights", "data": {"page_id": "112704783733939", "business_account_id": "17841408147298757", "metric": "audience_city", "date": "2023-01-20T08:00:00+0000", "value": {"London, England": 6, "Sydney, New South Wales": 17, "Atlanta, Georgia": 5, "S\u00e3o Paulo, S\u00e3o Paulo (state)": 13, "Rio de Janeiro, Rio de Janeiro (state)": 5, "Hong Kong, Hong Kong": 4, "Berlin, Berlin": 4, "Kolkata, West Bengal": 5, "Tulsa, Oklahoma": 3, "Austin, Texas": 4, "Kyiv, Kyiv": 4, "Lagos, Lagos State": 16, "San Jose, California": 4, "Kano, Kano State": 4, "Pune, Maharashtra": 6, "Huntsville, Alabama": 3, "Skopje, Municipality of Centar (Skopje)": 4, "Moscow, Moscow": 6, "Bogot\u00e1, Distrito Especial": 5, "Dar es Salaam, Dar es Salaam": 6, "Jakarta, Jakarta": 7, "Accra, Greater Accra Region": 4, "Buenos Aires, Ciudad Aut\u00f3noma de Buenos Aires": 6, "Melbourne, Victoria": 10, "Gurugram, Haryana": 4, "Los Angeles, California": 8, "Madrid, Comunidad de Madrid": 4, "Spring Valley, Nevada": 3, "Lima, Lima Region": 5, "Istanbul, Istanbul Province": 8, "Chennai, Tamil Nadu": 5, "Abuja, Federal Capital Territory": 5, "Mexico City, Distrito Federal": 7, "Cape Town, Western Cape": 4, "San Francisco, California": 6, "Greater Noida, Uttar Pradesh": 3, "Tehran, Tehran Province": 7, "New York, New York": 15, "Dubai, Dubai": 4, "Santiago, Santiago Metropolitan Region": 9, "Mumbai, Maharashtra": 6, "Bangalore, Karnataka": 14, "Singapore, Singapore": 5, "Hyderabad, Telangana": 4, "San Diego, California": 4}}, "emitted_at": 1674213658786} +{"stream": "user_lifetime_insights", "data": {"page_id": "112704783733939", "business_account_id": "17841408147298757", "metric": "audience_country", "date": "2023-01-20T08:00:00+0000", "value": {"DE": 29, "BD": 5, "TW": 6, "RU": 13, "PT": 4, "TZ": 8, "UA": 5, "FR": 8, "SA": 9, "BR": 66, "SE": 6, "SG": 5, "MA": 6, "DZ": 6, "ID": 26, "GB": 40, "CA": 28, "US": 268, "EG": 10, "AE": 6, "CH": 8, "IN": 119, "ZA": 16, "IQ": 7, "CL": 11, "IR": 12, "GR": 6, "IT": 16, "MX": 27, "MY": 11, "CO": 12, "ES": 13, "VE": 8, "AR": 19, "AT": 5, "TH": 6, "AU": 37, "PE": 5, "PH": 7, "NG": 30, "TN": 6, "PK": 11, "PL": 4, "TR": 9, "NL": 12}}, "emitted_at": 1674213658786} +{"stream": "user_lifetime_insights", "data": {"page_id": "112704783733939", "business_account_id": "17841408147298757", "metric": "audience_gender_age", "date": "2023-01-20T08:00:00+0000", "value": {"F.18-24": 13, "F.25-34": 90, "F.35-44": 66, "F.45-54": 16, "F.55-64": 1, "F.65+": 4, "M.13-17": 5, "M.18-24": 73, "M.25-34": 374, "M.35-44": 212, "M.45-54": 67, "M.55-64": 16, "M.65+": 14, "U.18-24": 23, "U.25-34": 65, "U.35-44": 29, "U.45-54": 19, "U.55-64": 4, "U.65+": 1}}, "emitted_at": 1674213658786} +{"stream": "user_lifetime_insights", "data": {"page_id": "112704783733939", "business_account_id": "17841408147298757", "metric": "audience_locale", "date": "2023-01-20T08:00:00+0000", "value": {"el_GR": 1, "it_IT": 12, "ru_RU": 13, "pl_PL": 2, "tr_TR": 4, "id_ID": 15, "es_US": 1, "pt_BR": 50, "th_TH": 1, "ja_JP": 1, "fr_FR": 18, "de_DE": 22, "ms_MY": 1, "zh_TW": 3, "es_MX": 7, "es_CO": 3, "es_ES": 10, "es_CL": 3, "nl_NL": 7, "es_LA": 56, "fr_CA": 1, "es_VE": 1, "sv_SE": 5, "da_DK": 1, "fa_IR": 2, "sr_RS": 1, "hr_HR": 1, "fi_FI": 2, "ar_AR": 6, "en_GB": 111, "ko_KR": 2, "en_US": 695, "lv_LV": 1, "uk_UA": 2, "en_IN": 26, "zh_CN": 3, "ar_AE": 1}}, "emitted_at": 1674213658786} +{"stream": "user_insights", "data": {"page_id": "112704783733939", "business_account_id": "17841408147298757", "email_contacts": 0, "date": "2022-12-22T08:00:00+0000", "follower_count": 1, "get_directions_clicks": 0, "impressions": 0, "phone_call_clicks": 0, "profile_views": 1, "reach": 0, "text_message_clicks": 0, "website_clicks": 0, "impressions_week": 26, "reach_week": 8, "impressions_days_28": 8388, "reach_days_28": 2549, "online_followers": {"0": 162, "1": 184, "2": 185, "3": 214, "4": 249, "5": 261, "6": 266, "7": 269, "8": 287, "9": 285, "10": 260, "11": 276, "12": 261, "13": 244, "14": 247, "15": 227, "16": 236, "17": 216, "18": 208, "19": 213, "20": 194, "21": 175, "22": 162, "23": 176}}, "emitted_at": 1674213660433} +{"stream": "user_insights", "data": {"page_id": "112704783733939", "business_account_id": "17841408147298757", "email_contacts": 0, "date": "2022-12-23T08:00:00+0000", "follower_count": 0, "get_directions_clicks": 0, "impressions": 0, "phone_call_clicks": 0, "profile_views": 0, "reach": 0, "text_message_clicks": 0, "website_clicks": 0, "impressions_week": 10, "reach_week": 6, "impressions_days_28": 8274, "reach_days_28": 2521, "online_followers": {"0": 175, "1": 178, "2": 188, "3": 228, "4": 247, "5": 278, "6": 276, "7": 273, "8": 295, "9": 283, "10": 283, "11": 278, "12": 254, "13": 253, "14": 221, "15": 228, "16": 224, "17": 210, "18": 215, "19": 222, "20": 215, "21": 183, "22": 180, "23": 170}}, "emitted_at": 1674213661691} +{"stream": "user_insights", "data": {"page_id": "112704783733939", "business_account_id": "17841408147298757", "email_contacts": 0, "date": "2022-12-24T08:00:00+0000", "follower_count": 0, "get_directions_clicks": 0, "impressions": 0, "phone_call_clicks": 0, "profile_views": 0, "reach": 0, "text_message_clicks": 0, "website_clicks": 0, "impressions_week": 10, "reach_week": 6, "impressions_days_28": 8274, "reach_days_28": 2521, "online_followers": {"0": 169, "1": 157, "2": 187, "3": 192, "4": 219, "5": 238, "6": 259, "7": 281, "8": 285, "9": 298, "10": 278, "11": 278, "12": 247, "13": 277, "14": 266, "15": 233, "16": 202, "17": 207, "18": 200, "19": 225, "20": 225, "21": 226, "22": 186, "23": 183}}, "emitted_at": 1674213662878} +{"stream": "user_insights", "data": {"page_id": "112704783733939", "business_account_id": "17841408147298757", "email_contacts": 0, "date": "2022-12-25T08:00:00+0000", "follower_count": 1, "get_directions_clicks": 0, "impressions": 0, "phone_call_clicks": 0, "profile_views": 0, "reach": 0, "text_message_clicks": 0, "website_clicks": 0, "impressions_week": 8, "reach_week": 5, "impressions_days_28": 8271, "reach_days_28": 2521, "online_followers": {"0": 198, "1": 182, "2": 181, "3": 183, "4": 192, "5": 243, "6": 271, "7": 269, "8": 283, "9": 290, "10": 272, "11": 278, "12": 275, "13": 271, "14": 270, "15": 233, "16": 238, "17": 215, "18": 215, "19": 216, "20": 200, "21": 185, "22": 180, "23": 165}}, "emitted_at": 1674213664240} diff --git a/airbyte-integrations/connectors/source-instagram/integration_tests/incremental_catalog.json b/airbyte-integrations/connectors/source-instagram/integration_tests/incremental_catalog.json new file mode 100644 index 0000000000000..3a48ffe85ae1f --- /dev/null +++ b/airbyte-integrations/connectors/source-instagram/integration_tests/incremental_catalog.json @@ -0,0 +1,19 @@ +{ + "streams": [ + { + "stream": { + "name": "user_insights", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["date"], + "source_defined_primary_key": null, + "namespace": null + }, + "sync_mode": "incremental", + "cursor_field": null, + "destination_sync_mode": "append", + "primary_key": null + } + ] +} diff --git a/airbyte-integrations/connectors/source-instagram/setup.py b/airbyte-integrations/connectors/source-instagram/setup.py index 2564950e99809..31c38de6cab98 100644 --- a/airbyte-integrations/connectors/source-instagram/setup.py +++ b/airbyte-integrations/connectors/source-instagram/setup.py @@ -6,7 +6,7 @@ from setuptools import find_packages, setup MAIN_REQUIREMENTS = [ - "airbyte-cdk~=0.1", + "airbyte-cdk", "cached_property~=1.5", "facebook_business~=11.0", "pendulum>=2,<3", diff --git a/airbyte-integrations/connectors/source-instagram/source_instagram/streams.py b/airbyte-integrations/connectors/source-instagram/source_instagram/streams.py index 828eaf77f46e6..3d788c1eece24 100644 --- a/airbyte-integrations/connectors/source-instagram/source_instagram/streams.py +++ b/airbyte-integrations/connectors/source-instagram/source_instagram/streams.py @@ -218,6 +218,8 @@ def stream_slices( state_value = stream_state.get(account_id, {}).get(self.cursor_field) start_date = pendulum.parse(state_value) if state_value else self._start_date start_date = max(start_date, self._start_date, pendulum.now().subtract(days=self.buffer_days)) + if start_date > pendulum.now(): + continue for since in pendulum.period(start_date, self._end_date).range("days", self.days_increment): until = since.add(days=self.days_increment) self.logger.info(f"Reading insights between {since.date()} and {until.date()}") diff --git a/docs/integrations/sources/instagram.md b/docs/integrations/sources/instagram.md index f1027257d46d6..27e4c09cecfce 100644 --- a/docs/integrations/sources/instagram.md +++ b/docs/integrations/sources/instagram.md @@ -91,7 +91,8 @@ AirbyteRecords are required to conform to the [Airbyte type](https://docs.airbyt ## Changelog | Version | Date | Pull Request | Subject | -| :------ | :--------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------- | +|:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------| +| 1.0.1 | 2023-01-19 | [21602](https://github.com/airbytehq/airbyte/pull/21602) | Handle abnormally large state values | | 1.0.0 | 2022-09-23 | [17110](https://github.com/airbytehq/airbyte/pull/17110) | Remove custom read function and migrate to per-stream state | | 0.1.11 | 2022-09-08 | [16428](https://github.com/airbytehq/airbyte/pull/16428) | Fix requests metrics for Reels media product type | | 0.1.10 | 2022-09-05 | [16340](https://github.com/airbytehq/airbyte/pull/16340) | Update to latest version of the CDK (v0.1.81) | From e35dc2360073c49ed061bf5ef4c2b230834210f3 Mon Sep 17 00:00:00 2001 From: Denys Davydov Date: Mon, 23 Jan 2023 10:18:45 +0200 Subject: [PATCH 020/195] #1313 source google ads: write less logs (#21517) * #1313 source google ads: write less logs * #1313 source google ads: upd changelog * #1313 source google ads: fix expected records * #1313 source google ads: rm unused call to init * #1313 source google ads: fix expected records * #1313 source google ads - bump sieve outside the loop * auto-bump connector version Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-google-ads/Dockerfile | 2 +- .../acceptance-test-config.yml | 2 + .../integration_tests/expected_records.txt | 10 ---- .../source_google_ads/streams.py | 53 ++++++++++++++----- .../unit_tests/test_source.py | 14 +++-- .../unit_tests/test_streams.py | 14 ++++- docs/integrations/sources/google-ads.md | 1 + 9 files changed, 65 insertions(+), 35 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index dd2baf95cd869..9f92385c6812f 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -645,7 +645,7 @@ - name: Google Ads sourceDefinitionId: 253487c0-2246-43ba-a21f-5116b20a2c50 dockerRepository: airbyte/source-google-ads - dockerImageTag: 0.2.7 + dockerImageTag: 0.2.8 documentationUrl: https://docs.airbyte.com/integrations/sources/google-ads icon: google-adwords.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 65312a1bcb83d..b38dcf6956ae0 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -5215,7 +5215,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-google-ads:0.2.7" +- dockerImage: "airbyte/source-google-ads:0.2.8" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/google-ads" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-google-ads/Dockerfile b/airbyte-integrations/connectors/source-google-ads/Dockerfile index b084445822610..3a43a8003271d 100644 --- a/airbyte-integrations/connectors/source-google-ads/Dockerfile +++ b/airbyte-integrations/connectors/source-google-ads/Dockerfile @@ -13,5 +13,5 @@ COPY main.py ./ ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.7 +LABEL io.airbyte.version=0.2.8 LABEL io.airbyte.name=airbyte/source-google-ads diff --git a/airbyte-integrations/connectors/source-google-ads/acceptance-test-config.yml b/airbyte-integrations/connectors/source-google-ads/acceptance-test-config.yml index 0aad58fbad44e..6e136fdb23b52 100644 --- a/airbyte-integrations/connectors/source-google-ads/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-google-ads/acceptance-test-config.yml @@ -22,6 +22,8 @@ acceptance_tests: path: "integration_tests/expected_records.txt" timeout_seconds: 600 empty_streams: + - name: "accounts" + bypass_reason: "Floating data" - name: "display_topics_performance_report" bypass_reason: "Stream not filled yet." - name: "click_view" diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records.txt b/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records.txt index 6603bc6f40fcb..8071b1e4d341d 100644 --- a/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records.txt +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records.txt @@ -59,16 +59,6 @@ {"stream": "ad_groups", "data": {"ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "ad_group.campaign": "customers/4651612872/campaigns/16820250687", "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.explorer_auto_optimizer_setting.opt_in": false, "ad_group.final_url_suffix": "", "ad_group.id": 137020701042, "ad_group.labels": [], "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/137020701042", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": [], "segments.date": "2022-04-12"}, "emitted_at": 1671617356027} {"stream": "ad_groups", "data": {"ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "ad_group.campaign": "customers/4651612872/campaigns/16820250687", "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.explorer_auto_optimizer_setting.opt_in": false, "ad_group.final_url_suffix": "", "ad_group.id": 137051662444, "ad_group.labels": [], "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/137051662444", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": [], "segments.date": "2022-04-12"}, "emitted_at": 1671617356028} {"stream": "ad_groups", "data": {"ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "ad_group.campaign": "customers/4651612872/campaigns/16820250687", "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.explorer_auto_optimizer_setting.opt_in": false, "ad_group.final_url_suffix": "", "ad_group.id": 137020701042, "ad_group.labels": [], "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/137020701042", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": [], "segments.date": "2022-04-13"}, "emitted_at": 1671617356029} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-08"}, "emitted_at": 1673361973477} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-09"}, "emitted_at": 1673361973478} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-10"}, "emitted_at": 1673361973479} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-11"}, "emitted_at": 1673361973479} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-12"}, "emitted_at": 1673361973480} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-13"}, "emitted_at": 1673361973481} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-14"}, "emitted_at": 1673361973481} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-15"}, "emitted_at": 1673361973482} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-16"}, "emitted_at": 1673361973483} -{"stream": "accounts", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.4809464, "customer.optimization_score_weight": 14.093616, "customer.pay_per_conversion_eligibility_failure_reasons": ["CustomerPayPerConversionEligibilityFailureReason.NOT_ENOUGH_CONVERSIONS"], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "", "segments.date": "2022-04-17"}, "emitted_at": 1673361973996} {"stream": "campaigns", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "TARGET_SPEND", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/10695604507", "campaign_budget.amount_micros": 750000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 16820250687, "campaign.labels": [], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "Website traffic-Search-15", "campaign.network_settings.target_content_network": true, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": true, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/16820250687", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.shopping_setting.sales_country": "", "campaign.start_date": "2022-04-08", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm": "", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 0, "metrics.ctr": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.impressions": 2.0, "metrics.video_views": 0.0, "metrics.video_quartile_p100_rate": 0.0, "segments.date": "2022-04-08", "segments.hour": 21.0}, "emitted_at": 1671617378643} {"stream": "campaigns", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "TARGET_SPEND", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/10695604507", "campaign_budget.amount_micros": 750000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 16820250687, "campaign.labels": [], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "Website traffic-Search-15", "campaign.network_settings.target_content_network": true, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": true, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/16820250687", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.shopping_setting.sales_country": "", "campaign.start_date": "2022-04-08", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm": "", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 0, "metrics.ctr": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.impressions": 1.0, "metrics.video_views": 0.0, "metrics.video_quartile_p100_rate": 0.0, "segments.date": "2022-04-09", "segments.hour": 2.0}, "emitted_at": 1671617378653} {"stream": "campaigns", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "TARGET_SPEND", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/10695604507", "campaign_budget.amount_micros": 750000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 16820250687, "campaign.labels": [], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "Website traffic-Search-15", "campaign.network_settings.target_content_network": true, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": true, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/16820250687", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.shopping_setting.sales_country": "", "campaign.start_date": "2022-04-08", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm": "", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 0, "metrics.ctr": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.impressions": 4.0, "metrics.video_views": 0.0, "metrics.video_quartile_p100_rate": 0.0, "segments.date": "2022-04-09", "segments.hour": 7.0}, "emitted_at": 1671617378663} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/streams.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/streams.py index f51264e742e24..1d61f98bf3f6a 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/streams.py +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/streams.py @@ -2,6 +2,7 @@ # Copyright (c) 2022 Airbyte, Inc., all rights reserved. # +import logging from abc import ABC from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Tuple @@ -18,6 +19,24 @@ from .models import Customer +class cyclic_sieve: + def __init__(self, logger: logging.Logger, fraction: int = 10): + self._logger = logger + self._cycle_counter = 0 + self._fraction = fraction + + def __getattr__(self, item): + if self._cycle_counter % self._fraction == 0: + return getattr(self._logger, item) + return self.stub + + def stub(self, *args, **kwargs): + pass + + def bump(self): + self._cycle_counter += 1 + + def parse_dates(stream_slice): start_date = pendulum.parse(stream_slice["start_date"]) end_date = pendulum.parse(stream_slice["end_date"]) @@ -91,6 +110,7 @@ class GoogleAdsStream(Stream, ABC): def __init__(self, api: GoogleAds, customers: List[Customer]): self.google_ads_client = api self.customers = customers + self.base_sieve_logger = cyclic_sieve(self.logger, 10) def get_query(self, stream_slice: Mapping[str, Any]) -> str: query = GoogleAds.convert_schema_into_query(schema=self.get_json_schema(), report_name=self.name) @@ -105,7 +125,8 @@ def stream_slices(self, stream_state: Mapping[str, Any] = None, **kwargs) -> Ite yield {"customer_id": customer.id} def read_records(self, sync_mode, stream_slice: Optional[Mapping[str, Any]] = None, **kwargs) -> Iterable[Mapping[str, Any]]: - self.logger.info(f"Read records using g-ads client. Stream slice is {stream_slice}") + self.base_sieve_logger.bump() + self.base_sieve_logger.info(f"Read records using g-ads client. Stream slice is {stream_slice}") if stream_slice is None: return [] @@ -119,7 +140,7 @@ def read_records(self, sync_mode, stream_slice: Optional[Mapping[str, Any]] = No raise for error in exc.failure.errors: if error.error_code.authorization_error == AuthorizationErrorEnum.AuthorizationError.CUSTOMER_NOT_ENABLED: - self.logger.error(error.message) + self.base_sieve_logger.error(error.message) continue # log and ignore only CUSTOMER_NOT_ENABLED error, otherwise - raise further raise @@ -139,6 +160,7 @@ def __init__(self, start_date: str, conversion_window_days: int, end_date: str = self._end_date = end_date self._state = {} super().__init__(**kwargs) + self.incremental_sieve_logger = cyclic_sieve(self.logger, 10) @property def state(self) -> MutableMapping[str, Any]: @@ -154,6 +176,7 @@ def current_state(self, customer_id, default=None): def stream_slices(self, stream_state: Mapping[str, Any] = None, **kwargs) -> Iterable[Optional[MutableMapping[str, any]]]: for customer in self.customers: + logger = cyclic_sieve(self.logger, 10) stream_state = stream_state or {} if stream_state.get(customer.id): start_date = stream_state[customer.id].get(self.cursor_field) or self._start_date @@ -165,7 +188,7 @@ def stream_slices(self, stream_state: Mapping[str, Any] = None, **kwargs) -> Ite start_date = self._start_date end_date = self._end_date - self.logger.info(f"Generating slices for customer {customer.id}. Start date is {start_date}, end date is {end_date}") + logger.info(f"Generating slices for customer {customer.id}. Start date is {start_date}, end date is {end_date}") for chunk in chunk_date_range( start_date=start_date, @@ -178,7 +201,8 @@ def stream_slices(self, stream_state: Mapping[str, Any] = None, **kwargs) -> Ite ): if chunk: chunk["customer_id"] = customer.id - self.logger.info(f"Next slice is {chunk}") + logger.info(f"Next slice is {chunk}") + logger.bump() yield chunk def read_records( @@ -188,8 +212,9 @@ def read_records( This method is overridden to handle GoogleAdsException with EXPIRED_PAGE_TOKEN error code, and update `start_date` key in the `stream_slice` with the latest read record's cursor value, then retry the sync. """ + self.incremental_sieve_logger.bump() while True: - self.logger.info("Starting a while loop iteration") + self.incremental_sieve_logger.info("Starting a while loop iteration") customer_id = stream_slice and stream_slice["customer_id"] try: records = super().read_records(sync_mode, stream_slice=stream_slice) @@ -200,38 +225,40 @@ def read_records( date_in_latest_record = pendulum.parse(record[self.cursor_field]) cursor_value = (max(date_in_current_stream, date_in_latest_record)).to_date_string() self.state = {customer_id: {self.cursor_field: cursor_value}} - self.logger.info(f"Updated state for customer {customer_id}. Full state is {self.state}.") + self.incremental_sieve_logger.info(f"Updated state for customer {customer_id}. Full state is {self.state}.") yield record continue self.state = {customer_id: {self.cursor_field: record[self.cursor_field]}} - self.logger.info(f"Initialized state for customer {customer_id}. Full state is {self.state}.") + self.incremental_sieve_logger.info(f"Initialized state for customer {customer_id}. Full state is {self.state}.") yield record continue except GoogleAdsException as exception: - self.logger.info(f"Caught a GoogleAdsException: {str(exception)}") + self.incremental_sieve_logger.info(f"Caught a GoogleAdsException: {str(exception)}") error = next(iter(exception.failure.errors)) if error.error_code.request_error == RequestErrorEnum.RequestError.EXPIRED_PAGE_TOKEN: start_date, end_date = parse_dates(stream_slice) current_state = self.current_state(customer_id) - self.logger.info(f"Start date is {start_date}. End date is {end_date}. Current state is {current_state}") + self.incremental_sieve_logger.info( + f"Start date is {start_date}. End date is {end_date}. Current state is {current_state}" + ) if (end_date - start_date).days == 1: # If range days is 1, no need in retry, because it's the minimum date range - self.logger.error("Page token has expired.") + self.incremental_sieve_logger.error("Page token has expired.") raise exception elif current_state == stream_slice["start_date"]: # It couldn't read all the records within one day, it will enter an infinite loop, # so raise the error - self.logger.error("Page token has expired.") + self.incremental_sieve_logger.error("Page token has expired.") raise exception # Retry reading records from where it crushed stream_slice["start_date"] = self.current_state(customer_id, default=stream_slice["start_date"]) - self.logger.info(f"Retry reading records from where it crushed with a modified slice: {stream_slice}") + self.incremental_sieve_logger.info(f"Retry reading records from where it crushed with a modified slice: {stream_slice}") else: # raise caught error for other error statuses raise exception else: # return the control if no exception is raised - self.logger.info("Current slice has been read. Exiting read_records()") + self.incremental_sieve_logger.info("Current slice has been read. Exiting read_records()") return def get_query(self, stream_slice: Mapping[str, Any] = None) -> str: diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_source.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_source.py index 072e2a0626a41..23d115b927e8d 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_source.py @@ -526,15 +526,15 @@ def test_invalid_custom_query_handled(mocked_gads_api, config): @pytest.mark.parametrize( - ("cls", "error", "failure_code", "raise_expected", "log_expected"), + ("cls", "error", "failure_code", "raise_expected"), ( - (AdGroupLabels, "authorization_error", AuthorizationErrorEnum.AuthorizationError.CUSTOMER_NOT_ENABLED, False, True), - (AdGroupLabels, "internal_error", 1, True, False), - (ServiceAccounts, "authentication_error", 1, True, False), - (ServiceAccounts, "internal_error", 1, True, False), + (AdGroupLabels, "authorization_error", AuthorizationErrorEnum.AuthorizationError.CUSTOMER_NOT_ENABLED, False), + (AdGroupLabels, "internal_error", 1, True), + (ServiceAccounts, "authentication_error", 1, True), + (ServiceAccounts, "internal_error", 1, True), ), ) -def test_read_record_error_handling(config, customers, caplog, mocked_gads_api, cls, error, failure_code, raise_expected, log_expected): +def test_read_record_error_handling(config, customers, caplog, mocked_gads_api, cls, error, failure_code, raise_expected): error_msg = "Some unexpected error" mocked_gads_api(failure_code=failure_code, failure_msg=error_msg, error_type=error) google_api = GoogleAds(credentials=config["credentials"]) @@ -546,8 +546,6 @@ def test_read_record_error_handling(config, customers, caplog, mocked_gads_api, else: for _ in stream.read_records(sync_mode=Mock(), stream_slice={"customer_id": "1234567890"}): pass - error_in_log = error_msg in caplog.text - assert error_in_log is log_expected def test_stream_slices(config, customers): diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_streams.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_streams.py index 7e600bef4991a..632c272179633 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_streams.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_streams.py @@ -2,6 +2,7 @@ # Copyright (c) 2022 Airbyte, Inc., all rights reserved. # +import logging from unittest.mock import Mock import pytest @@ -12,7 +13,7 @@ from google.api_core.exceptions import DataLoss, InternalServerError, ResourceExhausted, TooManyRequests from grpc import RpcError from source_google_ads.google_ads import GoogleAds -from source_google_ads.streams import ClickView +from source_google_ads.streams import ClickView, cyclic_sieve from .common import MockGoogleAdsClient as MockGoogleAdsClient @@ -218,3 +219,14 @@ def test_retry_transient_errors(mocker, config, customers, error_cls): records = list(stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["segments.date"], stream_slice=stream_slice)) assert mocked_search.call_count == 5 assert records == [] + + +def test_cyclic_sieve(caplog): + original_logger = logging.getLogger("test") + sieve = cyclic_sieve(original_logger, fraction=10) + for _ in range(20): + sieve.info("Ground Control to Major Tom") + sieve.info("Your circuit's dead, there's something wrong") + sieve.info("Can you hear me, Major Tom?") + sieve.bump() + assert len(caplog.records) == 6 # 20 * 3 / 10 diff --git a/docs/integrations/sources/google-ads.md b/docs/integrations/sources/google-ads.md index 3c2177cc32f4b..5077574c55e5e 100644 --- a/docs/integrations/sources/google-ads.md +++ b/docs/integrations/sources/google-ads.md @@ -139,6 +139,7 @@ Due to a limitation in the Google Ads API which does not allow getting performan | Version | Date | Pull Request | Subject | |:---------|:-----------|:---------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------| +| `0.2.8` | 2023-01-18 | [21517](https://github.com/airbytehq/airbyte/pull/21517) | Write fewer logs | | `0.2.7` | 2023-01-10 | [20755](https://github.com/airbytehq/airbyte/pull/20755) | Add more logs to debug stuck syncs | | `0.2.6` | 2022-12-22 | [20855](https://github.com/airbytehq/airbyte/pull/20855) | Retry 429 and 5xx errors | | `0.2.5` | 2022-11-22 | [19700](https://github.com/airbytehq/airbyte/pull/19700) | Fix schema for `campaigns` stream | From dd0706e8015e1a2f4631121394b0083d6d4b5b6c Mon Sep 17 00:00:00 2001 From: Sergio Ropero <42538006+sergio-ropero@users.noreply.github.com> Date: Mon, 23 Jan 2023 14:36:44 +0100 Subject: [PATCH 021/195] fix: Introduces back the `initial_waiting_seconds` option for MSSQL source. (#21348) Introduces back the `initial_waiting_seconds` option for MSSQL source. --- .../main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 14 +++++++++++++- .../source-mssql-strict-encrypt/Dockerfile | 2 +- .../src/test/resources/expected_spec.json | 9 +++++++++ .../connectors/source-mssql/Dockerfile | 2 +- .../source-mssql/src/main/resources/spec.json | 9 +++++++++ .../test-integration/resources/expected_spec.json | 9 +++++++++ docs/integrations/sources/mssql.md | 3 ++- 8 files changed, 45 insertions(+), 5 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 9f92385c6812f..e368e561666eb 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1019,7 +1019,7 @@ - name: Microsoft SQL Server (MSSQL) sourceDefinitionId: b5ea17b1-f170-46dc-bc31-cc744ca984c1 dockerRepository: airbyte/source-mssql - dockerImageTag: 0.4.27 + dockerImageTag: 0.4.28 documentationUrl: https://docs.airbyte.com/integrations/sources/mssql icon: mssql.svg sourceType: database diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index b38dcf6956ae0..2b815cffb911d 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -8113,7 +8113,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-mssql:0.4.27" +- dockerImage: "airbyte/source-mssql:0.4.28" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/mssql" connectionSpecification: @@ -8272,6 +8272,18 @@ \ the \"Snapshot\" level, you must enable the snapshot isolation mode on the database." order: 2 + initial_waiting_seconds: + type: "integer" + title: "Initial Waiting Time in Seconds (Advanced)" + description: "The amount of time the connector will wait when it launches\ + \ to determine if there is new data to sync or not. Defaults to\ + \ 300 seconds. Valid range: 120 seconds to 1200 seconds. Read about\ + \ initial waiting time." + default: 300 + min: 120 + max: 1200 + order: 3 tunnel_method: type: "object" title: "SSH Tunnel Method" diff --git a/airbyte-integrations/connectors/source-mssql-strict-encrypt/Dockerfile b/airbyte-integrations/connectors/source-mssql-strict-encrypt/Dockerfile index 3ec6c69f7c274..97644ffc9f9da 100644 --- a/airbyte-integrations/connectors/source-mssql-strict-encrypt/Dockerfile +++ b/airbyte-integrations/connectors/source-mssql-strict-encrypt/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-mssql-strict-encrypt COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=0.4.27 +LABEL io.airbyte.version=0.4.28 LABEL io.airbyte.name=airbyte/source-mssql-strict-encrypt diff --git a/airbyte-integrations/connectors/source-mssql-strict-encrypt/src/test/resources/expected_spec.json b/airbyte-integrations/connectors/source-mssql-strict-encrypt/src/test/resources/expected_spec.json index bbdae356015ac..55ef10232e9c9 100644 --- a/airbyte-integrations/connectors/source-mssql-strict-encrypt/src/test/resources/expected_spec.json +++ b/airbyte-integrations/connectors/source-mssql-strict-encrypt/src/test/resources/expected_spec.json @@ -139,6 +139,15 @@ "enum": ["Snapshot", "Read Committed"], "description": "Existing data in the database are synced through an initial snapshot. This parameter controls the isolation level that will be used during the initial snapshotting. If you choose the \"Snapshot\" level, you must enable the snapshot isolation mode on the database.", "order": 2 + }, + "initial_waiting_seconds": { + "type": "integer", + "title": "Initial Waiting Time in Seconds (Advanced)", + "description": "The amount of time the connector will wait when it launches to determine if there is new data to sync or not. Defaults to 300 seconds. Valid range: 120 seconds to 1200 seconds. Read about initial waiting time.", + "default": 300, + "min": 120, + "max": 1200, + "order": 3 } } } diff --git a/airbyte-integrations/connectors/source-mssql/Dockerfile b/airbyte-integrations/connectors/source-mssql/Dockerfile index b0624aaf167ea..44663ce0fe9c2 100644 --- a/airbyte-integrations/connectors/source-mssql/Dockerfile +++ b/airbyte-integrations/connectors/source-mssql/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-mssql COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=0.4.27 +LABEL io.airbyte.version=0.4.28 LABEL io.airbyte.name=airbyte/source-mssql diff --git a/airbyte-integrations/connectors/source-mssql/src/main/resources/spec.json b/airbyte-integrations/connectors/source-mssql/src/main/resources/spec.json index 35b192d2c4de7..9be47072c1500 100644 --- a/airbyte-integrations/connectors/source-mssql/src/main/resources/spec.json +++ b/airbyte-integrations/connectors/source-mssql/src/main/resources/spec.json @@ -150,6 +150,15 @@ "enum": ["Snapshot", "Read Committed"], "description": "Existing data in the database are synced through an initial snapshot. This parameter controls the isolation level that will be used during the initial snapshotting. If you choose the \"Snapshot\" level, you must enable the snapshot isolation mode on the database.", "order": 2 + }, + "initial_waiting_seconds": { + "type": "integer", + "title": "Initial Waiting Time in Seconds (Advanced)", + "description": "The amount of time the connector will wait when it launches to determine if there is new data to sync or not. Defaults to 300 seconds. Valid range: 120 seconds to 1200 seconds. Read about initial waiting time.", + "default": 300, + "min": 120, + "max": 1200, + "order": 3 } } } diff --git a/airbyte-integrations/connectors/source-mssql/src/test-integration/resources/expected_spec.json b/airbyte-integrations/connectors/source-mssql/src/test-integration/resources/expected_spec.json index 4745ff1f922ec..0b94887ffc1a3 100644 --- a/airbyte-integrations/connectors/source-mssql/src/test-integration/resources/expected_spec.json +++ b/airbyte-integrations/connectors/source-mssql/src/test-integration/resources/expected_spec.json @@ -150,6 +150,15 @@ "enum": ["Snapshot", "Read Committed"], "description": "Existing data in the database are synced through an initial snapshot. This parameter controls the isolation level that will be used during the initial snapshotting. If you choose the \"Snapshot\" level, you must enable the snapshot isolation mode on the database.", "order": 2 + }, + "initial_waiting_seconds": { + "type": "integer", + "title": "Initial Waiting Time in Seconds (Advanced)", + "description": "The amount of time the connector will wait when it launches to determine if there is new data to sync or not. Defaults to 300 seconds. Valid range: 120 seconds to 1200 seconds. Read about initial waiting time.", + "default": 300, + "min": 120, + "max": 1200, + "order": 3 } } } diff --git a/docs/integrations/sources/mssql.md b/docs/integrations/sources/mssql.md index 44a86a62e01c9..eaadcae5f40b9 100644 --- a/docs/integrations/sources/mssql.md +++ b/docs/integrations/sources/mssql.md @@ -341,7 +341,8 @@ WHERE actor_definition_id ='b5ea17b1-f170-46dc-bc31-cc744ca984c1' AND (configura | Version | Date | Pull Request | Subject | |:--------|:-----------|:------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------| -| 0.4.27 | 2022-12-14 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | +| 0.4.28 | 2023-01-18 | [21348](https://github.com/airbytehq/airbyte/pull/21348) | Fix error introduced in [18959](https://github.com/airbytehq/airbyte/pull/18959) in which option `initial_waiting_seconds` was removed | +| 0.4.27 | 2022-12-14 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | | 0.4.26 | 2022-12-12 | [18959](https://github.com/airbytehq/airbyte/pull/18959) | CDC : Don't timeout if snapshot is not complete. | | 0.4.25 | 2022-11-04 | [18732](https://github.com/airbytehq/airbyte/pull/18732) | Upgrade debezium version to 1.9.6 | | 0.4.24 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | From 0fbd3b284e6bab07592a529542079925f0c50aff Mon Sep 17 00:00:00 2001 From: Joey Marshment-Howell Date: Mon, 23 Jan 2023 15:13:37 +0100 Subject: [PATCH 022/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=90=9B=20Force=20r?= =?UTF-8?q?efresh=20of=20firebase=20token=20after=20verifying=20email=20(#?= =?UTF-8?q?21687)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/packages/cloud/lib/auth/GoogleAuthService.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/airbyte-webapp/src/packages/cloud/lib/auth/GoogleAuthService.ts b/airbyte-webapp/src/packages/cloud/lib/auth/GoogleAuthService.ts index 32c11bf9f1c60..df0f42e91754c 100644 --- a/airbyte-webapp/src/packages/cloud/lib/auth/GoogleAuthService.ts +++ b/airbyte-webapp/src/packages/cloud/lib/auth/GoogleAuthService.ts @@ -20,6 +20,8 @@ import { signInWithPopup, GoogleAuthProvider, GithubAuthProvider, + getIdToken, + reload, } from "firebase/auth"; import { Provider } from "config"; @@ -144,7 +146,13 @@ export class GoogleAuthService { } async confirmEmailVerify(code: string): Promise { - return applyActionCode(this.auth, code); + await applyActionCode(this.auth, code); + + // Reload the user and get a fresh token with email_verified: true + if (this.auth.currentUser) { + await reload(this.auth.currentUser); + await getIdToken(this.auth.currentUser, true); + } } async signInWithEmailLink(email: string): Promise { From 79de89d4397e9561c2ebb770034536316124a627 Mon Sep 17 00:00:00 2001 From: Akash Kulkarni <113392464+akashkulk@users.noreply.github.com> Date: Mon, 23 Jan 2023 06:33:58 -0800 Subject: [PATCH 023/195] Source Postgres : Fast query for estimate messages (#21683) * Source Postgres : Fast query for estimate messages * Update documentation * auto-bump connector version * Update strict-encrypt Dockerfile Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../source-postgres-strict-encrypt/Dockerfile | 2 +- .../connectors/source-postgres/Dockerfile | 2 +- .../source/postgres/PostgresQueryUtils.java | 2 +- .../source/postgres/PostgresSource.java | 32 ++- docs/integrations/sources/postgres.md | 241 +++++++++--------- 7 files changed, 149 insertions(+), 134 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index e368e561666eb..9a03ea0179555 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1338,7 +1338,7 @@ - name: Postgres sourceDefinitionId: decd338e-5647-4c0b-adf4-da0e75f5a750 dockerRepository: airbyte/source-postgres - dockerImageTag: 1.0.38 + dockerImageTag: 1.0.39 documentationUrl: https://docs.airbyte.com/integrations/sources/postgres icon: postgresql.svg sourceType: database diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 2b815cffb911d..8739219dcc27a 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -11488,7 +11488,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-postgres:1.0.38" +- dockerImage: "airbyte/source-postgres:1.0.39" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/postgres" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile b/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile index 6e8c951d7a933..75240c9b2918d 100644 --- a/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile +++ b/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-postgres-strict-encrypt COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.38 +LABEL io.airbyte.version=1.0.39 LABEL io.airbyte.name=airbyte/source-postgres-strict-encrypt diff --git a/airbyte-integrations/connectors/source-postgres/Dockerfile b/airbyte-integrations/connectors/source-postgres/Dockerfile index 04a84a8f6750a..2d826c4e83760 100644 --- a/airbyte-integrations/connectors/source-postgres/Dockerfile +++ b/airbyte-integrations/connectors/source-postgres/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-postgres COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.38 +LABEL io.airbyte.version=1.0.39 LABEL io.airbyte.name=airbyte/source-postgres diff --git a/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresQueryUtils.java b/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresQueryUtils.java index 23140901e3a79..855a5d34ad2f9 100644 --- a/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresQueryUtils.java +++ b/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresQueryUtils.java @@ -26,7 +26,7 @@ public class PostgresQueryUtils { public static final String TABLE_ESTIMATE_QUERY = """ - SELECT (SELECT COUNT(*) FROM %s) AS %s, + SELECT (select reltuples::int8 as count from pg_class c JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace where nspname='%s' AND relname='%s') AS %s, pg_relation_size('%s') AS %s; """; diff --git a/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresSource.java b/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresSource.java index d2a3aab3609d5..06df1a710c478 100644 --- a/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresSource.java +++ b/airbyte-integrations/connectors/source-postgres/src/main/java/io/airbyte/integrations/source/postgres/PostgresSource.java @@ -557,13 +557,20 @@ protected void estimateFullRefreshSyncSize(final JdbcDatabase database, final String fullTableName = getFullyQualifiedTableNameWithQuoting(schemaName, tableName, getQuoteString()); - final List tableEstimateResult = getFullTableEstimate(database, fullTableName); + final List tableEstimateResult = getFullTableEstimate(database, fullTableName, schemaName, tableName); if (!tableEstimateResult.isEmpty() && tableEstimateResult.get(0).has(ROW_COUNT_RESULT_COL) && tableEstimateResult.get(0).has(TOTAL_BYTES_RESULT_COL)) { final long syncRowCount = tableEstimateResult.get(0).get(ROW_COUNT_RESULT_COL).asLong(); final long syncByteCount = tableEstimateResult.get(0).get(TOTAL_BYTES_RESULT_COL).asLong(); + // The fast count query can return negative or otherwise invalid results for small tables. In this + // case, we can skip emitting an + // estimate trace altogether since the sync will likely complete quickly. + if (syncRowCount <= 0) { + return; + } + // Here, we double the bytes estimate to account for serialization. Perhaps a better way to do this // is to // read a row and Stringify it to better understand the accurate volume of data sent over the wire. @@ -588,20 +595,23 @@ protected void estimateIncrementalSyncSize(final JdbcDatabase database, final String fullTableName = getFullyQualifiedTableNameWithQuoting(schemaName, tableName, getQuoteString()); - final List tableEstimateResult = getFullTableEstimate(database, fullTableName); + final List tableEstimateResult = getFullTableEstimate(database, fullTableName, schemaName, tableName); final long tableRowCount = tableEstimateResult.get(0).get(ROW_COUNT_RESULT_COL).asLong(); final long tableByteCount = tableEstimateResult.get(0).get(TOTAL_BYTES_RESULT_COL).asLong(); + // The fast count query can return negative or otherwise invalid results for small tables. In this + // case, we can skip emitting an + // estimate trace altogether since the sync will likely complete quickly. + if (tableRowCount <= 0) { + return; + } + final long syncRowCount; final long syncByteCount; syncRowCount = getIncrementalTableRowCount(database, fullTableName, cursorInfo, cursorFieldType); - if (tableRowCount == 0) { - syncByteCount = 0; - } else { - syncByteCount = (tableByteCount / tableRowCount) * syncRowCount; - } + syncByteCount = (tableByteCount / tableRowCount) * syncRowCount; // Here, we double the bytes estimate to account for serialization. Perhaps a better way to do this // is to @@ -615,10 +625,14 @@ protected void estimateIncrementalSyncSize(final JdbcDatabase database, } } - private List getFullTableEstimate(final JdbcDatabase database, final String fullTableName) throws SQLException { + private List getFullTableEstimate(final JdbcDatabase database, + final String fullTableName, + final String schemaName, + final String tableName) + throws SQLException { // Construct the table estimate query. final String tableEstimateQuery = - String.format(TABLE_ESTIMATE_QUERY, fullTableName, ROW_COUNT_RESULT_COL, fullTableName, TOTAL_BYTES_RESULT_COL); + String.format(TABLE_ESTIMATE_QUERY, schemaName, tableName, ROW_COUNT_RESULT_COL, fullTableName, TOTAL_BYTES_RESULT_COL); LOGGER.debug("table estimate query: {}", tableEstimateQuery); final List jsonNodes = database.bufferedResultSetQuery(conn -> conn.createStatement().executeQuery(tableEstimateQuery), resultSet -> JdbcUtils.getDefaultSourceOperations().rowToJson(resultSet)); diff --git a/docs/integrations/sources/postgres.md b/docs/integrations/sources/postgres.md index 4b3ed0421585d..b46e079717308 100644 --- a/docs/integrations/sources/postgres.md +++ b/docs/integrations/sources/postgres.md @@ -409,124 +409,125 @@ The root causes is that the WALs needed for the incremental sync has been remove ## Changelog -| Version | Date | Pull Request | Subject | -|:--------|:-----------|:----------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 1.0.38 | 2022-01-17 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | -| 1.0.37 | 2023-01-17 | [20783](https://github.com/airbytehq/airbyte/pull/20783) | Emit estimate trace messages for non-CDC mode. | -| 1.0.36 | 2023-01-11 | [21003](https://github.com/airbytehq/airbyte/pull/21003) | Handle null values for array data types in CDC mode gracefully. | -| 1.0.35 | 2023-01-04 | [20469](https://github.com/airbytehq/airbyte/pull/20469) | Introduce feature to make LSN commit behaviour configurable. | -| 1.0.34 | 2022-12-13 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | -| 1.0.33 | 2022-12-12 | [18959](https://github.com/airbytehq/airbyte/pull/18959) | CDC : Don't timeout if snapshot is not complete. | -| 1.0.32 | 2022-12-12 | [20192](https://github.com/airbytehq/airbyte/pull/20192) | Only throw a warning if cursor column contains null values. | -| 1.0.31 | 2022-12-02 | [19889](https://github.com/airbytehq/airbyte/pull/19889) | Check before each sync and stop if an incremental sync cursor column contains a null value. | -| | 2022-12-02 | [19985](https://github.com/airbytehq/airbyte/pull/19985) | Reenable incorrectly-disabled `wal2json` CDC plugin | -| 1.0.30 | 2022-11-29 | [19024](https://github.com/airbytehq/airbyte/pull/19024) | Skip tables from schema where user do not have Usage permission during discovery. | -| 1.0.29 | 2022-11-29 | [19623](https://github.com/airbytehq/airbyte/pull/19623) | Mark PSQLException related to using replica that is configured as a hot standby server as config error. | -| 1.0.28 | 2022-11-28 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | -| 1.0.27 | 2022-11-28 | [16990](https://github.com/airbytehq/airbyte/pull/16990) | Handle arrays data types | -| 1.0.26 | 2022-11-18 | [19551](https://github.com/airbytehq/airbyte/pull/19551) | Fixes bug with ssl modes | -| 1.0.25 | 2022-11-16 | [19004](https://github.com/airbytehq/airbyte/pull/19004) | Use Debezium heartbeats to improve CDC replication of large databases. | -| 1.0.24 | 2022-11-07 | [19291](https://github.com/airbytehq/airbyte/pull/19291) | Default timeout is reduced from 1 min to 10sec | -| 1.0.23 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | -| 1.0.22 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | -| 1.0.21 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | -| 1.0.20 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | -| 1.0.19 | 2022-10-21 | [18263](https://github.com/airbytehq/airbyte/pull/18263) | Fixes bug introduced in [15833](https://github.com/airbytehq/airbyte/pull/15833) and adds better error messaging for SSH tunnel in Destinations | -| 1.0.18 | 2022-10-19 | [18087](https://github.com/airbytehq/airbyte/pull/18087) | Better error messaging for configuration errors (SSH configs, choosing an invalid cursor) | -| 1.0.17 | 2022-10-17 | [18041](https://github.com/airbytehq/airbyte/pull/18041) | Fixes bug introduced 2022-09-12 with SshTunnel, handles iterator exception properly | -| 1.0.16 | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | -| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Handle 24:00:00 value for Time column | -| 1.0.14 | 2022-10-03 | [17515](https://github.com/airbytehq/airbyte/pull/17515) | Fix an issue preventing connection using client certificate | -| 1.0.13 | 2022-10-01 | [17459](https://github.com/airbytehq/airbyte/pull/17459) | Upgrade debezium version to 1.9.6 from 1.9.2 | -| 1.0.12 | 2022-09-27 | [17299](https://github.com/airbytehq/airbyte/pull/17299) | Improve error handling for strict-encrypt postgres source | -| 1.0.11 | 2022-09-26 | [17131](https://github.com/airbytehq/airbyte/pull/17131) | Allow nullable columns to be used as cursor | -| 1.0.10 | 2022-09-14 | [15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | -| 1.0.9 | 2022-09-13 | [16657](https://github.com/airbytehq/airbyte/pull/16657) | Improve CDC record queueing performance | -| 1.0.8 | 2022-09-08 | [16202](https://github.com/airbytehq/airbyte/pull/16202) | Adds error messaging factory to UI | -| 1.0.7 | 2022-08-30 | [16114](https://github.com/airbytehq/airbyte/pull/16114) | Prevent traffic going on an unsecured channel in strict-encryption version of source postgres | -| 1.0.6 | 2022-08-30 | [16138](https://github.com/airbytehq/airbyte/pull/16138) | Remove unnecessary logging | -| 1.0.5 | 2022-08-25 | [15993](https://github.com/airbytehq/airbyte/pull/15993) | Add support for connection over SSL in CDC mode | -| 1.0.4 | 2022-08-23 | [15877](https://github.com/airbytehq/airbyte/pull/15877) | Fix temporal data type bug which was causing failure in CDC mode | -| 1.0.3 | 2022-08-18 | [14356](https://github.com/airbytehq/airbyte/pull/14356) | DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field | -| 1.0.2 | 2022-08-11 | [15538](https://github.com/airbytehq/airbyte/pull/15538) | Allow additional properties in db stream state | -| 1.0.1 | 2022-08-10 | [15496](https://github.com/airbytehq/airbyte/pull/15496) | Fix state emission in incremental sync | -| | 2022-08-10 | [15481](https://github.com/airbytehq/airbyte/pull/15481) | Fix data handling from WAL logs in CDC mode | -| 1.0.0 | 2022-08-05 | [15380](https://github.com/airbytehq/airbyte/pull/15380) | Change connector label to generally_available (requires [upgrading](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to `v0.40.0-alpha`) | -| 0.4.44 | 2022-08-05 | [15342](https://github.com/airbytehq/airbyte/pull/15342) | Adjust titles and descriptions in spec.json | -| 0.4.43 | 2022-08-03 | [15226](https://github.com/airbytehq/airbyte/pull/15226) | Make connectionTimeoutMs configurable through JDBC url parameters | -| 0.4.42 | 2022-08-03 | [15273](https://github.com/airbytehq/airbyte/pull/15273) | Fix a bug in `0.4.36` and correctly parse the CDC initial record waiting time | -| 0.4.41 | 2022-08-03 | [15077](https://github.com/airbytehq/airbyte/pull/15077) | Sync data from beginning if the LSN is no longer valid in CDC | -| | 2022-08-03 | [14903](https://github.com/airbytehq/airbyte/pull/14903) | Emit state messages more frequently (⛔ this version has a bug; use `1.0.1` instead) | -| 0.4.40 | 2022-08-03 | [15187](https://github.com/airbytehq/airbyte/pull/15187) | Add support for BCE dates/timestamps | -| | 2022-08-03 | [14534](https://github.com/airbytehq/airbyte/pull/14534) | Align regular and CDC integration tests and data mappers | -| 0.4.39 | 2022-08-02 | [14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | -| 0.4.38 | 2022-07-26 | [14362](https://github.com/airbytehq/airbyte/pull/14362) | Integral columns are now discovered as int64 fields. | -| 0.4.37 | 2022-07-22 | [14714](https://github.com/airbytehq/airbyte/pull/14714) | Clarified error message when invalid cursor column selected | -| 0.4.36 | 2022-07-21 | [14451](https://github.com/airbytehq/airbyte/pull/14451) | Make initial CDC waiting time configurable (⛔ this version has a bug and will not work; use `0.4.42` instead) | -| 0.4.35 | 2022-07-14 | [14574](https://github.com/airbytehq/airbyte/pull/14574) | Removed additionalProperties:false from JDBC source connectors | -| 0.4.34 | 2022-07-17 | [13840](https://github.com/airbytehq/airbyte/pull/13840) | Added the ability to connect using different SSL modes and SSL certificates. | -| 0.4.33 | 2022-07-14 | [14586](https://github.com/airbytehq/airbyte/pull/14586) | Validate source JDBC url parameters | -| 0.4.32 | 2022-07-07 | [14694](https://github.com/airbytehq/airbyte/pull/14694) | Force to produce LEGACY state if the use stream capable feature flag is set to false | -| 0.4.31 | 2022-07-07 | [14447](https://github.com/airbytehq/airbyte/pull/14447) | Under CDC mode, retrieve only those tables included in the publications | -| 0.4.30 | 2022-06-30 | [14251](https://github.com/airbytehq/airbyte/pull/14251) | Use more simple and comprehensive query to get selectable tables | -| 0.4.29 | 2022-06-29 | [14265](https://github.com/airbytehq/airbyte/pull/14265) | Upgrade postgresql JDBC version to 42.3.5 | -| 0.4.28 | 2022-06-23 | [14077](https://github.com/airbytehq/airbyte/pull/14077) | Use the new state management | -| 0.4.26 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | -| 0.4.25 | 2022-06-15 | [13823](https://github.com/airbytehq/airbyte/pull/13823) | Publish adaptive postgres source that enforces ssl on cloud + Debezium version upgrade to 1.9.2 from 1.4.2 | -| 0.4.24 | 2022-06-14 | [13549](https://github.com/airbytehq/airbyte/pull/13549) | Fixed truncated precision if the value of microseconds or seconds is 0 | -| 0.4.23 | 2022-06-13 | [13655](https://github.com/airbytehq/airbyte/pull/13745) | Fixed handling datetime cursors when upgrading from older versions of the connector | -| 0.4.22 | 2022-06-09 | [13655](https://github.com/airbytehq/airbyte/pull/13655) | Fixed bug with unsupported date-time datatypes during incremental sync | -| 0.4.21 | 2022-06-06 | [13435](https://github.com/airbytehq/airbyte/pull/13435) | Adjust JDBC fetch size based on max memory and max row size | -| 0.4.20 | 2022-06-02 | [13367](https://github.com/airbytehq/airbyte/pull/13367) | Added convertion hstore to json format | -| 0.4.19 | 2022-05-25 | [13166](https://github.com/airbytehq/airbyte/pull/13166) | Added timezone awareness and handle BC dates | -| 0.4.18 | 2022-05-25 | [13083](https://github.com/airbytehq/airbyte/pull/13083) | Add support for tsquey type | -| 0.4.17 | 2022-05-19 | [13016](https://github.com/airbytehq/airbyte/pull/13016) | CDC modify schema to allow null values | -| 0.4.16 | 2022-05-14 | [12840](https://github.com/airbytehq/airbyte/pull/12840) | Added custom JDBC parameters field | -| 0.4.15 | 2022-05-13 | [12834](https://github.com/airbytehq/airbyte/pull/12834) | Fix the bug that the connector returns empty catalog for Azure Postgres database | -| 0.4.14 | 2022-05-08 | [12689](https://github.com/airbytehq/airbyte/pull/12689) | Add table retrieval according to role-based `SELECT` privilege | -| 0.4.13 | 2022-05-05 | [10230](https://github.com/airbytehq/airbyte/pull/10230) | Explicitly set null value for field in json | -| 0.4.12 | 2022-04-29 | [12480](https://github.com/airbytehq/airbyte/pull/12480) | Query tables with adaptive fetch size to optimize JDBC memory consumption | -| 0.4.11 | 2022-04-11 | [11729](https://github.com/airbytehq/airbyte/pull/11729) | Bump mina-sshd from 2.7.0 to 2.8.0 | -| 0.4.10 | 2022-04-08 | [11798](https://github.com/airbytehq/airbyte/pull/11798) | Fixed roles for fetching materialized view processing | -| 0.4.8 | 2022-02-21 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats | -| 0.4.7 | 2022-02-18 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Updated timestamp transformation with microseconds | -| 0.4.6 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | (unpublished) Add `-XX:+ExitOnOutOfMemoryError` JVM option | -| 0.4.5 | 2022-02-08 | [10173](https://github.com/airbytehq/airbyte/pull/10173) | Improved discovering tables in case if user does not have permissions to any table | -| 0.4.4 | 2022-01-26 | [9807](https://github.com/airbytehq/airbyte/pull/9807) | Update connector fields title/description | -| 0.4.3 | 2022-01-24 | [9554](https://github.com/airbytehq/airbyte/pull/9554) | Allow handling of java sql date in CDC | -| 0.4.2 | 2022-01-13 | [9360](https://github.com/airbytehq/airbyte/pull/9360) | Added schema selection | -| 0.4.1 | 2022-01-05 | [9116](https://github.com/airbytehq/airbyte/pull/9116) | Added materialized views processing | -| 0.4.0 | 2021-12-13 | [8726](https://github.com/airbytehq/airbyte/pull/8726) | Support all Postgres types | -| 0.3.17 | 2021-12-01 | [8371](https://github.com/airbytehq/airbyte/pull/8371) | Fixed incorrect handling "\n" in ssh key | -| 0.3.16 | 2021-11-28 | [7995](https://github.com/airbytehq/airbyte/pull/7995) | Fixed money type with amount > 1000 | -| 0.3.15 | 2021-11-26 | [8066](https://github.com/airbytehq/airbyte/pull/8266) | Fixed the case, when Views are not listed during schema discovery | -| 0.3.14 | 2021-11-17 | [8010](https://github.com/airbytehq/airbyte/pull/8010) | Added checking of privileges before table internal discovery | -| 0.3.13 | 2021-10-26 | [7339](https://github.com/airbytehq/airbyte/pull/7339) | Support or improve support for Interval, Money, Date, various geometric data types, inventory_items, and others | -| 0.3.12 | 2021-09-30 | [6585](https://github.com/airbytehq/airbyte/pull/6585) | Improved SSH Tunnel key generation steps | -| 0.3.11 | 2021-09-02 | [5742](https://github.com/airbytehq/airbyte/pull/5742) | Add SSH Tunnel support | -| 0.3.9 | 2021-08-17 | [5304](https://github.com/airbytehq/airbyte/pull/5304) | Fix CDC OOM issue | -| 0.3.8 | 2021-08-13 | [4699](https://github.com/airbytehq/airbyte/pull/4699) | Added json config validator | -| 0.3.4 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support | -| 0.3.3 | 2021-06-08 | [3960](https://github.com/airbytehq/airbyte/pull/3960) | Add method field in specification parameters | -| 0.3.2 | 2021-05-26 | [3179](https://github.com/airbytehq/airbyte/pull/3179) | Remove `isCDC` logging | -| 0.3.1 | 2021-04-21 | [2878](https://github.com/airbytehq/airbyte/pull/2878) | Set defined cursor for CDC | -| 0.3.0 | 2021-04-21 | [2990](https://github.com/airbytehq/airbyte/pull/2990) | Support namespaces | -| 0.2.7 | 2021-04-16 | [2923](https://github.com/airbytehq/airbyte/pull/2923) | SSL spec as optional | -| 0.2.6 | 2021-04-16 | [2757](https://github.com/airbytehq/airbyte/pull/2757) | Support SSL connection | -| 0.2.5 | 2021-04-12 | [2859](https://github.com/airbytehq/airbyte/pull/2859) | CDC bugfix | -| 0.2.4 | 2021-04-09 | [2548](https://github.com/airbytehq/airbyte/pull/2548) | Support CDC | -| 0.2.3 | 2021-03-28 | [2600](https://github.com/airbytehq/airbyte/pull/2600) | Add NCHAR and NVCHAR support to DB and cursor type casting | -| 0.2.2 | 2021-03-26 | [2460](https://github.com/airbytehq/airbyte/pull/2460) | Destination supports destination sync mode | -| 0.2.1 | 2021-03-18 | [2488](https://github.com/airbytehq/airbyte/pull/2488) | Sources support primary keys | -| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | -| 0.1.13 | 2021-02-02 | [1887](https://github.com/airbytehq/airbyte/pull/1887) | Migrate AbstractJdbcSource to use iterators | -| 0.1.12 | 2021-01-25 | [1746](https://github.com/airbytehq/airbyte/pull/1746) | Fix NPE in State Decorator | -| 0.1.11 | 2021-01-25 | [1765](https://github.com/airbytehq/airbyte/pull/1765) | Add field titles to specification | -| 0.1.10 | 2021-01-19 | [1724](https://github.com/airbytehq/airbyte/pull/1724) | Fix JdbcSource handling of tables with same names in different schemas | -| 0.1.9 | 2021-01-14 | [1655](https://github.com/airbytehq/airbyte/pull/1655) | Fix JdbcSource OOM | -| 0.1.8 | 2021-01-13 | [1588](https://github.com/airbytehq/airbyte/pull/1588) | Handle invalid numeric values in JDBC source | -| 0.1.7 | 2021-01-08 | [1307](https://github.com/airbytehq/airbyte/pull/1307) | Migrate Postgres and MySql to use new JdbcSource | -| 0.1.6 | 2020-12-09 | [1172](https://github.com/airbytehq/airbyte/pull/1172) | Support incremental sync | -| 0.1.5 | 2020-11-30 | [1038](https://github.com/airbytehq/airbyte/pull/1038) | Change JDBC sources to discover more than standard schemas | -| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | +| Version | Date | Pull Request | Subject | +|:--------|:-----------|:------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.39 | 2022-01-20 | [21683](https://github.com/airbytehq/airbyte/pull/21683) | Speed up esmtimates for trace messages in non-CDC mode. | +| 1.0.38 | 2022-01-17 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | +| 1.0.37 | 2023-01-17 | [20783](https://github.com/airbytehq/airbyte/pull/20783) | Emit estimate trace messages for non-CDC mode. | +| 1.0.36 | 2023-01-11 | [21003](https://github.com/airbytehq/airbyte/pull/21003) | Handle null values for array data types in CDC mode gracefully. | +| 1.0.35 | 2023-01-04 | [20469](https://github.com/airbytehq/airbyte/pull/20469) | Introduce feature to make LSN commit behaviour configurable. | +| 1.0.34 | 2022-12-13 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | +| 1.0.33 | 2022-12-12 | [18959](https://github.com/airbytehq/airbyte/pull/18959) | CDC : Don't timeout if snapshot is not complete. | +| 1.0.32 | 2022-12-12 | [20192](https://github.com/airbytehq/airbyte/pull/20192) | Only throw a warning if cursor column contains null values. | +| 1.0.31 | 2022-12-02 | [19889](https://github.com/airbytehq/airbyte/pull/19889) | Check before each sync and stop if an incremental sync cursor column contains a null value. | +| | 2022-12-02 | [19985](https://github.com/airbytehq/airbyte/pull/19985) | Reenable incorrectly-disabled `wal2json` CDC plugin | +| 1.0.30 | 2022-11-29 | [19024](https://github.com/airbytehq/airbyte/pull/19024) | Skip tables from schema where user do not have Usage permission during discovery. | +| 1.0.29 | 2022-11-29 | [19623](https://github.com/airbytehq/airbyte/pull/19623) | Mark PSQLException related to using replica that is configured as a hot standby server as config error. | +| 1.0.28 | 2022-11-28 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | +| 1.0.27 | 2022-11-28 | [16990](https://github.com/airbytehq/airbyte/pull/16990) | Handle arrays data types | +| 1.0.26 | 2022-11-18 | [19551](https://github.com/airbytehq/airbyte/pull/19551) | Fixes bug with ssl modes | +| 1.0.25 | 2022-11-16 | [19004](https://github.com/airbytehq/airbyte/pull/19004) | Use Debezium heartbeats to improve CDC replication of large databases. | +| 1.0.24 | 2022-11-07 | [19291](https://github.com/airbytehq/airbyte/pull/19291) | Default timeout is reduced from 1 min to 10sec | +| 1.0.23 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | +| 1.0.22 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | +| 1.0.21 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | +| 1.0.20 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | +| 1.0.19 | 2022-10-21 | [18263](https://github.com/airbytehq/airbyte/pull/18263) | Fixes bug introduced in [15833](https://github.com/airbytehq/airbyte/pull/15833) and adds better error messaging for SSH tunnel in Destinations | +| 1.0.18 | 2022-10-19 | [18087](https://github.com/airbytehq/airbyte/pull/18087) | Better error messaging for configuration errors (SSH configs, choosing an invalid cursor) | +| 1.0.17 | 2022-10-17 | [18041](https://github.com/airbytehq/airbyte/pull/18041) | Fixes bug introduced 2022-09-12 with SshTunnel, handles iterator exception properly | +| 1.0.16 | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | +| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Handle 24:00:00 value for Time column | +| 1.0.14 | 2022-10-03 | [17515](https://github.com/airbytehq/airbyte/pull/17515) | Fix an issue preventing connection using client certificate | +| 1.0.13 | 2022-10-01 | [17459](https://github.com/airbytehq/airbyte/pull/17459) | Upgrade debezium version to 1.9.6 from 1.9.2 | +| 1.0.12 | 2022-09-27 | [17299](https://github.com/airbytehq/airbyte/pull/17299) | Improve error handling for strict-encrypt postgres source | +| 1.0.11 | 2022-09-26 | [17131](https://github.com/airbytehq/airbyte/pull/17131) | Allow nullable columns to be used as cursor | +| 1.0.10 | 2022-09-14 | [15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | +| 1.0.9 | 2022-09-13 | [16657](https://github.com/airbytehq/airbyte/pull/16657) | Improve CDC record queueing performance | +| 1.0.8 | 2022-09-08 | [16202](https://github.com/airbytehq/airbyte/pull/16202) | Adds error messaging factory to UI | +| 1.0.7 | 2022-08-30 | [16114](https://github.com/airbytehq/airbyte/pull/16114) | Prevent traffic going on an unsecured channel in strict-encryption version of source postgres | +| 1.0.6 | 2022-08-30 | [16138](https://github.com/airbytehq/airbyte/pull/16138) | Remove unnecessary logging | +| 1.0.5 | 2022-08-25 | [15993](https://github.com/airbytehq/airbyte/pull/15993) | Add support for connection over SSL in CDC mode | +| 1.0.4 | 2022-08-23 | [15877](https://github.com/airbytehq/airbyte/pull/15877) | Fix temporal data type bug which was causing failure in CDC mode | +| 1.0.3 | 2022-08-18 | [14356](https://github.com/airbytehq/airbyte/pull/14356) | DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field | +| 1.0.2 | 2022-08-11 | [15538](https://github.com/airbytehq/airbyte/pull/15538) | Allow additional properties in db stream state | +| 1.0.1 | 2022-08-10 | [15496](https://github.com/airbytehq/airbyte/pull/15496) | Fix state emission in incremental sync | +| | 2022-08-10 | [15481](https://github.com/airbytehq/airbyte/pull/15481) | Fix data handling from WAL logs in CDC mode | +| 1.0.0 | 2022-08-05 | [15380](https://github.com/airbytehq/airbyte/pull/15380) | Change connector label to generally_available (requires [upgrading](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to `v0.40.0-alpha`) | +| 0.4.44 | 2022-08-05 | [15342](https://github.com/airbytehq/airbyte/pull/15342) | Adjust titles and descriptions in spec.json | +| 0.4.43 | 2022-08-03 | [15226](https://github.com/airbytehq/airbyte/pull/15226) | Make connectionTimeoutMs configurable through JDBC url parameters | +| 0.4.42 | 2022-08-03 | [15273](https://github.com/airbytehq/airbyte/pull/15273) | Fix a bug in `0.4.36` and correctly parse the CDC initial record waiting time | +| 0.4.41 | 2022-08-03 | [15077](https://github.com/airbytehq/airbyte/pull/15077) | Sync data from beginning if the LSN is no longer valid in CDC | +| | 2022-08-03 | [14903](https://github.com/airbytehq/airbyte/pull/14903) | Emit state messages more frequently (⛔ this version has a bug; use `1.0.1` instead) | +| 0.4.40 | 2022-08-03 | [15187](https://github.com/airbytehq/airbyte/pull/15187) | Add support for BCE dates/timestamps | +| | 2022-08-03 | [14534](https://github.com/airbytehq/airbyte/pull/14534) | Align regular and CDC integration tests and data mappers | +| 0.4.39 | 2022-08-02 | [14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | +| 0.4.38 | 2022-07-26 | [14362](https://github.com/airbytehq/airbyte/pull/14362) | Integral columns are now discovered as int64 fields. | +| 0.4.37 | 2022-07-22 | [14714](https://github.com/airbytehq/airbyte/pull/14714) | Clarified error message when invalid cursor column selected | +| 0.4.36 | 2022-07-21 | [14451](https://github.com/airbytehq/airbyte/pull/14451) | Make initial CDC waiting time configurable (⛔ this version has a bug and will not work; use `0.4.42` instead) | +| 0.4.35 | 2022-07-14 | [14574](https://github.com/airbytehq/airbyte/pull/14574) | Removed additionalProperties:false from JDBC source connectors | +| 0.4.34 | 2022-07-17 | [13840](https://github.com/airbytehq/airbyte/pull/13840) | Added the ability to connect using different SSL modes and SSL certificates. | +| 0.4.33 | 2022-07-14 | [14586](https://github.com/airbytehq/airbyte/pull/14586) | Validate source JDBC url parameters | +| 0.4.32 | 2022-07-07 | [14694](https://github.com/airbytehq/airbyte/pull/14694) | Force to produce LEGACY state if the use stream capable feature flag is set to false | +| 0.4.31 | 2022-07-07 | [14447](https://github.com/airbytehq/airbyte/pull/14447) | Under CDC mode, retrieve only those tables included in the publications | +| 0.4.30 | 2022-06-30 | [14251](https://github.com/airbytehq/airbyte/pull/14251) | Use more simple and comprehensive query to get selectable tables | +| 0.4.29 | 2022-06-29 | [14265](https://github.com/airbytehq/airbyte/pull/14265) | Upgrade postgresql JDBC version to 42.3.5 | +| 0.4.28 | 2022-06-23 | [14077](https://github.com/airbytehq/airbyte/pull/14077) | Use the new state management | +| 0.4.26 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | +| 0.4.25 | 2022-06-15 | [13823](https://github.com/airbytehq/airbyte/pull/13823) | Publish adaptive postgres source that enforces ssl on cloud + Debezium version upgrade to 1.9.2 from 1.4.2 | +| 0.4.24 | 2022-06-14 | [13549](https://github.com/airbytehq/airbyte/pull/13549) | Fixed truncated precision if the value of microseconds or seconds is 0 | +| 0.4.23 | 2022-06-13 | [13655](https://github.com/airbytehq/airbyte/pull/13745) | Fixed handling datetime cursors when upgrading from older versions of the connector | +| 0.4.22 | 2022-06-09 | [13655](https://github.com/airbytehq/airbyte/pull/13655) | Fixed bug with unsupported date-time datatypes during incremental sync | +| 0.4.21 | 2022-06-06 | [13435](https://github.com/airbytehq/airbyte/pull/13435) | Adjust JDBC fetch size based on max memory and max row size | +| 0.4.20 | 2022-06-02 | [13367](https://github.com/airbytehq/airbyte/pull/13367) | Added convertion hstore to json format | +| 0.4.19 | 2022-05-25 | [13166](https://github.com/airbytehq/airbyte/pull/13166) | Added timezone awareness and handle BC dates | +| 0.4.18 | 2022-05-25 | [13083](https://github.com/airbytehq/airbyte/pull/13083) | Add support for tsquey type | +| 0.4.17 | 2022-05-19 | [13016](https://github.com/airbytehq/airbyte/pull/13016) | CDC modify schema to allow null values | +| 0.4.16 | 2022-05-14 | [12840](https://github.com/airbytehq/airbyte/pull/12840) | Added custom JDBC parameters field | +| 0.4.15 | 2022-05-13 | [12834](https://github.com/airbytehq/airbyte/pull/12834) | Fix the bug that the connector returns empty catalog for Azure Postgres database | +| 0.4.14 | 2022-05-08 | [12689](https://github.com/airbytehq/airbyte/pull/12689) | Add table retrieval according to role-based `SELECT` privilege | +| 0.4.13 | 2022-05-05 | [10230](https://github.com/airbytehq/airbyte/pull/10230) | Explicitly set null value for field in json | +| 0.4.12 | 2022-04-29 | [12480](https://github.com/airbytehq/airbyte/pull/12480) | Query tables with adaptive fetch size to optimize JDBC memory consumption | +| 0.4.11 | 2022-04-11 | [11729](https://github.com/airbytehq/airbyte/pull/11729) | Bump mina-sshd from 2.7.0 to 2.8.0 | +| 0.4.10 | 2022-04-08 | [11798](https://github.com/airbytehq/airbyte/pull/11798) | Fixed roles for fetching materialized view processing | +| 0.4.8 | 2022-02-21 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats | +| 0.4.7 | 2022-02-18 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Updated timestamp transformation with microseconds | +| 0.4.6 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | (unpublished) Add `-XX:+ExitOnOutOfMemoryError` JVM option | +| 0.4.5 | 2022-02-08 | [10173](https://github.com/airbytehq/airbyte/pull/10173) | Improved discovering tables in case if user does not have permissions to any table | +| 0.4.4 | 2022-01-26 | [9807](https://github.com/airbytehq/airbyte/pull/9807) | Update connector fields title/description | +| 0.4.3 | 2022-01-24 | [9554](https://github.com/airbytehq/airbyte/pull/9554) | Allow handling of java sql date in CDC | +| 0.4.2 | 2022-01-13 | [9360](https://github.com/airbytehq/airbyte/pull/9360) | Added schema selection | +| 0.4.1 | 2022-01-05 | [9116](https://github.com/airbytehq/airbyte/pull/9116) | Added materialized views processing | +| 0.4.0 | 2021-12-13 | [8726](https://github.com/airbytehq/airbyte/pull/8726) | Support all Postgres types | +| 0.3.17 | 2021-12-01 | [8371](https://github.com/airbytehq/airbyte/pull/8371) | Fixed incorrect handling "\n" in ssh key | +| 0.3.16 | 2021-11-28 | [7995](https://github.com/airbytehq/airbyte/pull/7995) | Fixed money type with amount > 1000 | +| 0.3.15 | 2021-11-26 | [8066](https://github.com/airbytehq/airbyte/pull/8266) | Fixed the case, when Views are not listed during schema discovery | +| 0.3.14 | 2021-11-17 | [8010](https://github.com/airbytehq/airbyte/pull/8010) | Added checking of privileges before table internal discovery | +| 0.3.13 | 2021-10-26 | [7339](https://github.com/airbytehq/airbyte/pull/7339) | Support or improve support for Interval, Money, Date, various geometric data types, inventory_items, and others | +| 0.3.12 | 2021-09-30 | [6585](https://github.com/airbytehq/airbyte/pull/6585) | Improved SSH Tunnel key generation steps | +| 0.3.11 | 2021-09-02 | [5742](https://github.com/airbytehq/airbyte/pull/5742) | Add SSH Tunnel support | +| 0.3.9 | 2021-08-17 | [5304](https://github.com/airbytehq/airbyte/pull/5304) | Fix CDC OOM issue | +| 0.3.8 | 2021-08-13 | [4699](https://github.com/airbytehq/airbyte/pull/4699) | Added json config validator | +| 0.3.4 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support | +| 0.3.3 | 2021-06-08 | [3960](https://github.com/airbytehq/airbyte/pull/3960) | Add method field in specification parameters | +| 0.3.2 | 2021-05-26 | [3179](https://github.com/airbytehq/airbyte/pull/3179) | Remove `isCDC` logging | +| 0.3.1 | 2021-04-21 | [2878](https://github.com/airbytehq/airbyte/pull/2878) | Set defined cursor for CDC | +| 0.3.0 | 2021-04-21 | [2990](https://github.com/airbytehq/airbyte/pull/2990) | Support namespaces | +| 0.2.7 | 2021-04-16 | [2923](https://github.com/airbytehq/airbyte/pull/2923) | SSL spec as optional | +| 0.2.6 | 2021-04-16 | [2757](https://github.com/airbytehq/airbyte/pull/2757) | Support SSL connection | +| 0.2.5 | 2021-04-12 | [2859](https://github.com/airbytehq/airbyte/pull/2859) | CDC bugfix | +| 0.2.4 | 2021-04-09 | [2548](https://github.com/airbytehq/airbyte/pull/2548) | Support CDC | +| 0.2.3 | 2021-03-28 | [2600](https://github.com/airbytehq/airbyte/pull/2600) | Add NCHAR and NVCHAR support to DB and cursor type casting | +| 0.2.2 | 2021-03-26 | [2460](https://github.com/airbytehq/airbyte/pull/2460) | Destination supports destination sync mode | +| 0.2.1 | 2021-03-18 | [2488](https://github.com/airbytehq/airbyte/pull/2488) | Sources support primary keys | +| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | +| 0.1.13 | 2021-02-02 | [1887](https://github.com/airbytehq/airbyte/pull/1887) | Migrate AbstractJdbcSource to use iterators | +| 0.1.12 | 2021-01-25 | [1746](https://github.com/airbytehq/airbyte/pull/1746) | Fix NPE in State Decorator | +| 0.1.11 | 2021-01-25 | [1765](https://github.com/airbytehq/airbyte/pull/1765) | Add field titles to specification | +| 0.1.10 | 2021-01-19 | [1724](https://github.com/airbytehq/airbyte/pull/1724) | Fix JdbcSource handling of tables with same names in different schemas | +| 0.1.9 | 2021-01-14 | [1655](https://github.com/airbytehq/airbyte/pull/1655) | Fix JdbcSource OOM | +| 0.1.8 | 2021-01-13 | [1588](https://github.com/airbytehq/airbyte/pull/1588) | Handle invalid numeric values in JDBC source | +| 0.1.7 | 2021-01-08 | [1307](https://github.com/airbytehq/airbyte/pull/1307) | Migrate Postgres and MySql to use new JdbcSource | +| 0.1.6 | 2020-12-09 | [1172](https://github.com/airbytehq/airbyte/pull/1172) | Support incremental sync | +| 0.1.5 | 2020-11-30 | [1038](https://github.com/airbytehq/airbyte/pull/1038) | Change JDBC sources to discover more than standard schemas | +| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | From 72a7080590a13984df5bc00300cb91c59d9a8028 Mon Sep 17 00:00:00 2001 From: Catherine Noll Date: Mon, 23 Jan 2023 11:47:16 -0500 Subject: [PATCH 024/195] [Low Code CDK] surface the resolved manifest in the CDK (#21703) This will be used by the connector builder server. --- .../sources/declarative/manifest_declarative_source.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/manifest_declarative_source.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/manifest_declarative_source.py index ca010c7782ec9..40fb1b6fac819 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/manifest_declarative_source.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/manifest_declarative_source.py @@ -81,6 +81,10 @@ def __init__(self, source_config: ConnectionDefinition, debug: bool = False, con if unknown_fields: raise InvalidConnectorDefinitionException(f"Found unknown top-level fields: {unknown_fields}") + @property + def resolved_manifest(self) -> Mapping[str, Any]: + return self._new_source_config + @property def connection_checker(self) -> ConnectionChecker: check = self._new_source_config["check"] if self.construct_using_pydantic_models else self._legacy_source_config["check"] From d10dc0ccb2e0bbebe6a6b9159f067411a1fbefdc Mon Sep 17 00:00:00 2001 From: clnoll Date: Mon, 23 Jan 2023 16:49:24 +0000 Subject: [PATCH 025/195] =?UTF-8?q?=F0=9F=A4=96=20Bump=20minor=20version?= =?UTF-8?q?=20of=20Airbyte=20CDK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- airbyte-cdk/python/.bumpversion.cfg | 2 +- airbyte-cdk/python/CHANGELOG.md | 3 +++ airbyte-cdk/python/setup.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/airbyte-cdk/python/.bumpversion.cfg b/airbyte-cdk/python/.bumpversion.cfg index f5b3e4e22b3b6..44db9b6e9a4d7 100644 --- a/airbyte-cdk/python/.bumpversion.cfg +++ b/airbyte-cdk/python/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.21.0 +current_version = 0.22.0 commit = False [bumpversion:file:setup.py] diff --git a/airbyte-cdk/python/CHANGELOG.md b/airbyte-cdk/python/CHANGELOG.md index 2499aef31e9a8..ce125c91cac2b 100644 --- a/airbyte-cdk/python/CHANGELOG.md +++ b/airbyte-cdk/python/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.22.0 +Surface the resolved manifest in the CDK + ## 0.21.0 Add AvailabilityStrategy concept and use check_availability within CheckStream diff --git a/airbyte-cdk/python/setup.py b/airbyte-cdk/python/setup.py index 780ae48a81d3f..ccb663e991ba7 100644 --- a/airbyte-cdk/python/setup.py +++ b/airbyte-cdk/python/setup.py @@ -15,7 +15,7 @@ setup( name="airbyte-cdk", - version="0.21.0", + version="0.22.0", description="A framework for writing Airbyte Connectors.", long_description=README, long_description_content_type="text/markdown", From b8d54717fbe801d28498a046f87c00dbb4e7f157 Mon Sep 17 00:00:00 2001 From: Benoit Moriceau Date: Mon, 23 Jan 2023 08:50:43 -0800 Subject: [PATCH 026/195] Fix an npe on a sort fuction (#21685) * Fix an npe on a sort fuction * Format * Fix build --- .../JobCreationAndStatusUpdateActivityImpl.java | 13 ++++++++----- .../JobCreationAndStatusUpdateActivityTest.java | 10 ++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java index 295112266ecaa..2e321793c832b 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java @@ -14,6 +14,7 @@ import static io.airbyte.persistence.job.models.AttemptStatus.FAILED; import com.fasterxml.jackson.databind.JsonNode; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import datadog.trace.api.Trace; import io.airbyte.commons.docker.DockerUtils; @@ -66,7 +67,6 @@ import jakarta.inject.Singleton; import java.io.IOException; import java.nio.file.Path; -import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; @@ -483,10 +483,13 @@ private void failNonTerminalJobs(final UUID connectionId) { ReleaseStage.generally_available, 4); private static final Comparator RELEASE_STAGE_COMPARATOR = Comparator.comparingInt(RELEASE_STAGE_ORDER::get); - private static List orderByReleaseStageAsc(final List releaseStages) { - final List copiedList = new ArrayList<>(releaseStages); - copiedList.sort(RELEASE_STAGE_COMPARATOR); - return copiedList; + @VisibleForTesting + static List orderByReleaseStageAsc(final List releaseStages) { + // Using collector to get a mutable list + return releaseStages.stream() + .filter(stage -> stage != null) + .sorted(RELEASE_STAGE_COMPARATOR) + .toList(); } /** diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java index ccdb8447fd6c4..0efcb27e5c6d3 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java @@ -33,6 +33,7 @@ import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.config.persistence.StreamResetPersistence; +import io.airbyte.db.instance.configs.jooq.generated.enums.ReleaseStage; import io.airbyte.persistence.job.JobCreator; import io.airbyte.persistence.job.JobNotifier; import io.airbyte.persistence.job.JobPersistence; @@ -535,4 +536,13 @@ void ensureCleanJobState() throws IOException { } + @Test + void testReleaseStageOrdering() { + final List input = List.of(ReleaseStage.alpha, ReleaseStage.custom, ReleaseStage.beta, ReleaseStage.generally_available); + final List expected = List.of(ReleaseStage.custom, ReleaseStage.alpha, ReleaseStage.beta, ReleaseStage.generally_available); + + Assertions.assertThat(JobCreationAndStatusUpdateActivityImpl.orderByReleaseStageAsc(input)) + .containsExactlyElementsOf(expected); + } + } From 6595409098a50b64aaabf958c9951361c5305d2e Mon Sep 17 00:00:00 2001 From: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> Date: Mon, 23 Jan 2023 11:56:33 -0500 Subject: [PATCH 027/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=8E=A8=20=20Update?= =?UTF-8?q?=20page=20bottom=20margins=20to=20be=20consistent=20(#21673)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix bottom of Sources and destinations settings page * Remove unused components * Remove H3 from titles * Fix layouts to have consistent page bottom margin * Set default spacing to 20px / xl * Remove extraneous padding from pages and let containers handle it * Check if running cloud app to add extra bottom spacing * Fix layout issues with connection Edit controls, move line rendering to the transformation cards * Set "saving" state in create controls to use the create button instead of having a different UI * Fix padding in DbtTransformationsCard --- .../FormPageContent.module.scss | 6 +- .../ConnectorBlocks/FormPageContent.tsx | 11 +++- .../src/components/base/Titles/Titles.tsx | 6 -- .../src/components/base/Titles/index.tsx | 2 +- .../MainPageWithScroll.module.scss | 7 ++- .../MainPageWithScroll/MainPageWithScroll.tsx | 5 +- .../ConnectionEditFormCard.module.scss | 9 ++- .../ConnectionEditFormCard.tsx | 5 +- .../ConnectionForm/CreateControls.module.scss | 5 ++ .../ConnectionForm/CreateControls.tsx | 40 ++----------- .../ConnectionForm/EditControls.module.scss | 28 +-------- .../ConnectionForm/EditControls.tsx | 47 +++++++-------- .../CollapsibleCard.module.scss | 3 - .../ui/CollapsibleCard/CollapsibleCard.tsx | 4 -- .../SettingsPage/SettingsPage.module.scss | 1 - .../components/ConnectorsView.module.scss | 3 - .../components/ConnectorsView.tsx | 59 +++++++++++-------- .../components/PageComponents.tsx | 20 +------ .../ConnectionReplicationPage.module.scss | 2 - .../ConnectionStatusPage.module.scss | 4 -- .../ConnectionStatusPage.tsx | 1 - .../ConnectionTransformationPage.module.scss | 12 +++- .../ConnectionTransformationPage.tsx | 5 +- .../CustomTransformationsCard.tsx | 1 - .../DbtCloudTransformationsCard.module.scss | 2 +- airbyte-webapp/src/scss/_variables.scss | 2 +- .../ConnectorDocumentationLayout.module.scss | 2 +- 27 files changed, 119 insertions(+), 173 deletions(-) create mode 100644 airbyte-webapp/src/components/connection/ConnectionForm/CreateControls.module.scss delete mode 100644 airbyte-webapp/src/components/ui/CollapsibleCard/CollapsibleCard.module.scss delete mode 100644 airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.module.scss diff --git a/airbyte-webapp/src/components/ConnectorBlocks/FormPageContent.module.scss b/airbyte-webapp/src/components/ConnectorBlocks/FormPageContent.module.scss index a3166da8dda78..524972b7ce192 100644 --- a/airbyte-webapp/src/components/ConnectorBlocks/FormPageContent.module.scss +++ b/airbyte-webapp/src/components/ConnectorBlocks/FormPageContent.module.scss @@ -2,7 +2,11 @@ .container { margin: 13px auto 0; - padding-bottom: variables.$spacing-page-bottom; + padding-bottom: variables.$spacing-xl; + + &.cloud { + padding-bottom: variables.$spacing-page-bottom-cloud; + } &:not(.big) { width: 80%; diff --git a/airbyte-webapp/src/components/ConnectorBlocks/FormPageContent.tsx b/airbyte-webapp/src/components/ConnectorBlocks/FormPageContent.tsx index 64af7f776f976..1e1c4a051ec5d 100644 --- a/airbyte-webapp/src/components/ConnectorBlocks/FormPageContent.tsx +++ b/airbyte-webapp/src/components/ConnectorBlocks/FormPageContent.tsx @@ -1,6 +1,8 @@ import classNames from "classnames"; import { PropsWithChildren } from "react"; +import { isCloudApp } from "utils/app"; + import styles from "./FormPageContent.module.scss"; interface FormPageContentProps { @@ -8,7 +10,14 @@ interface FormPageContentProps { } const FormPageContent: React.FC> = ({ big, children }) => ( -
    {children}
    +
    + {children} +
    ); export default FormPageContent; diff --git a/airbyte-webapp/src/components/base/Titles/Titles.tsx b/airbyte-webapp/src/components/base/Titles/Titles.tsx index 9d2a5ee0fd9d5..50630f7ce4783 100644 --- a/airbyte-webapp/src/components/base/Titles/Titles.tsx +++ b/airbyte-webapp/src/components/base/Titles/Titles.tsx @@ -19,12 +19,6 @@ const H1 = styled.h1` margin: 0; `; -/** @deprecated Use `` */ -export const H3 = styled(H1).attrs({ as: "h3" })` - font-size: 20px; - line-height: 24px; -`; - /** @deprecated Use `` */ export const H5 = styled(H1).attrs({ as: "h5" })` font-size: ${({ theme }) => theme.h5?.fontSize || "16px"}; diff --git a/airbyte-webapp/src/components/base/Titles/index.tsx b/airbyte-webapp/src/components/base/Titles/index.tsx index 502ba2ea70362..c6f9a9079c5fd 100644 --- a/airbyte-webapp/src/components/base/Titles/index.tsx +++ b/airbyte-webapp/src/components/base/Titles/index.tsx @@ -1 +1 @@ -export { H3, H5 } from "./Titles"; +export { H5 } from "./Titles"; diff --git a/airbyte-webapp/src/components/common/MainPageWithScroll/MainPageWithScroll.module.scss b/airbyte-webapp/src/components/common/MainPageWithScroll/MainPageWithScroll.module.scss index 22c55a7f45fbb..185526591e756 100644 --- a/airbyte-webapp/src/components/common/MainPageWithScroll/MainPageWithScroll.module.scss +++ b/airbyte-webapp/src/components/common/MainPageWithScroll/MainPageWithScroll.module.scss @@ -9,6 +9,7 @@ } .contentContainer { + flex: 1; max-width: 100%; overflow-x: auto; padding-top: variables.$spacing-lg; @@ -17,6 +18,10 @@ .content { overflow-y: auto; height: 100%; - padding: 0 variables.$spacing-xl variables.$spacing-page-bottom; + padding: 0 variables.$spacing-xl variables.$spacing-xl; min-width: variables.$main-page-content-min-width; + + &.cloud { + padding-bottom: variables.$spacing-page-bottom-cloud; + } } diff --git a/airbyte-webapp/src/components/common/MainPageWithScroll/MainPageWithScroll.tsx b/airbyte-webapp/src/components/common/MainPageWithScroll/MainPageWithScroll.tsx index 047e1e14dbe14..71091c50b3cb8 100644 --- a/airbyte-webapp/src/components/common/MainPageWithScroll/MainPageWithScroll.tsx +++ b/airbyte-webapp/src/components/common/MainPageWithScroll/MainPageWithScroll.tsx @@ -1,5 +1,8 @@ +import classNames from "classnames"; import React from "react"; +import { isCloudApp } from "utils/app"; + import styles from "./MainPageWithScroll.module.scss"; /** @@ -20,7 +23,7 @@ export const MainPageWithScroll: React.FC = ({ headTitl {pageTitle}
    -
    {children}
    +
    {children}
    ); diff --git a/airbyte-webapp/src/components/connection/ConnectionEditFormCard/ConnectionEditFormCard.module.scss b/airbyte-webapp/src/components/connection/ConnectionEditFormCard/ConnectionEditFormCard.module.scss index ce45b41bb4f7d..343ffae519be1 100644 --- a/airbyte-webapp/src/components/connection/ConnectionEditFormCard/ConnectionEditFormCard.module.scss +++ b/airbyte-webapp/src/components/connection/ConnectionEditFormCard/ConnectionEditFormCard.module.scss @@ -1,5 +1,12 @@ +@use "scss/colors"; @use "scss/variables"; .formCard { - padding: 22px 27px variables.$spacing-xl 24px; + padding: variables.$spacing-xl; +} + +.editControls { + border-top: variables.$border-thin solid colors.$grey-100; + margin: 0 -#{variables.$spacing-xl}; + padding: variables.$spacing-xl variables.$spacing-xl 0; } diff --git a/airbyte-webapp/src/components/connection/ConnectionEditFormCard/ConnectionEditFormCard.tsx b/airbyte-webapp/src/components/connection/ConnectionEditFormCard/ConnectionEditFormCard.tsx index a0be5283d3338..3533cafa8a4a9 100644 --- a/airbyte-webapp/src/components/connection/ConnectionEditFormCard/ConnectionEditFormCard.tsx +++ b/airbyte-webapp/src/components/connection/ConnectionEditFormCard/ConnectionEditFormCard.tsx @@ -13,7 +13,6 @@ import EditControls from "../ConnectionForm/EditControls"; import styles from "./ConnectionEditFormCard.module.scss"; interface FormCardProps extends CollapsibleCardProps { - bottomSeparator?: boolean; form: FormikConfig; submitDisabled?: boolean; } @@ -21,7 +20,6 @@ interface FormCardProps extends CollapsibleCardProps { export const ConnectionEditFormCard = ({ children, form, - bottomSeparator = true, submitDisabled, ...props }: React.PropsWithChildren>) => { @@ -45,10 +43,9 @@ export const ConnectionEditFormCard = ({
    {children} -
    +
    {mode !== "readonly" && ( theme.darkPrimaryColor}; - justify-content: center; -`; - -const Loader = styled.div` - margin-right: 10px; -`; - const Success = styled(StatusIcon)` width: 26px; min-width: 26px; @@ -61,19 +44,8 @@ const ErrorText = styled.div` `; const CreateControls: React.FC = ({ isSubmitting, errorMessage, isValid }) => { - if (isSubmitting) { - return ( - - - - - - - ); - } - return ( - + {errorMessage ? ( @@ -86,11 +58,11 @@ const CreateControls: React.FC = ({ isSubmitting, errorMess
    )}
    -
    - + ); }; diff --git a/airbyte-webapp/src/components/connection/ConnectionForm/EditControls.module.scss b/airbyte-webapp/src/components/connection/ConnectionForm/EditControls.module.scss index 2afd4f0946a34..1610ff1d8d2ce 100644 --- a/airbyte-webapp/src/components/connection/ConnectionForm/EditControls.module.scss +++ b/airbyte-webapp/src/components/connection/ConnectionForm/EditControls.module.scss @@ -1,29 +1,5 @@ -@use "scss/colors"; @use "scss/variables"; -.content { - display: flex; - justify-content: flex-end; - align-items: center; - flex-direction: row; - margin-top: variables.$spacing-lg; - gap: variables.$spacing-lg; - padding: variables.$spacing-sm; -} - -.controlButton { - margin-left: variables.$spacing-md; -} - -// currently only implemented on transformation view form card, margins are specific to that implementation -// todo: standardize the margin sizes here -.line { - min-width: 100%; - height: variables.$border-thin; - background: colors.$grey-100; - margin: variables.$spacing-lg -27px 0 -24px; -} - -.buttonsContainer { - display: flex; +.container { + margin-top: variables.$spacing-md; } diff --git a/airbyte-webapp/src/components/connection/ConnectionForm/EditControls.tsx b/airbyte-webapp/src/components/connection/ConnectionForm/EditControls.tsx index fc78785d64582..6fa6fe33cd1b4 100644 --- a/airbyte-webapp/src/components/connection/ConnectionForm/EditControls.tsx +++ b/airbyte-webapp/src/components/connection/ConnectionForm/EditControls.tsx @@ -2,6 +2,7 @@ import React from "react"; import { FormattedMessage } from "react-intl"; import { Button } from "components/ui/Button"; +import { FlexContainer } from "components/ui/Flex"; import styles from "./EditControls.module.scss"; import { ResponseMessage } from "./ResponseMessage"; @@ -14,7 +15,6 @@ interface EditControlProps { successMessage?: React.ReactNode; errorMessage?: React.ReactNode; enableControls?: boolean; - withLine?: boolean; } const EditControls: React.FC = ({ @@ -25,33 +25,28 @@ const EditControls: React.FC = ({ successMessage, errorMessage, enableControls, - withLine, }) => { return ( - <> - {withLine &&
    } -
    - -
    - - -
    -
    - + + + + + + + ); }; diff --git a/airbyte-webapp/src/components/ui/CollapsibleCard/CollapsibleCard.module.scss b/airbyte-webapp/src/components/ui/CollapsibleCard/CollapsibleCard.module.scss deleted file mode 100644 index 87ff85fde1550..0000000000000 --- a/airbyte-webapp/src/components/ui/CollapsibleCard/CollapsibleCard.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.collapsibleCard { - margin-bottom: 10px; -} diff --git a/airbyte-webapp/src/components/ui/CollapsibleCard/CollapsibleCard.tsx b/airbyte-webapp/src/components/ui/CollapsibleCard/CollapsibleCard.tsx index 4b0dfdaeec9de..52b12607e2bd1 100644 --- a/airbyte-webapp/src/components/ui/CollapsibleCard/CollapsibleCard.tsx +++ b/airbyte-webapp/src/components/ui/CollapsibleCard/CollapsibleCard.tsx @@ -1,14 +1,11 @@ import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import classNames from "classnames"; import React from "react"; import { useToggle } from "react-use"; import styled from "styled-components"; import { Card } from "components/ui/Card"; -import styles from "./CollapsibleCard.module.scss"; - const CardHeader = styled.div` display: flex; justify-content: space-between; @@ -40,7 +37,6 @@ export const CollapsibleCard: React.FC = ({ return ( {title} diff --git a/airbyte-webapp/src/pages/SettingsPage/SettingsPage.module.scss b/airbyte-webapp/src/pages/SettingsPage/SettingsPage.module.scss index a756f2ddb7790..997a2399432ec 100644 --- a/airbyte-webapp/src/pages/SettingsPage/SettingsPage.module.scss +++ b/airbyte-webapp/src/pages/SettingsPage/SettingsPage.module.scss @@ -3,7 +3,6 @@ .content { display: flex; flex-direction: row; - padding-bottom: variables.$spacing-lg; } .mainView { diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.module.scss b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.module.scss deleted file mode 100644 index 17d92ee1b1e64..0000000000000 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.buttonsContainer { - display: flex; -} diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.tsx index 21030a1999776..fa40c8a3aedb0 100644 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.tsx +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.tsx @@ -3,6 +3,8 @@ import { FormattedMessage } from "react-intl"; import { CellProps } from "react-table"; import { HeadTitle } from "components/common/HeadTitle"; +import { FlexContainer } from "components/ui/Flex"; +import { Heading } from "components/ui/Heading"; import { Table } from "components/ui/Table"; import { Connector, ConnectorDefinition } from "core/domain/connector"; @@ -12,10 +14,9 @@ import { FeatureItem, useFeature } from "hooks/services/Feature"; import { useCurrentWorkspace } from "hooks/services/useWorkspace"; import ConnectorCell from "./ConnectorCell"; -import styles from "./ConnectorsView.module.scss"; import CreateConnector from "./CreateConnector"; import ImageCell from "./ImageCell"; -import { Block, FormContentTitle, Title } from "./PageComponents"; +import { FormContentTitle } from "./PageComponents"; import UpgradeAllButton from "./UpgradeAllButton"; import VersionCell from "./VersionCell"; @@ -125,7 +126,7 @@ const ConnectorsView: React.FC = ({ const renderHeaderControls = (section: "used" | "available") => ((section === "used" && usedConnectorsDefinitions.length > 0) || (section === "available" && usedConnectorsDefinitions.length === 0)) && ( -
    + {allowUploadCustomImage && } {(hasNewConnectorVersion || isUpdateSuccess) && allowUpdateConnectors && ( = ({ onUpdate={onUpdate} /> )} -
    + ); return ( @@ -143,31 +144,37 @@ const ConnectorsView: React.FC = ({ - {usedConnectorsDefinitions.length > 0 && ( - - - <FormattedMessage id={type === "sources" ? "admin.manageSource" : "admin.manageDestination"} /> - {renderHeaderControls("used")} - + + {usedConnectorsDefinitions.length > 0 && ( + + + + + + {renderHeaderControls("used")} + + + + )} + + + + + + + {renderHeaderControls("available")} +
    - - )} - - - - <FormattedMessage id={type === "sources" ? "admin.availableSource" : "admin.availableDestinations"} /> - {renderHeaderControls("available")} - -
    - + + ); }; diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/PageComponents.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/PageComponents.tsx index 31a9eaff246da..ef7827175dd42 100644 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/PageComponents.tsx +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/PageComponents.tsx @@ -1,27 +1,11 @@ import styled from "styled-components"; -import { H5 } from "components/base/Titles"; - -const Title = styled(H5)` - color: ${({ theme }) => theme.darkPrimaryColor}; - margin-bottom: 19px; - display: flex; - justify-content: space-between; - align-items: center; -`; - -const Block = styled.div` - margin-bottom: 56px; -`; - -const FormContent = styled.div` +export const FormContent = styled.div` width: 253px; margin: -10px 0 -10px 200px; position: relative; `; -const FormContentTitle = styled(FormContent)` +export const FormContentTitle = styled(FormContent)` margin: 0 0 0 200px; `; - -export { Title, Block, FormContent, FormContentTitle }; diff --git a/airbyte-webapp/src/pages/connections/ConnectionReplicationPage/ConnectionReplicationPage.module.scss b/airbyte-webapp/src/pages/connections/ConnectionReplicationPage/ConnectionReplicationPage.module.scss index fc965f61fed9e..1bba26e32786a 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionReplicationPage/ConnectionReplicationPage.module.scss +++ b/airbyte-webapp/src/pages/connections/ConnectionReplicationPage/ConnectionReplicationPage.module.scss @@ -1,8 +1,6 @@ @use "scss/variables"; .content { - padding-bottom: variables.$spacing-md; - > form { display: flex; flex-direction: column; diff --git a/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.module.scss b/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.module.scss index 48419e552f164..8badacf0e8551 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.module.scss +++ b/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.module.scss @@ -31,10 +31,6 @@ } } -.contentCard { - margin-bottom: variables.$spacing-xl; -} - .footer { width: 100%; display: flex; diff --git a/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.tsx b/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.tsx index 29bcdb7986bbb..c5f87cbf6a4bd 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.tsx +++ b/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.tsx @@ -159,7 +159,6 @@ export const ConnectionStatusPage: React.FC = () => { return ( <> diff --git a/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/ConnectionTransformationPage.module.scss b/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/ConnectionTransformationPage.module.scss index 6903e64a247b2..681bc32cc405a 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/ConnectionTransformationPage.module.scss +++ b/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/ConnectionTransformationPage.module.scss @@ -1,7 +1,17 @@ +@use "scss/variables"; + .content { max-width: 1073px; margin: 0 auto; - padding-bottom: 10px; + + & > fieldset { + margin: 0; + padding: 0; + border: 0; + display: flex; + flex-direction: column; + gap: variables.$spacing-lg; + } } .customCard { diff --git a/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/ConnectionTransformationPage.tsx b/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/ConnectionTransformationPage.tsx index 17bd026c7c276..40c9ee19e2b94 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/ConnectionTransformationPage.tsx +++ b/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/ConnectionTransformationPage.tsx @@ -61,10 +61,7 @@ export const ConnectionTransformationPage: React.FC = () => { return (
    -
    +
    {supportsNormalization && } {supportsDbt && } {supportsCloudDbtIntegration && } diff --git a/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/CustomTransformationsCard.tsx b/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/CustomTransformationsCard.tsx index 0b8a0b8455f35..88a58210773c1 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/CustomTransformationsCard.tsx +++ b/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/CustomTransformationsCard.tsx @@ -28,7 +28,6 @@ export const CustomTransformationsCard: React.FC<{ title={} collapsible - bottomSeparator form={{ initialValues, enableReinitialize: true, diff --git a/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/DbtCloudTransformationsCard.module.scss b/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/DbtCloudTransformationsCard.module.scss index 09620779260b5..9d9a85316dbcf 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/DbtCloudTransformationsCard.module.scss +++ b/airbyte-webapp/src/pages/connections/ConnectionTransformationPage/DbtCloudTransformationsCard.module.scss @@ -5,7 +5,7 @@ display: flex; flex-direction: column; align-items: center; - padding: 25px 25px 22px; + padding: variables.$spacing-xl; background-color: colors.$grey-50; } diff --git a/airbyte-webapp/src/scss/_variables.scss b/airbyte-webapp/src/scss/_variables.scss index 5f5d103e38b0e..19c967957ab54 100644 --- a/airbyte-webapp/src/scss/_variables.scss +++ b/airbyte-webapp/src/scss/_variables.scss @@ -26,7 +26,7 @@ $spacing-md: 10px; $spacing-lg: 15px; $spacing-xl: 20px; $spacing-2xl: 40px; -$spacing-page-bottom: 150px; +$spacing-page-bottom-cloud: 88px; $main-page-content-min-width: 960px; $width-size-menu: 93px; diff --git a/airbyte-webapp/src/views/Connector/ConnectorDocumentationLayout/ConnectorDocumentationLayout.module.scss b/airbyte-webapp/src/views/Connector/ConnectorDocumentationLayout/ConnectorDocumentationLayout.module.scss index 626cae0e8051a..41c28fbedb93d 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorDocumentationLayout/ConnectorDocumentationLayout.module.scss +++ b/airbyte-webapp/src/views/Connector/ConnectorDocumentationLayout/ConnectorDocumentationLayout.module.scss @@ -3,7 +3,7 @@ .leftPanel { > *:last-child { - padding-bottom: variables.$spacing-page-bottom; + padding-bottom: variables.$spacing-page-bottom-cloud; } } From db37aadf67d21d0a8f93256fbcd5003e00f70242 Mon Sep 17 00:00:00 2001 From: Joe Bell Date: Mon, 23 Jan 2023 09:12:27 -0800 Subject: [PATCH 028/195] Improve Authentication Error handling (#21087) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor checks * Add Auth Error Checks * rebase from master * some weird versioning issue * 🪟🎉 Connector builder: Substream slicer and cartesian slicer (#20861) * improve some types * improve further * clean up a bit more * refactor loading state * move loading state up * remove isLoading references * remove unused props and make fetch connector error work * remove special component for name * remove top level state for unifinished flows * start removing uiwidget * Update airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.module.scss Co-authored-by: Tim Roes * remove undefined option for selected id * remove unused prop * fix types * remove uiwidget state * clean up * adjust comment * handle errors in a nice way * do not respect default on oneOf fields * rename to formblock * reduce re-renders * pass error to secure inputs * simplify and improve styling * align top * code review * remove comment * review comments * rename file * be strict about boolean values * add example * track form error in error boundary * review comments * handle unexpected cases better * enrich error with connector id * 🪟🎉 Add copy stream button (#20577) * add copy stream button * review comments * rename prop * 🪟🎉 Connector builder: Integrate connector form for test input (#20385) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * fix small stuff * add warning label * review comments * adjust translation Co-authored-by: lmossman * use request_body_json instead of request_body_data * :window: :art: Move `Add` button into the line of Connector Builder key value list fields (#20699) * move add button into line * add stories for empty with control, and content + control * change button name to Control * 🪟🎉 Connector builder: Allow defining inputs (#20431) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * handle stored form values that don't contain new fields properly * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * 🪟🎉 Connector builder authentication (#20645) * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * fix keys * 🪟🎉 Connector builder: Session token and oauth authentication (#20712) * session token and oauth authentication * fill in session token variable * typos * make sure validation error does not go away * 🪟🎉 Connector builder: Always validate inputs form (#20664) * validate user input outside of form * review comments Co-authored-by: lmossman Co-authored-by: lmossman * fix merge conflict with dropdown prop being renamed to control * [Connector Builder] Add paginator (#20698) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * handle stored form values that don't contain new fields properly * session token and oauth authentication * fill in session token variable * fix merge of default values * add primaryKey and cursorField to builder types, and consolidate default valeues to types.ts * add cursor and primary key fields to ui * save * add page size and token option inputs * fixes after rebase * add pagination * fix pagination types * handle empty field_name better * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * typos * make sure validation error does not go away * make primary key and cursor optional, and reorder * save toggle group progress * fix style of toggle label * handle empty values better * fix page size/token option field validation and rendering * handle cursor pagination page size option correctly Co-authored-by: Joe Reuter * [Connector Builder] Add stream slicer (#20748) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * handle stored form values that don't contain new fields properly * session token and oauth authentication * fill in session token variable * fix merge of default values * add primaryKey and cursorField to builder types, and consolidate default valeues to types.ts * add cursor and primary key fields to ui * save * add page size and token option inputs * fixes after rebase * add pagination * fix pagination types * handle empty field_name better * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * typos * make sure validation error does not go away * make primary key and cursor optional, and reorder * save toggle group progress * fix style of toggle label * handle empty values better * fix page size/token option field validation and rendering * handle cursor pagination page size option correctly * save stream slicer progress * finish stream slicer * fix stream slicer fields and validation Co-authored-by: Joe Reuter * debounce form builder values update to reduce load * 🪟🔧 Connector builder: use new lowcode manifest (#20715) * use new manifest yaml * Update airbyte-webapp/src/components/connectorBuilder/types.ts Co-authored-by: Lake Mossman * use updated manifest types Co-authored-by: Lake Mossman * add substream slicer * add substream and cartesian slicer * debounce validation as well * akways show stream test button in error state if there are errors * fix type of oauth input * add validation schema for add stream form * validate all views on test click * add type to prevent console warning * do not allow path for substream slicer request option * do not show request option for substream slicer * rewrite stream slice field tooltip Co-authored-by: Tim Roes Co-authored-by: lmossman * 🪟🔧 Connector builder: Performance improvements (#20620) * improve some types * improve further * clean up a bit more * refactor loading state * move loading state up * remove isLoading references * remove unused props and make fetch connector error work * remove special component for name * remove top level state for unifinished flows * start removing uiwidget * Update airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.module.scss Co-authored-by: Tim Roes * remove undefined option for selected id * remove unused prop * fix types * remove uiwidget state * clean up * adjust comment * handle errors in a nice way * do not respect default on oneOf fields * rename to formblock * reduce re-renders * pass error to secure inputs * simplify and improve styling * align top * code review * remove comment * review comments * rename file * be strict about boolean values * add example * track form error in error boundary * review comments * handle unexpected cases better * speed up some bits * more changes * enrich error with connector id * 🪟🎉 Add copy stream button (#20577) * add copy stream button * review comments * rename prop * 🪟🎉 Connector builder: Integrate connector form for test input (#20385) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * fix small stuff * add warning label * review comments * adjust translation Co-authored-by: lmossman * use request_body_json instead of request_body_data * :window: :art: Move `Add` button into the line of Connector Builder key value list fields (#20699) * move add button into line * add stories for empty with control, and content + control * change button name to Control * 🪟🎉 Connector builder: Allow defining inputs (#20431) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * handle stored form values that don't contain new fields properly * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * 🪟🎉 Connector builder authentication (#20645) * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * fix keys * 🪟🎉 Connector builder: Session token and oauth authentication (#20712) * session token and oauth authentication * fill in session token variable * typos * make sure validation error does not go away * 🪟🎉 Connector builder: Always validate inputs form (#20664) * validate user input outside of form * review comments Co-authored-by: lmossman Co-authored-by: lmossman * fix merge conflict with dropdown prop being renamed to control * [Connector Builder] Add paginator (#20698) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * handle stored form values that don't contain new fields properly * session token and oauth authentication * fill in session token variable * fix merge of default values * add primaryKey and cursorField to builder types, and consolidate default valeues to types.ts * add cursor and primary key fields to ui * save * add page size and token option inputs * fixes after rebase * add pagination * fix pagination types * handle empty field_name better * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * typos * make sure validation error does not go away * make primary key and cursor optional, and reorder * save toggle group progress * fix style of toggle label * handle empty values better * fix page size/token option field validation and rendering * handle cursor pagination page size option correctly Co-authored-by: Joe Reuter * [Connector Builder] Add stream slicer (#20748) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * handle stored form values that don't contain new fields properly * session token and oauth authentication * fill in session token variable * fix merge of default values * add primaryKey and cursorField to builder types, and consolidate default valeues to types.ts * add cursor and primary key fields to ui * save * add page size and token option inputs * fixes after rebase * add pagination * fix pagination types * handle empty field_name better * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * typos * make sure validation error does not go away * make primary key and cursor optional, and reorder * save toggle group progress * fix style of toggle label * handle empty values better * fix page size/token option field validation and rendering * handle cursor pagination page size option correctly * save stream slicer progress * finish stream slicer * fix stream slicer fields and validation Co-authored-by: Joe Reuter * debounce form builder values update to reduce load * 🪟🔧 Connector builder: use new lowcode manifest (#20715) * use new manifest yaml * Update airbyte-webapp/src/components/connectorBuilder/types.ts Co-authored-by: Lake Mossman * use updated manifest types Co-authored-by: Lake Mossman * debounce validation as well * akways show stream test button in error state if there are errors * fix type of oauth input * review comments * fix more * add validation schema for add stream form * validate all views on test click * add type to prevent console warning * review comment * make sure testing state and form state stay consistent * improve builder errors * remove test state from streamconfig view * remove console log * remove unnecessary positive index check Co-authored-by: Tim Roes Co-authored-by: lmossman * Remove workspace helper from fetchConfigActivity (#21048) * Remove workspace helper and replace with workspaceApi * Publish new version of destination-redshift (#21083) * Update changelog * auto-bump connector version Co-authored-by: Octavia Squidington III * Progress Bar Read APIs (#20937) Follow up PR to #20787 . Make stats available to the read apis so these are available to the webapp. After this, all that is left is writing these stats as the job progresses. Add the required logic in JobHistoryHandler.java. Took the chance to also rename our internal Attempt models field from id to attemptNumber to better reflect that the field stores not the row's database id, but the job's attempt number. Most of the files changes here are due to that rename. * Rm temporal version (#21045) * Rm temporal version * Remove temporal version * Update the replayed workflow * Format * Fix pmd * 🪟🎉 Connector builder: Available inputs dropdown (#20983) * improve some types * improve further * clean up a bit more * refactor loading state * move loading state up * remove isLoading references * remove unused props and make fetch connector error work * remove special component for name * remove top level state for unifinished flows * start removing uiwidget * Update airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.module.scss Co-authored-by: Tim Roes * remove undefined option for selected id * remove unused prop * fix types * remove uiwidget state * clean up * adjust comment * handle errors in a nice way * do not respect default on oneOf fields * rename to formblock * reduce re-renders * pass error to secure inputs * simplify and improve styling * align top * code review * remove comment * review comments * rename file * be strict about boolean values * add example * track form error in error boundary * review comments * handle unexpected cases better * enrich error with connector id * 🪟🎉 Add copy stream button (#20577) * add copy stream button * review comments * rename prop * 🪟🎉 Connector builder: Integrate connector form for test input (#20385) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * fix small stuff * add warning label * review comments * adjust translation Co-authored-by: lmossman * use request_body_json instead of request_body_data * :window: :art: Move `Add` button into the line of Connector Builder key value list fields (#20699) * move add button into line * add stories for empty with control, and content + control * change button name to Control * 🪟🎉 Connector builder: Allow defining inputs (#20431) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * handle stored form values that don't contain new fields properly * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * 🪟🎉 Connector builder authentication (#20645) * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * fix keys * 🪟🎉 Connector builder: Session token and oauth authentication (#20712) * session token and oauth authentication * fill in session token variable * typos * make sure validation error does not go away * 🪟🎉 Connector builder: Always validate inputs form (#20664) * validate user input outside of form * review comments Co-authored-by: lmossman Co-authored-by: lmossman * fix merge conflict with dropdown prop being renamed to control * [Connector Builder] Add paginator (#20698) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * handle stored form values that don't contain new fields properly * session token and oauth authentication * fill in session token variable * fix merge of default values * add primaryKey and cursorField to builder types, and consolidate default valeues to types.ts * add cursor and primary key fields to ui * save * add page size and token option inputs * fixes after rebase * add pagination * fix pagination types * handle empty field_name better * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * typos * make sure validation error does not go away * make primary key and cursor optional, and reorder * save toggle group progress * fix style of toggle label * handle empty values better * fix page size/token option field validation and rendering * handle cursor pagination page size option correctly Co-authored-by: Joe Reuter * [Connector Builder] Add stream slicer (#20748) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * handle stored form values that don't contain new fields properly * session token and oauth authentication * fill in session token variable * fix merge of default values * add primaryKey and cursorField to builder types, and consolidate default valeues to types.ts * add cursor and primary key fields to ui * save * add page size and token option inputs * fixes after rebase * add pagination * fix pagination types * handle empty field_name better * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * typos * make sure validation error does not go away * make primary key and cursor optional, and reorder * save toggle group progress * fix style of toggle label * handle empty values better * fix page size/token option field validation and rendering * handle cursor pagination page size option correctly * save stream slicer progress * finish stream slicer * fix stream slicer fields and validation Co-authored-by: Joe Reuter * debounce form builder values update to reduce load * 🪟🔧 Connector builder: use new lowcode manifest (#20715) * use new manifest yaml * Update airbyte-webapp/src/components/connectorBuilder/types.ts Co-authored-by: Lake Mossman * use updated manifest types Co-authored-by: Lake Mossman * debounce validation as well * akways show stream test button in error state if there are errors * fix type of oauth input * available inputs dropdown * add validation schema for add stream form * validate all views on test click * add type to prevent console warning * improve styling * make sure padding is set correctly * make sure focus is set right * comment * use correct state hook * add tooltip to user input button and fix wording for new user input option Co-authored-by: Tim Roes Co-authored-by: lmossman * Fixed appstore docs link (#21098) * fill in all default values on switch (#21059) * 🐛Source Freshdesk: Fix schema types (#20416) * Fix schema types * Updated version * Updated acceptance tests * auto-bump connector version Co-authored-by: Octavia Squidington III * CDK: Add schema inferrer class (#20941) * fix stuff * Update schema_inferrer.py * Update schema_inferrer.py * bump version * review comments * code style * fix formatting * improve tests * Source Facebook Marketing: Docs update (#21105) * Source Amazon Ads: fix bug with handling: "Report date is too far in the past." (partial revert of #20662) (#21082) * Revert "Source Amazon Ads: fix bug with handling: "Report date is too far in the past." (#20662)" This reverts commit ec995959f7af3574cd7a6a5e63d2c2aaf3118183. * fix Signed-off-by: Sergey Chvalyuk * revert master Signed-off-by: Sergey Chvalyuk * revert to master Signed-off-by: Sergey Chvalyuk * bump 0.1.27 Signed-off-by: Sergey Chvalyuk * fix Signed-off-by: Sergey Chvalyuk * amazon-ads.md updated Signed-off-by: Sergey Chvalyuk * amazon-ads.md updated Signed-off-by: Sergey Chvalyuk * auto-bump connector version Signed-off-by: Sergey Chvalyuk Co-authored-by: Augustin Co-authored-by: Octavia Squidington III Co-authored-by: Topher Lubaway * Revert "Progress Bar Read APIs (#20937)" (#21115) Breaks when there is no config present https://github.com/airbytehq/airbyte/issues/21112 This reverts commit 3a2b0405c425562ba5fa8bfe3f5a4646c165591a. * Remove unneeded margin top and bottom (#21111) * feat(Platform): update actor configuration when receiving control messages from connectors during sync (#19811) * track latest config message * pass new config as part of outputs * persist new config * persist config as the messages come through, dont set output * clean up old implementation * accept control messages for destinations * get api client from micronaut * mask instance-wide oauth params when updating configs * defaultreplicationworker tests * formatting * tests for source/destination handlers * rm todo * refactor test a bit to fix pmd * fix pmd * fix test * add PersistConfigHelperTest * update message tracker comment * fix pmd * format * move ApiClientBeanFactory to commons-worker, use in container-orchestrator * pull out config updating to separate methods * add jitter * rename PersistConfigHelper -> UpdateConnectorConfigHelper, docs * fix exception type * fmt * move message type check into runnable * formatting * pass api client env vars to container orchestrator * pass micronaut envs to container orchestrator * print stacktrace for debugging * different api host for container orchestrator * fix default env var * format * fix errors after merge * set source and destination actor id as part of the sync input * fix: get destination definition * fix null ptr * remove "actor" from naming * fix missing change from rename * revert ContainerOrchestratorConfigBeanFactory changes * inject sourceapi/destinationapi directly rather than airbyteapiclient * UpdateConnectorConfigHelper -> ConnectorConfigUpdater * rm log * fix test * dont fail on config update error * pass id, not full config to runnables/accept control message * add new config required for api client * add test file * fix test compatibility * mount data plane credentials secret to container orchestrator (#20724) * mount data plane credentials secret to container orchestrator * rm copy-pasta * properly handle empty strings * set env vars like before * use the right config vars * 🐛Source Looker: Fix schema transformation issue (#20182) * Fix schema transformation issue * Updated PR number * Added unittest * Add a test case that uses the recursion * Unhide from cloud * Bumed seed version * [ISSUE #20322] add datetime_granularity logic to DatetimeStreamSlicer… (#20717) * [ISSUE #20322] add datetime_granularity logic to DatetimeStreamSlicer and migrate duration to ISO8601 * [ISSUE #20322] fix tests * [ISSUE #20322] code review based on clnoll's comments and fixed tests * [ISSUE #20322] fix flake8 error * [ISSUE #20322] fix source tests * [ISSUE #20322] fixing yet another error in source * [ISSUE #20322] code review * [ISSUE #20322] adding new sources using datetime slicer * [ISSUE #20322] fixing source-datascope and increasing version * [ISSUE #20322] regenerate component schema * [ISSUE #20322] fixing source-datascope * [ISSUE #20322] extra field error * Source Slack: update schema; data from openapi spec (#20767) * Source Slack: update schema; data from openapi spec * Source Slack: Docs update * Source Slack: Update schema * Source Slack: Update schema (timestamp returned in POSIX time) * Source Slack: Disable backward compatibility test for discovery * auto-bump connector version Co-authored-by: Octavia Squidington III * make sure name is rendered in first position (#21101) * Source Github: Raise Error if no organizations or repos are available (#21084) * Source Github: Raise Error if no organizations or repos are available * Source GitHub: Update docs; bump version * Source GitHub: Add test * Source GitHub: Exclude empty streams * auto-bump connector version Co-authored-by: Octavia Squidington III * Convert the server to micronaut (#19194) * Extract Operation API * Extract scheduler API * Format * extract source api * Extract source definition api * Add path * Extract State API * extract webbackend api * extract webbackend api * extract workspace api * Extract source definition specification api * Remove configuration API * tmp * Checkstyle * tmp * tmp * Inject but don't resolve Bean * tmp * Tmp * fix build * TMP * Tmp * Clean up * better thread pool * Change port to 8080 * Fix port * Rm unused * Cors filter * Format * rename * Tmp * Config based * Rm health controller ref * tmp * Pool size * Mock healthcheck * Revert "Mock healthcheck" This reverts commit 466677636bda96bed7bbfd354a59abc38ff1e315. * Revert "Revert "Mock healthcheck"" This reverts commit 267094ae149f3c077bdba6f71646d99655ce81a0. * Restore health check * Tmp * format * Rm deprecated * Fix PMD * Tmp * Fix proxy test * Remove useless annotation * set auto commit as false * Clean up and PR comments * Bmoric/convert attempt micronaut (#19847) * tmp * Fix build * tmp * Tmp * tmp * tmp * Tmp * tmp * tmp * Clean up * Comments and banner * Non related files * rm tmp * Fix build * Format * Hit the micronaut server directly * micronaut OperationApiController (#20270) * micronaut OperationApiController * pass micronaut client to OperationApi * Bmoric/convert connection micronaut (#20211) * tmp * Fix build * tmp * Tmp * tmp * tmp * Tmp * tmp * tmp * Clean up * tmp * Convert Connection Api Controller * PR Comments * convert openapiapicontroller to micronaut (#20258) * convert openapiapicontroller to micronaut * merge health/openapi locations into one entry * Fix build * Format * Remove media type * Format Co-authored-by: Cole Snodgrass * Bmoric/convert destination controller micronaut (#20269) * tmp * Fix build * tmp * Tmp * tmp * tmp * Tmp * tmp * tmp * Clean up * tmp * Convert Connection Api Controller * Tmp * PR Comments * convert openapiapicontroller to micronaut (#20258) * convert openapiapicontroller to micronaut * merge health/openapi locations into one entry * Fix bean * Add JsonSchemaValidator as a Bean * Fix build * Format * Format * Test fix * Pr comments * Remove media type * Format * Remove media type * Format * format * Add missing airbyte api client Co-authored-by: Cole Snodgrass * Bmoric/convert destination definition controller micronaut (#20277) * tmp * Fix build * tmp * Tmp * tmp * tmp * Tmp * tmp * tmp * Clean up * tmp * Convert Connection Api Controller * Tmp * PR Comments * convert openapiapicontroller to micronaut (#20258) * convert openapiapicontroller to micronaut * merge health/openapi locations into one entry * Fix bean * Add JsonSchemaValidator as a Bean * Fix build * Format * Format * Test fix * Pr comments * Remove media type * Format * Remove media type * Format * Remove media type * Format * api client * missing annotation * format Co-authored-by: Cole Snodgrass * convert StateApiController to Micronaut (#20329) * convert to micronaut * nginx updates * format * Move dest oauth to micronaut (#20318) * tmp * Fix build * tmp * Tmp * tmp * tmp * Tmp * tmp * tmp * Clean up * tmp * Convert Connection Api Controller * PR Comments * convert openapiapicontroller to micronaut (#20258) * convert openapiapicontroller to micronaut * merge health/openapi locations into one entry * Fix build * Format * Remove media type * Format * Move dest oauth to micronaut * Pr comments * format Co-authored-by: Cole Snodgrass * Bmoric/convert source micronaut (#20334) * tmp * Fix build * tmp * Tmp * tmp * tmp * Tmp * tmp * tmp * Clean up * tmp * Convert Connection Api Controller * PR Comments * convert openapiapicontroller to micronaut (#20258) * convert openapiapicontroller to micronaut * merge health/openapi locations into one entry * Fix build * Format * Remove media type * Format * Tmp * tmp * Build * missing bean * format Co-authored-by: Cole Snodgrass * Migrate to micronaut (#20339) * Migrate source to micronaut * convert SchedulerApiController to Micronaut (#20337) * wip; SchedulerApiController * remove @Named * remove @Singleton * add back todo message * Bmoric/convert source definition micronaut (#20338) * tmp * Fix build * tmp * Tmp * tmp * tmp * Tmp * tmp * tmp * Clean up * tmp * Convert Connection Api Controller * PR Comments * convert openapiapicontroller to micronaut (#20258) * convert openapiapicontroller to micronaut * merge health/openapi locations into one entry * Fix build * Format * Remove media type * Format * Tmp * tmp * Build * missing bean * Tmp * Add Beans * fix Bean * Add passthrough * Clean up * Missing path * FIx typo * Fix conflicts * for mat Co-authored-by: Cole Snodgrass * update SourceOauthApiController to Micronaut (#20386) * convert SourceOauthApiController to Micronaut * remove SourceOauthApi reference * convert WorkspaceApiController to micronaut (#20214) * wip; broken * convert WorkspaceApiController to micronaut * remove test controller * format * format * add @Body to SourceOauthApiController * consolidate nginx settings * remove unnecessary factories * Bmoric/convert jobs micronaut (#20382) * Convert jobs to micronaut * Nit * Format * Bmoric/convert source definition specification micronaut (#20379) * Migrate source definition specifications to micronaut * Format * Format * convert database assert call to Micronaut (#20406) * remove dupe config section; add DatabaseEventListener * move eventlistner to correct package; update implementation * convert NotificationsApiController to Micronaut (#20396) * convert NotificationsApiController to Micronaut * format * Migrate logs to micronaut (#20400) * Bmoric/convert webbackend micronaut (#20403) * Convert jobs to micronaut * Nit * Format * Migrate the webbackend to micronaut * Add missing Bean * Cleanup (#20459) * Cleanup * More cleanup * Disable in order to test cloud * Restore missing files * Fix test * Format and fix pmd * Add transactional * Fix version * Tentative * Cleanup the cleanup * Rm reference to the micronaut server * format * pmd * more pmd * fix build * Delete logs API * Revert "Delete logs API" This reverts commit fcb271dcdf51d9904fa5d482e5c3e6984d5bc182. * Rm flaky test * Format * Try to fix test * Format * Remove optional * Rm import * Test sleep * Simplify injection * update import * Remove sleep * More injection * Remove more requirement * imports * Remove more requirement * Fix yaml * Remove unused conf * Add role * Test acceptance test * Update env * Revert "Update to Micronaut 3.8.0 (#20716)" This reverts commit a28f93747ffb7c8ad9e30a4a90ceada9d0d7dc0e. * Update helm chart * Fix helm chart * Convert Application Listener * Format * Add explicit deployment mode * Change check port * Update version and bump version to the right value * Cleanup * Update FE end to end test * Allow head request * Fix controller * Format * Fix http client Bean * Format Co-authored-by: Cole Snodgrass * 🪟 🐛 🎨 Fix stream table icon checkboxes and icons (#21108) * Update new stream table icon positioning and style * Add custom icons from design file * Add opacity animation * Fix checkbox sizing in current streams table * Update test snapshots * Use explicit configuration for Micronaut endpoints (#20759) * process config control messages during `check` and `discover` (#20894) * track latest config message * pass new config as part of outputs * persist new config * persist config as the messages come through, dont set output * clean up old implementation * accept control messages for destinations * get api client from micronaut * mask instance-wide oauth params when updating configs * defaultreplicationworker tests * formatting * tests for source/destination handlers * rm todo * refactor test a bit to fix pmd * fix pmd * fix test * add PersistConfigHelperTest * update message tracker comment * fix pmd * format * move ApiClientBeanFactory to commons-worker, use in container-orchestrator * pull out config updating to separate methods * add jitter * rename PersistConfigHelper -> UpdateConnectorConfigHelper, docs * fix exception type * fmt * move message type check into runnable * formatting * pass api client env vars to container orchestrator * pass micronaut envs to container orchestrator * print stacktrace for debugging * different api host for container orchestrator * fix default env var * format * fix errors after merge * set source and destination actor id as part of the sync input * fix: get destination definition * fix null ptr * remove "actor" from naming * fix missing change from rename * revert ContainerOrchestratorConfigBeanFactory changes * inject sourceapi/destinationapi directly rather than airbyteapiclient * UpdateConnectorConfigHelper -> ConnectorConfigUpdater * rm log * fix test * dont fail on config update error * process control messages for discover jobs * process control messages for CHECK * persist config updates on check_connection_for_update * get last config message rather than first * fix pmd * fix failing tests * add tests * source id not required for check connection (create case) * suppress pmd warning for BusyWait literal * source id not required for checkc onnection (create case) (p2) * pass id, not full config to runnables/accept control message * add new config required for api client * add test file * remove debugging logs * rename method (getLast -> getMostRecent) * rm version check (re-added this in by mistake on merge) * fix test compatibility * simplify * 🪟🧹 Connector builder: Fast fields performance improvements (#20957) * improve some types * improve further * clean up a bit more * refactor loading state * move loading state up * remove isLoading references * remove unused props and make fetch connector error work * remove special component for name * remove top level state for unifinished flows * start removing uiwidget * Update airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.module.scss Co-authored-by: Tim Roes * remove undefined option for selected id * remove unused prop * fix types * remove uiwidget state * clean up * adjust comment * handle errors in a nice way * do not respect default on oneOf fields * rename to formblock * reduce re-renders * pass error to secure inputs * simplify and improve styling * align top * code review * remove comment * review comments * rename file * be strict about boolean values * add example * track form error in error boundary * review comments * handle unexpected cases better * speed up some bits * more changes * enrich error with connector id * 🪟🎉 Add copy stream button (#20577) * add copy stream button * review comments * rename prop * 🪟🎉 Connector builder: Integrate connector form for test input (#20385) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * fix small stuff * add warning label * review comments * adjust translation Co-authored-by: lmossman * use request_body_json instead of request_body_data * :window: :art: Move `Add` button into the line of Connector Builder key value list fields (#20699) * move add button into line * add stories for empty with control, and content + control * change button name to Control * 🪟🎉 Connector builder: Allow defining inputs (#20431) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * handle stored form values that don't contain new fields properly * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * 🪟🎉 Connector builder authentication (#20645) * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * fix keys * 🪟🎉 Connector builder: Session token and oauth authentication (#20712) * session token and oauth authentication * fill in session token variable * typos * make sure validation error does not go away * 🪟🎉 Connector builder: Always validate inputs form (#20664) * validate user input outside of form * review comments Co-authored-by: lmossman Co-authored-by: lmossman * fix merge conflict with dropdown prop being renamed to control * [Connector Builder] Add paginator (#20698) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * handle stored form values that don't contain new fields properly * session token and oauth authentication * fill in session token variable * fix merge of default values * add primaryKey and cursorField to builder types, and consolidate default valeues to types.ts * add cursor and primary key fields to ui * save * add page size and token option inputs * fixes after rebase * add pagination * fix pagination types * handle empty field_name better * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * typos * make sure validation error does not go away * make primary key and cursor optional, and reorder * save toggle group progress * fix style of toggle label * handle empty values better * fix page size/token option field validation and rendering * handle cursor pagination page size option correctly Co-authored-by: Joe Reuter * [Connector Builder] Add stream slicer (#20748) * move connector builder components into the same shared components/connectorBuilder directory * move diff over from poc branch * save current progress * add modal for adding streams * focus stream after adding and reset button style * add reset confirm modal and select view on add * style global config and streams buttons * styling improvements * handle long stream names better * pull in connector manifest schema directly * add box shadows to resizable panels * upgrade orval and use connector manifest schema directly * remove airbyte protocol from connector builder api spec * generate python models from openapi change * fix position of yaml toggle * handle no stream case with better looking message * group global fields into single object and fix console error * confirmation modal on toggling dirty form + cleanup * fix connector name display * undo change to manifest schema * remove commented code * remove unnecessary change * fix spacing * use shadow mixin for connector img * add comment about connector img * change onSubmit to no-op * remove console log * clean up styling * simplify sidebar to remove StreamSelectButton component * swap colors of toggle * move FormikPatch to src/core/form * move types up to connectorBuilder/ level * use grid display for ui yaml toggle button * use spread instead of setting array index directly * add intl in missing places * pull connector manifest schema in through separate openapi spec * use correct intl string id * throttle setting json manifest in yaml editor * use button prop instead of manually styling * consolidate AddStreamButton styles * fix sidebar flex styles * use specific flex properties instead of flex * clean up download and reset button styles * use row-reverse for yaml editor download button * fix stream selector styles to remove margins * give connector setup guide panel same corner and shadow styles * remove blur from page display * set view to stream when selected in test panel * add placeholder when stream name is empty * switch to index-based stream selection to preserve testing panel selected stream on rename * handle empty name in stream selector * make connector form work in connector builder * wip * fix small stuff * add basic input UI * user inputs * make most of inputs configuration work * fix a bunch of stuff * handle unknown config types * add warning label * fix label * fix some styling * review comments * improve state management and error handling * allow auth configuration * check for conflicts with the inferred inputs * fix invisible inputs * handle stored form values that don't contain new fields properly * session token and oauth authentication * fill in session token variable * fix merge of default values * add primaryKey and cursorField to builder types, and consolidate default valeues to types.ts * add cursor and primary key fields to ui * save * add page size and token option inputs * fixes after rebase * add pagination * fix pagination types * handle empty field_name better * Update airbyte-webapp/src/locales/en.json Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/InputsView.tsx Co-authored-by: Lake Mossman * inputs editing weirdness * input form reset * using the Label component * reduce redundancy and hide advanced input options for inferred inputs * unnecessary validation * typo * unnecessary effect hook * build spec even for invalid forms but do not update stream list * typos * make sure validation error does not go away * make primary key and cursor optional, and reorder * save toggle group progress * fix style of toggle label * handle empty values better * fix page size/token option field validation and rendering * handle cursor pagination page size option correctly * save stream slicer progress * finish stream slicer * fix stream slicer fields and validation Co-authored-by: Joe Reuter * debounce form builder values update to reduce load * 🪟🔧 Connector builder: use new lowcode manifest (#20715) * use new manifest yaml * Update airbyte-webapp/src/components/connectorBuilder/types.ts Co-authored-by: Lake Mossman * use updated manifest types Co-authored-by: Lake Mossman * debounce validation as well * akways show stream test button in error state if there are errors * fix type of oauth input * review comments * fix more * start implementing fast fields * a few more fastfields * fix some stuff * complete fast fields work * memoize a bit more * remove irrelevant change * fix types * some more improvements * prevent all out-of-line validation calls * use derivedJsonManifest when in UI view Co-authored-by: Tim Roes Co-authored-by: lmossman * In Cloud, out of date connectors call always returns 0 (#21126) * isCloudApp returns a boolean now * Connector service never makes the check updates call in Cloud * Move hadoop-lzo to test dependency (#21085) * remove hadoop-lzo from gradle dependencies in destination-s3 project * move hadoop-lzo from build time to test time dependencies in base-s3 project * Update Connector Builder docs to reflect configuration UI additions (#21129) * update connector builder docs for UI MVP release * remove note about separately declaring schemas * Revert "Convert the server to micronaut (#19194)" (#21132) This reverts commit 0b153d11f9b5cc723acc6bbfd0478bd74e124c53. * 🐛 Source Google Ads: publish missing `0.2.6` (#21103) * Remerge Progress Bar Read API. (#21124) Let's try #20937 again, this time with better test for error cases. See original PR for description. This PR adds testing and logic to handle empty/bad job input. * Bump Airbyte version from 0.40.26 to 0.40.27 (#21135) Co-authored-by: lmossman * add import rule changes for Kotlin code (#21136) * Source Okta: OAuth2.0 support - disabled (#20877) * Disabled OAuth Okta * Updated acceptance tests * Updated PR number * auto-bump connector version Co-authored-by: Octavia Squidington III * Remove the quarantine status (#21088) * Rm temporal version * Remove temporal version * Update the replayed workflow * Remove quarantine information * normalization: delete supportsDbt and supportsNormalization from DestinationDefinitionSpecificationRead (#21005) * delete supportsDbt and supportsNormalization from DestinationDefinitionSpecificationRead * FE changes * add new fields to the DestinationDefinitionRead API model * update handlers * update api doc * update handlers * remove debug loggin * implement suggestions * update octavia-cli tests * fix supported check * update octavia-cli * fix integration tests * fix mocks * fix forgotten renaming Co-authored-by: Evan Tahler * Allow for custom requesters to be defined in low-code manifests (#21001) * Allow for custom requesters to be defined in low-code manifests * add test for custom requester component * bump versions and changelog * adjust readme (#20945) * 🪟🎨 Connector form: Improve logs look and feel (#20951) * improve logs look and feel in connector form * add button to toggle * lokk and feel * Adjust GitHub flow for FE chapter (#20813) * Adjust GitHub flow for FE chapter * Change labeler config * Source: Google Analytics 4 (GA4) - improve config validation and SAT (#20889) Signed-off-by: Sergey Chvalyuk * Simplify messaging for sync canceled jobs (#20999) * Hide stats * Show cancelled icon when it's multiple attempts * Update attempts count to gray * Extract shared attempt functions into utils file * Cleanup component export and scss imports * Fix height glitch when opening and closing log * Remove deprecated getter (#21089) * Rm temporal version * Remove temporal version * Update the replayed workflow * Remove quarantine information * Remove deprecated getter * Import error broke master (#21165) * allow the cursors and primary keys to be deselected when the sync mode does not require it (#21117) * Connector builder server: Add inferred schema to read API response (#20942) * fix stuff * add inferred schema to API * fix yaml changes * fix yaml formatting * add whitespace back * reorder imports * New destination: databend (community PR #19815) (#20909) * feat: Add databend destination Co-authored-by: hantmac Co-authored-by: josephkmh Co-authored-by: Sajarin * Update postgres.md (#21170) * Source Facebook Marketing: Update schema ad_account (#21149) * Source Facebook Marketing: Update schema ad_account * Source Facebook Marketing: Update docs; bump version * Source Facebook Marketing: disable backward compatibility * auto-bump connector version Co-authored-by: Octavia Squidington III * Revert "Revert Convert the server to micronaut" (#21133) * Revert "Revert "Convert the server to micronaut (#19194)" (#21132)" This reverts commit 31c65f8eea479ba7e1149f2ccb936220b27a39f1. * Fix the cors * Fix cloud * Amazon Seller Partner: Validate connections without orders data (#20896) * amazon seller partner validate connection without orders data * amazon seller partner bump version in docs * amazon seller partner fix redundant if statement * auto-bump connector version Co-authored-by: Sajarin Co-authored-by: Octavia Squidington III * Source Harvest: Skip 403 FORBIDDEN for all streams (#21151) * Source Harvest: Skip 403 FORBIDDEN for all streams * Source Harvest: update docs * auto-bump connector version Co-authored-by: Octavia Squidington III * test for behavior when a column is removed in an incremental sync (#20033) * test for behavior when a column is removed in an incremental sync * fixes in dat test for dropping a column * only run drop-one-column test for the exchange rates dataset * re-enable tests that were disabled during development * remove unused import * update test to new method for checking spec capabilities * use config directly instead of parameterized test Co-authored-by: Michael Siega Co-authored-by: Michael Siega <109092231+mfsiega-airbyte@users.noreply.github.com> * Source Mailchimp - fix the way request params are built (#20765) * 1058 source mailchimp - fix the way request params are built * auto-bump connector version Co-authored-by: Octavia Squidington III * 🐛 🎉 Source Airtable: migrate to the `Metadata API` for dynamic schema generation (#20846) * Extend connection list filtering (#21094) * Update listWorkspaceStandardSyncs to support lists of sources/destinations * Update API spec * test cleanup (#21178) * removed error (#20612) * Adjust connector icons (#20547) * Adjust connector icons * Update icons * Add missing icons * Remove missing icon from spec * Add trailing newline * Fix test * Use jest directly as test runner (#21174) * 🪟 🎨 Refining BulkEditPanel component (#20474) * Adds handling for source defined and unavailable stream paths inside PillSelect * Adds handling of unavailable cursor and primary key field for PillButton components * Adds useMemo to SyncPathSelect component * Add InfoText component for cursor field and primary key to match table design in Figma * Removes animation for BulkEditPanel; Adds StreamPathSelect new property pillIfChangeUnavailable for cases when we need or not to render pill under unavailable to change path text * Disables pointer event while PillButton is disabled * Adds renderDisabledState property to control PillSelect content while disabled * Changes renderDisabledState -> disabledLabel * 🪟 🔧 Add tests for BulkEditService (#20820) * Add tests for BulkEditService * Add act function to test cases while updating state * Add tests full description; Adds type to MOCK_NODES array; Fixes import relative path * Connector builder: E2e tests (#21122) * wip * wip * e2e tests for connector builder server * rename function * clean up * clean up a bit more * fix path * fix and add documentation * more documentation * stabilze * review comments * 🎉 Source Airtable: update `releaseStage` to `beta` (#20935) * 🪟 🎉 Disable deselection of cursor field/primary key in the UI (#20844) * 🪟 🔧 Update frontend typing of cloud api response (#21086) * 🪟 🔧 Use CSS Custom Properties for colors (#19344) * use css custom properties for colors * separate tokens by hue * adjust stylelint * fix code editor color transformations * remove blue-transparent from color palette * scope opacity to bg only * rename to theme-light * avoid transparent blue, use palette color instead * bring back expanding hex values * replace tooltip colors * define overlay color in theme * fix tooltip colors * slightly darker link color * remove unused SC colors * add box shadow variables * light tooltip table variant * inline one-off colors for login * add new colors to theme-light * fix import name * fix merge conflict with box shadows * fix overlay bg color Co-authored-by: lmossman * ci-connector-ops: change required reviewers logic (#21158) * [ISSUE-20322] updating tutorial documentation (#21163) * [ISSUE-20322] updating tutorial documentation * [ISSUE-20322] updating test and improving docs * Connector builder server: Fix unit tests (#21107) * fix stuff * add inferred schema to API * fix yaml changes * fix yaml formatting * add whitespace back * fix tests * reformat * add unit tests * Destination connector for teradata vantage (rebased community PR) (#21160) * Destination connector for teradata vantage is implemented * add teradata destination to seed yaml * Add teradata destination to specs seed file Co-authored-by: Satish Chinthanippu * 🎉 Updates for edit password field in connector (#20723) * Moves Cancel button to the left. * changes Edit button to outline - secondary variant. * Updates button size to match input height. * convert EnvVariableFeatureFlag to an injected dependency (#21171) * inject feature-flag client into integration-launcher * inject feature-flag client into message-tracker * inject feature-flag client into DefaultAirbyteSource * missed reference in message-tracker * Updated ISO certification date (#21181) * added info * edited wording * Source google ads: add more logs (#20755) * #1148 source google ads: add more logs * #1148 source google ads: upd changelog * #1148 source google ads: flake fix * #1148 source google ads - fix SATs * #1148 source Google Ads: bump version * #1148 source google ads: upd expected records * auto-bump connector version Co-authored-by: Octavia Squidington III * 🎉 Destination Local CSV: add custom delimiter (#17998) * Adds delimeter to the spec file. Adds function to get delimeter from the config. * New delimiter works, but only checked raw airbyte tables. * Fixes testWriteFailure(), testWriteSuccess() still broken. * Corrects CSVFormat and now all tests pass. * Implements tab separator. * Corrects tooltip on destination settings page. * Creates CSV file with delimiters and prints it as stirng. * Adds try catch block for assertion. Deletes file after test run. * Removes separate format for tab dleimiter, it is not needed. * Cleans up code. * Adds missing bracket. * Adds files from incorrect rebase. * Corrects imports. * Fixes connectors base build. * Corrects Dockerfile version bump. Adds changelog. * Corrects getProtocolVersion method and makes CSVDataArgumentsProvider class static. * auto-bump connector version Co-authored-by: Octavia Squidington III * Source Airtable: fix field names (#21215) * Source S3: update block size for json (#21210) * Source S3: update block size for json * Source S3: update docs * auto-bump connector version Co-authored-by: Octavia Squidington III * 🪟 🧹 Custom connectors in Cloud UI updates (#21034) * check if doc url is a valid url in cloud, but don't require it * field label and placeholder * cleanup * match casing for other form labels * cleanup imports * hide documentation panel if URL is empty * only show documentation panel if url is from our docs * make docs url optional, don't put a link in conncectorsview if empty * Update airbyte-webapp/src/views/Connector/ConnectorDocumentationLayout/ConnectorDocumentationLayout.tsx Co-authored-by: Joey Marshment-Howell * use , cleanup from Joey's commit in review comment * Use component in ImageCell, get styled components out of there while I'm at it * add "required" labels * show validation error regardless of `touched` for documentationUrl * use old placeholder instead Co-authored-by: Joey Marshment-Howell * lowcode docs: add link to YAML reference (#21231) * Update platform-workflow-labels.yml (#21225) * Update README.md (#21236) Update connector release stage docs * Enforce HTTPS (#21182) * Enforce HTTPS * 🪟🐛 Connector builder UI: Fix datetime stream slicer (#21161) * fix datetime stream slicer * Update airbyte-webapp/src/components/connectorBuilder/Builder/StreamSlicerSection.tsx Co-authored-by: Lake Mossman * Update airbyte-webapp/src/components/connectorBuilder/Builder/StreamSlicerSection.tsx Co-authored-by: Lake Mossman Co-authored-by: Lake Mossman * [ISSUE #19981] testing version bump (#21106) * [ISSUE #19981] testing version bump * [ISSUE #19981] debugging part-to-bump * [ISSUE #19981] further debugging on part-to-bump * [ISSUE #19981] further debugging on part-to-bump yet again * [ISSUE #19981] further debugging on part-to-bump yet again and again * [ISSUE #19981] improving on first successful attempt * [ISSUE #19981] adding changelog and concurrency * [ISSUE #19981] update version in .bumpversion.cfg * [ISSUE #19981] testing Slack notification with working channel * [ISSUE #19981] documentation and clean up before PR * [ISSUE #19981] make changelog-message optional * [ISSUE #19981] align version with new release * [ISSUE #19981] code review * [Low-Code CDK] Handle forward references in manifest (#20893) [Low-Code CDK] Handle forward references in manifest * Update form field labels in connection form to match design (#21036) * Update form field labels in connection form to match design - Replaced ControlLabels message property with infoTooltipContent - Replaced property "flex-start" to "center" for FlexContainer (New Connection) * Hide no credits banner for no billing accounts (#21218) * Fix auto detect schema change backdrop color CSS (#21246) * Source notion: fix schema (#20639) * #1047 oncall - Source Notion: fix Pages stream schema * #1047 oncall - Source Notion: fix Pages stream schema * #1047 oncall - Source Notion: upd changelog * #1047 source notion - remove ignored fields * #1047 source notion: fix SATs * #1047 source notion: upd expected records * auto-bump connector version Co-authored-by: Octavia Squidington III * [Connector-builder server] Allow client to specify record limit and enforce max of 1000 (#20575) * Upgrade to Micronaut 3.8.0 and related dependencies (#21077) * Upgrade to Micronaut 3.8.0 and related dependencies * Define hostname/subdomain to be compatible with updated AWS SDK * Use bucket name for hostname * Pin dependencies to avoid behavior change * Add comment * Source Google Analytics Data API: slicer updated, unit tests added (#21169) Signed-off-by: Sergey Chvalyuk * Bmoric/restore old interface (#21235) * Re introduce old exception mapper * Use mapper * Switch CI to use npm ci (#21259) * postgres-source-cdc: handle null values for array data types (#21003) * postgres-source-cdc:handle null values for array data types * fix test * upgrade version * auto-bump connector version Co-authored-by: Octavia Squidington III * 🪟 🐛 Fix broken switch UI state - when checked state provided as a "value" (#21219) * fix broken switch state - when checked state provided as a "value" * Update airbyte-webapp/src/components/ui/Switch/Switch.tsx Co-authored-by: Krishna (kc) Glick Co-authored-by: Krishna (kc) Glick * 🪟 🔧 Use experiment for new streams table design (#21230) * Use experiment for new streams table design * Update formConfig validationSchema to use a hook to get the feature flags directly * Add useNewTableDesignExperiment helper hook * Rename isNewStreamsTableEnabled -> isNewTableDesignEnabld * Cleanup tidyFormValues to take the existing schema in * Fix var name in CatalogTreeTableHeader * Source Snapchat Marketing: fix error response (#21267) * Source Snapchat Marketing: fix error response * Source Snapchat Marketing: update docs * auto-bump connector version Co-authored-by: Octavia Squidington III * [Low-Code CDK] Parse incoming manifest objects into Pydantic models (#20747) * initial work to parse manifest objects into pydantic models * pr feedback and some other validations * rerun manifest schema generation * remove field constraint due to bug * add a few tests for the model to component factory * add catch * fix a bug where propagated schema doesn't work with old factory * add additionaProperties: false to the handwritten schema * regenerate pydantic models * fix test * [Low Code CDK] Add type annotations and cleanup usage of `visited` set (#21268) * [Low Code CDK] Add type annotations and cleanup usage of `visited` set * 🤖 Bump minor version of Airbyte CDK * feat: mention user on failed master branch build (#21201) * 🪟 🔧 Fixed passed props to `` which cause error in console (#20711) * fixed sourceDefinitionId and destinationDefinitionId * clean up props * Connector builder server: Fail on failing tests (#21198) * fail on failing command * fix test * Source Google Ads: Update docs (#21308) * Source Ads: docs * Source Ads: docs * Migrate airbyte-bootloader to Micronaut (#21073) * Migrate airbyte-bootloader to Micronaut * PR feedback * More PR feedback * Rename variable for clarity * Add properties to support cloud * Formatting * Use default values for env vars * Re-organization to support cloud overrides * Disable conditional logging * More singleton cleanup * test: try CI without fluentbit * Revert "test: try CI without fluentbit" This reverts commit 8fa0f7410602078296c859c0e783dbdc8456c4a7. * test: enable SSH on EC2 runner * Revert "test: enable SSH on EC2 runner" This reverts commit e4867aae0965faa6ebf83e19e5bd9e9765478099. * Avoid early database connection on startup * Fix compile issues from refactor * Formatting Co-authored-by: perangel * 🪟 🧹 Reorganize connections pages (#20845) * Reorganize connection pages Flatten structure Simplify names * Consolidate all the Connection routes to a single file * Extract job types and utilities to own files within JobItem Move JobsWithJobs to JobItem/utils * Move ConnectionName component to components/connection * Move StatusMainInfo components and rename to components/connection/ConnectionInfoCard * Move ConnectionBlock to components/connection * Clean up ConnectionPage structure * Update style import in ConnectionInfoCard test * Clean up ConnectionRoutePaths enum * Apply suggestions from code review - Update export default style Co-authored-by: Krishna (kc) Glick * Update ConnectionInfoCard test description name * Update test snapshots Co-authored-by: Krishna (kc) Glick * Add bootloader/server to published images for Cloud (#21325) * 🪟 🚦 E2E: Fix duplicated database object warning (#20926) * replace "cypress-postgres" with "pg-promise" npm package * update cypress config * update userDefineConnection type and naming * Update airbyte-webapp-e2e-tests/cypress/plugins/index.ts Co-authored-by: Mark Berger Co-authored-by: Mark Berger * Run Airbyte CI on pull_request (#21266) * Run Airbyte CI on pull_request as well * also only run on pushes to master * 🎉 Source bigcommerce: add brands and categories streams (#20518) * Add product info to the orders stream * Update docs * Refactor order_products into its own stream * formatting * Update docs and docker version * remove duplicate field * Add brands and categories streams to bigcommerce * remove duplicate state * remove duplicate source * update docs * update docs * bump docker version * update markdown * lint * auto-bump connector version Co-authored-by: Sajarin Co-authored-by: Haithem SOUALA Co-authored-by: Octavia Squidington III * 🎉 New Destination: Weaviate (#20094) * Add Weaviate Destination #20012 * Fix formatting and standards * Fix flake issue * Fix unused client variable * Add support for int based ID fields * Ensure stream name meets Weaviate class reqs * add integration test for using pokemon as source * handle nested objects by converting to json string * create schema for transforming data to weaviate * Add docs for weaviate destination * Remove pokemon-schema external dependency * Remove pikachu integration test external dep * Add large batch test case * add test for second sync * Fix issue with fields starting with uppercase * add more checks to line_break test * Update README for Weaviate * Make batch_size configurable with 100 as default * Add support for providing vectors * Update docs * Add test for existing Weaviate class * Add trying to create schema in check connection * Add support for mongodb _id fields * Add support for providing custom ID * remove unused file * fix flow of is_ready() check * Move standalone functions to utils.py * Support overwrite mode * Add regex based stream_name_class_name conversion * remove unneeded print statement * Add "airbyte_secret" : true to password config * add support for array of arrays * remove unneeded variable declaration * change to MutableMapping since we use del * change name from queued_write to buffered_write * add retry on partial batch error * Fix partial batch retry and add tests * fix ID generation * Clean up recursive retry logic * fix flake tests * ran flake reformat * add definitions Co-authored-by: Ivica Taseski Co-authored-by: itaseski * Make schema field in source-snowflake mean a subset of the specified o… (#20465) * Make schema field in source-postgres mean a subset of the specified of schema when during discover(). update UI * Add missing file * Fix failing acceptance test * sanity * update doc * typo * version bump and release note * Fix failing test * fix format * Ensure Local Secret Persistence is Initialized (#21329) * Formatting * Ensure that local persistence is initialized * December release notes docs (#21270) * added december release notes * edits * Add dependencies to docker-compose (#19321) * Revert "Revert "Add dependencies to docker-compose (#19257)" (#19306)" This reverts commit b16f28fd4d9bd05c3512d1f6dbb94af2672259b3. * Bump docker-compose version * test * Revert "test" This reverts commit c3b28c9ec3233d33c2646b349f02a09fbd520f65. * Bump docker compose version to 3.8 * test * test * Use a newer docker for platform build * test * Use docker compose v2 * Update docker for frontend e2e * Use docker compose v2 for e2e tests * Update tools to use docker compose v2 * Update more docker compose references to v2 * Update docker compose usage in docs * Update deploying airbyte docs * Fix permission * Case insensistive check * Add extra mention for docker compose in upgrading airbyte * Improve upgrade docker note * store env-var response (#21327) * store env-var response * fix formatting * fix pmd issue * change log message to debug * fix file change error * Better escape the select query for a case a schema name starts with a number (#21051) * Better escape the select query for a case a schema name starts with a numebr. * improve test * fix unrelated build error * manually bump source definition version (#21349) * :bug: Source Jira: `check_connection` fails if no projects are defined (#20739) Co-authored-by: Evan Tahler Co-authored-by: Octavia Squidington III Co-authored-by: Serhii Chvaliuk Co-authored-by: Augustin * airbyte-common-workers: Collect trace message on failed connection_status (#20721) * 🪟 🎉 Verify auth status on tab focus (#21175) * Make documentation_url optional in a declarative connector spec (#21347) * Make documentation_url optional in a declarative connector spec * simplify if statement * bump patch version of cdk * Revert "bump patch version of cdk" This reverts commit 1854bf3be1ee71500b95053ebd9b595a71b3d693. * 🤖 Bump patch version of Airbyte CDK * Revert "🤖 Bump patch version of Airbyte CDK" This reverts commit 85d5a989e2a8dde04342ee31e8dbc03df5887154. * 🤖 Bump patch version of Airbyte CDK Co-authored-by: lmossman * Avoid parsing a message if this message is too big (#21090) * Tmp * Format * TMP * TMP * Inject max memory * Clean up * Improve error message * PR comments * Unrelated changes * Fix pmd * JDBC Destinations: improve error message for conflicting streams (#21342) * catch conflicting streams as configerror * add test * bump version + changelog * derp, fix test setup * derp * auto-bump connector version Co-authored-by: Octavia Squidington III * Bump Airbyte version from 0.40.27 to 0.40.28 (#21359) Co-authored-by: lmossman * Add records committed to job stats (#21364) * [Low-Code CDK] Construct declarative components from Pydantic models (#21050) * initial work to parse manifest objects into pydantic models * pr feedback and some other validations * rerun manifest schema generation * remove field constraint due to bug * initial work to construct most components from greenhouse * custom components parse subcomponent fields correctly and adding a few more component constructors * construct components from gnews * first pass at posthog.yaml * Handle nested custom components with list values. Also includes updates to posthog.yaml, including autoformatting changes. * adding constructors for slicers, filters, and transformations and a few bug fixes * make sed work across multiple OS * add NoAuth component * fix handling of custom components with nested list * Autogenerate `TYPE_NAME_TO_MODEL` mapping * Handle default kwargs not defined on model for custom components * Re-add `options` for CartesianProductStreamSlicer for backwards compat with custom stream slicers * add basic unit tests for the model component factory * add back defaults and extra parameters like options to retain compatibility with legacy flow and backwards compatibility * Remove `_get_defaults`; using actual default values on classes instead * Add backoff strategy component creation functions * add back defaults and extra parameters like options to retain compatibility with legacy flow and backwards compatibility * add lots of tests to construct components from the pydantic models and a few bug fixes * add a few tests for the model to component factory * add catch * fix a bug where propagated schema doesn't work with old factory * clean up a few files * add type inference for custom components, more tests and some refactoring of the model factory * template, docs, manifest updates, pr feedback and some cleanup * pr feedback and polish schema a bit * fix tests from the latest rebase of master * fix the last few bugs I found and adjust a few sources that weren't perfectly compatible with the new component flow * fix CheckStream bug cleanup and a few small tweaks and polish * add additional test to cover bug case * fix formatting * 🤖 Bump minor version of Airbyte CDK Co-authored-by: Catherine Noll Co-authored-by: brianjlai * update destination-python generator (#21298) * fixed current_value in usage_triggers stream (#21304) * 🪟 🔧 Add stylelint plugin & no-color-variables-in-rgba rule (#21269) * fix e2e tests (#21380) * 🪟🎉 Connector builder: Schema inferrer UI (#21154) * fix stuff * add inferred schema to API * fix yaml changes * fix yaml formatting * add whitespace back * basic ui * advanced UI * Remove unused one * reset package lock * resolve merge conflicts * styling * show button and icon in the normal schema tab * restructure * handle yaml view * small fix * review comments * make monaco resize * review comments * 🎉 New Source: Dremio (#19912) * Remove `supportsNormalization` `supportsDbt` from non GA destination spec (#21319) * SAT: check `future_state` only for incremental streams. (#21248) Signed-off-by: Sergey Chvalyuk * :tada: Typeform - beta certification (#21145) * fixed SAT, fix specs, updated docs * fix incremental * fix incremental * fix incremental * updated connector version in source_definitions.yaml * updated version in source_specs.yaml * Update databend.md (#21179) * Update databend.md * component (#21273) * genericize alert component * add className prop to alert * rename infobox "callout", swap in place for scss module * fix imports * use callout in place of alert * add blue variant, remove icon prop * remove font-size (this is already the default) * remove single use prop, use a classname instead * use semantic names, remove empty line * cleanup from rebase * Update to Micronaut 3.8.1 (#21388) * Source Slack: retry timeout error (#21321) * Source Slack: retry timeout error * Source Slack: update docs * Source Slack: update retry * auto-bump connector version Co-authored-by: Octavia Squidington III * Source Facebook Marketing: Videos stream remove filtering (#21385) * Source Facebook Marketing: Videos stream remove filtering * Source Facebook Marketing: update docs * Source Facebook Marketing: Ref * auto-bump connector version Co-authored-by: Octavia Squidington III * Source Klaviyo: enable SAT high strictness (#21374) * Source Klaviyo: change configuration of acceptance-test-config.yml for high strictness * Add metrics stream to configured_catalog, add metrics expected records * Update future state * Remove expected records for flows stream * Source File: enable high strictness level (#21243) * Source File: enable high strictness level * Addedend line Co-authored-by: Serhii Lazebnyi * introduce code coverage report step (#21376) * introduce code coverage report step * remove airbyte-queue jacoco report since it isn't being generated by the build yet * leave pointer to wildcard support and tweak coverage threshold * added edits (#21346) * 🪟 🐛 Fix jest tests to fail build correctly (#21408) * Fix jest tests to fail build correctly * Add failing test for demo * Update StatusCell.test.tsx * Allow the OSS server only on OSS (#21416) * Update create connection page to full width, and fix trivial UI issues (#21352) * Update big prop in FormPageContent to expand to full width * Fix Normalization & Tranformation heading size * Update FormPageContent to scss and add bottom padding * Remove max-width from ConnectionReplicationPage * Improvements to edge cases of CheckStream (#21404) * Add test for failure case * Except StopIteration - make test pass * Don't attempt to connect to a stream if we get no stream slices * Make helper method for getting first record for a slice * Add comments and exit early if stream to check isn't in list of source streams * move helpers to helper module * Clarify what it means when StopIteration is returned by helper methods * Add AllowedHosts to Actor Definitions and Config Database (#21363) * Add AllowedHosts to actor_definitions and database * use objects for better null-ness handling * Tables.ACTOR_DEFINITIO * Update on-gcp-compute-engine.md (#21429) Use curl instead of wget since we already install curl. * refactor checks * rebase from master * PR Feedback * PR feedback * revert unintended version downgrade * add version updates and changelog * auto-bump connector version * auto-bump connector version * formatting * bump snowflake destination version * manual version bump for s3 * auto-bump connector version * auto-bump connector version Signed-off-by: Sergey Chvalyuk Co-authored-by: Joe Reuter Co-authored-by: Tim Roes Co-authored-by: lmossman Co-authored-by: Anne <102554163+alovew@users.noreply.github.com> Co-authored-by: Greg Solovyev Co-authored-by: Octavia Squidington III Co-authored-by: Davin Chia Co-authored-by: Benoit Moriceau Co-authored-by: Amruta Ranade <11484018+Amruta-Ranade@users.noreply.github.com> Co-authored-by: Serhii Lazebnyi <53845333+lazebnyi@users.noreply.github.com> Co-authored-by: Artem Inzhyyants <36314070+artem1205@users.noreply.github.com> Co-authored-by: Serhii Chvaliuk Co-authored-by: Augustin Co-authored-by: Topher Lubaway Co-authored-by: Krishna (kc) Glick Co-authored-by: Pedro S. Lopez Co-authored-by: Maxime Carbonneau-Leclerc Co-authored-by: Cole Snodgrass Co-authored-by: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> Co-authored-by: Jonathan Pearlin Co-authored-by: Baz Co-authored-by: Octavia Squidington III <90398440+octavia-squidington-iii@users.noreply.github.com> Co-authored-by: lmossman Co-authored-by: Evan Tahler Co-authored-by: Brian Lai <51336873+brianjlai@users.noreply.github.com> Co-authored-by: Michael Siega <109092231+mfsiega-airbyte@users.noreply.github.com> Co-authored-by: hantmac Co-authored-by: josephkmh Co-authored-by: Sajarin Co-authored-by: Zaza Javakhishvili Co-authored-by: Michael Siega Co-authored-by: Denys Davydov Co-authored-by: Jimmy Ma Co-authored-by: Sophia Wiley <106352739+sophia-wiley@users.noreply.github.com> Co-authored-by: Yatsuk Bogdan Co-authored-by: Joey Marshment-Howell Co-authored-by: Satish Chinthanippu Co-authored-by: Nataly Merezhuk <65251165+natalyjazzviolin@users.noreply.github.com> Co-authored-by: Teal Larson Co-authored-by: Sherif A. Nada Co-authored-by: Catherine Noll Co-authored-by: Mark Berger Co-authored-by: Subodh Kant Chaturvedi Co-authored-by: Vladimir Co-authored-by: Volodymyr Pochtar Co-authored-by: perangel Co-authored-by: Conor Co-authored-by: Philip Corr Co-authored-by: Haithem SOUALA Co-authored-by: Sam Stoelinga Co-authored-by: Ivica Taseski Co-authored-by: itaseski Co-authored-by: Rodi Reich Zilberman <867491+rodireich@users.noreply.github.com> Co-authored-by: Philippe Boyd Co-authored-by: Edward Gao Co-authored-by: Catherine Noll Co-authored-by: brianjlai Co-authored-by: darynaishchenko <80129833+darynaishchenko@users.noreply.github.com> Co-authored-by: Arsen Losenko <20901439+arsenlosenko@users.noreply.github.com> Co-authored-by: midavadim Co-authored-by: Roman Yermilov [GL] <86300758+roman-yermilov-gl@users.noreply.github.com> Co-authored-by: Serhii Lazebnyi Co-authored-by: Ella Rohm-Ensing --- .../seed/destination_definitions.yaml | 10 ++-- .../resources/seed/destination_specs.yaml | 10 ++-- .../destination/s3/BlobStorageOperations.java | 4 +- .../destination/s3/S3BaseChecks.java | 2 +- .../destination/s3/S3StorageOperations.java | 26 +++++---- .../util/ConnectorExceptionUtil.java | 3 + .../Dockerfile | 2 +- .../destination-bigquery/Dockerfile | 2 +- .../bigquery/BigQueryGcsOperations.java | 15 ++++- .../bigquery/BigQueryDestinationTest.java | 4 +- .../connectors/destination-gcs/Dockerfile | 2 +- .../destination-redshift/Dockerfile | 2 +- .../RedshiftS3StagingSqlOperations.java | 2 +- .../connectors/destination-s3/Dockerfile | 2 +- .../destination-snowflake/Dockerfile | 2 +- .../SnowflakeS3StagingSqlOperations.java | 2 +- docs/integrations/destinations/bigquery.md | 1 + docs/integrations/destinations/gcs.md | 57 ++++++++++--------- docs/integrations/destinations/redshift.md | 3 +- docs/integrations/destinations/s3.md | 1 + docs/integrations/destinations/snowflake.md | 3 +- 21 files changed, 90 insertions(+), 65 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml index d84582706ba2f..b055912956595 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml @@ -40,7 +40,7 @@ - name: BigQuery destinationDefinitionId: 22f6c74f-5699-40ff-833c-4a879ea40133 dockerRepository: airbyte/destination-bigquery - dockerImageTag: 1.2.11 + dockerImageTag: 1.2.12 documentationUrl: https://docs.airbyte.com/integrations/destinations/bigquery icon: bigquery.svg normalizationConfig: @@ -139,7 +139,7 @@ - name: Google Cloud Storage (GCS) destinationDefinitionId: ca8f6566-e555-4b40-943a-545bf123117a dockerRepository: airbyte/destination-gcs - dockerImageTag: 0.2.12 + dockerImageTag: 0.2.13 documentationUrl: https://docs.airbyte.com/integrations/destinations/gcs icon: googlecloudstorage.svg resourceRequirements: @@ -290,7 +290,7 @@ - name: Redshift destinationDefinitionId: f7a7d195-377f-cf5b-70a5-be6b819019dc dockerRepository: airbyte/destination-redshift - dockerImageTag: 0.3.53 + dockerImageTag: 0.3.54 documentationUrl: https://docs.airbyte.com/integrations/destinations/redshift icon: redshift.svg normalizationConfig: @@ -321,7 +321,7 @@ - name: S3 destinationDefinitionId: 4816b78f-1489-44c1-9060-4b19d5fa9362 dockerRepository: airbyte/destination-s3 - dockerImageTag: 0.3.18 + dockerImageTag: 0.3.19 documentationUrl: https://docs.airbyte.com/integrations/destinations/s3 icon: s3.svg resourceRequirements: @@ -348,7 +348,7 @@ - name: Snowflake destinationDefinitionId: 424892c4-daac-4491-b35d-c6688ba547ba dockerRepository: airbyte/destination-snowflake - dockerImageTag: 0.4.43 + dockerImageTag: 0.4.44 documentationUrl: https://docs.airbyte.com/integrations/destinations/snowflake icon: snowflake.svg normalizationConfig: diff --git a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml index aa768b304061f..7f34e408d5b9d 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml @@ -621,7 +621,7 @@ supported_destination_sync_modes: - "overwrite" - "append" -- dockerImage: "airbyte/destination-bigquery:1.2.11" +- dockerImage: "airbyte/destination-bigquery:1.2.12" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/bigquery" connectionSpecification: @@ -2325,7 +2325,7 @@ supported_destination_sync_modes: - "overwrite" - "append" -- dockerImage: "airbyte/destination-gcs:0.2.12" +- dockerImage: "airbyte/destination-gcs:0.2.13" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/gcs" connectionSpecification: @@ -5123,7 +5123,7 @@ supported_destination_sync_modes: - "overwrite" - "append" -- dockerImage: "airbyte/destination-redshift:0.3.53" +- dockerImage: "airbyte/destination-redshift:0.3.54" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/redshift" connectionSpecification: @@ -5492,7 +5492,7 @@ supported_destination_sync_modes: - "append" - "overwrite" -- dockerImage: "airbyte/destination-s3:0.3.18" +- dockerImage: "airbyte/destination-s3:0.3.19" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/s3" connectionSpecification: @@ -6109,7 +6109,7 @@ supported_destination_sync_modes: - "overwrite" - "append" -- dockerImage: "airbyte/destination-snowflake:0.4.43" +- dockerImage: "airbyte/destination-snowflake:0.4.44" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/snowflake" connectionSpecification: diff --git a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/BlobStorageOperations.java b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/BlobStorageOperations.java index d131470e976e9..96681b4216f83 100644 --- a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/BlobStorageOperations.java +++ b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/BlobStorageOperations.java @@ -22,9 +22,9 @@ protected BlobStorageOperations() { public abstract String getBucketObjectPath(String namespace, String streamName, DateTime writeDatetime, String customFormat); /** - * Create a storage object where to store data in the destination for a @param objectPath + * Ensure that the bucket specified in the config exists */ - public abstract void createBucketObjectIfNotExists(String objectPath) throws Exception; + public abstract void createBucketIfNotExists() throws Exception; /** * Upload the data files into the storage area. diff --git a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/S3BaseChecks.java b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/S3BaseChecks.java index b5f2037e842b7..0873cbb87a01f 100644 --- a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/S3BaseChecks.java +++ b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/S3BaseChecks.java @@ -120,7 +120,7 @@ private static void attemptWriteAndDeleteS3Object(final S3StorageOperations stor final var bucketPath = s3Config.getBucketPath(); if (!Strings.isNullOrEmpty(bucketPath)) { - storageOperations.createBucketObjectIfNotExists(bucketPath); + storageOperations.createBucketIfNotExists(); } s3.putObject(s3Bucket, outputTableName, "check-content"); testIAMUserHasListObjectPermission(s3, s3Bucket); diff --git a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/S3StorageOperations.java b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/S3StorageOperations.java index 5994634351420..ba9f3a19ceabb 100644 --- a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/S3StorageOperations.java +++ b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/S3StorageOperations.java @@ -8,6 +8,7 @@ import alex.mojaki.s3upload.StreamTransferManager; import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.AmazonS3Exception; import com.amazonaws.services.s3.model.DeleteObjectsRequest; import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion; import com.amazonaws.services.s3.model.ListObjectsRequest; @@ -15,12 +16,14 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; +import io.airbyte.commons.exceptions.ConfigErrorException; import io.airbyte.commons.string.Strings; import io.airbyte.integrations.destination.NamingConventionTransformer; import io.airbyte.integrations.destination.record_buffer.SerializableBuffer; import io.airbyte.integrations.destination.s3.template.S3FilenameTemplateManager; import io.airbyte.integrations.destination.s3.template.S3FilenameTemplateParameterObject; import io.airbyte.integrations.destination.s3.util.StreamTransferManagerFactory; +import io.airbyte.integrations.util.ConnectorExceptionUtil; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -95,23 +98,15 @@ public String getBucketObjectPath(final String namespace, final String streamNam /** * Create a directory object at the specified location. Creates the bucket if necessary. - * - * @param objectPath The directory to create. Must be a nonempty string. */ @Override - public void createBucketObjectIfNotExists(final String objectPath) { + public void createBucketIfNotExists() { final String bucket = s3Config.getBucketName(); - final String folderPath = objectPath.endsWith("/") ? objectPath : objectPath + "/"; if (!doesBucketExist(bucket)) { LOGGER.info("Bucket {} does not exist; creating...", bucket); s3Client.createBucket(bucket); LOGGER.info("Bucket {} has been created.", bucket); } - if (!s3Client.doesObjectExist(bucket, folderPath)) { - LOGGER.info("Storage Object {}/{} does not exist in bucket; creating...", bucket, objectPath); - s3Client.putObject(bucket, folderPath, ""); - LOGGER.info("Storage Object {}/{} has been created in bucket.", bucket, objectPath); - } } protected boolean doesBucketExist(final String bucket) { @@ -138,7 +133,18 @@ public String uploadRecordsToBucket(final SerializableBuffer recordsData, exceptionsThrown.add(e); } } - throw new RuntimeException(String.format("Exceptions thrown while uploading records into storage: %s", Strings.join(exceptionsThrown, "\n"))); + // Verifying that ALL exceptions are authentication related before assuming this is a configuration + // issue + // reduces risk of misidentifying errors or reporting a transient error. + final boolean areAllExceptionsAuthExceptions = exceptionsThrown.stream().filter(e -> e instanceof AmazonS3Exception) + .map(s3e -> ((AmazonS3Exception) s3e).getStatusCode()) + .filter(ConnectorExceptionUtil.HTTP_AUTHENTICATION_ERROR_CODES::contains) + .count() == exceptionsThrown.size(); + if (areAllExceptionsAuthExceptions) { + throw new ConfigErrorException(exceptionsThrown.get(0).getMessage(), exceptionsThrown.get(0)); + } else { + throw new RuntimeException(String.format("Exceptions thrown while uploading records into storage: %s", Strings.join(exceptionsThrown, "\n"))); + } } /** diff --git a/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/util/ConnectorExceptionUtil.java b/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/util/ConnectorExceptionUtil.java index 2db68dff49e68..ea336d8fce652 100644 --- a/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/util/ConnectorExceptionUtil.java +++ b/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/util/ConnectorExceptionUtil.java @@ -4,6 +4,7 @@ package io.airbyte.integrations.util; +import com.google.common.collect.ImmutableList; import io.airbyte.commons.exceptions.ConfigErrorException; import io.airbyte.commons.exceptions.ConnectionErrorException; import io.airbyte.integrations.base.errors.messages.ErrorMessage; @@ -22,6 +23,8 @@ public class ConnectorExceptionUtil { static final String RECOVERY_CONNECTION_ERROR_MESSAGE = "We're having issues syncing from a Postgres replica that is configured as a hot standby server. " + "Please see https://docs.airbyte.com/integrations/sources/postgres/#sync-data-from-postgres-hot-standby-server for options and workarounds"; + + public static final List HTTP_AUTHENTICATION_ERROR_CODES = ImmutableList.of(401, 403); private static final List> configErrorPredicates = List.of(getConfigErrorPredicate(), getConnectionErrorPredicate(), isRecoveryConnectionExceptionPredicate(), isUnknownColumnInFieldListException()); diff --git a/airbyte-integrations/connectors/destination-bigquery-denormalized/Dockerfile b/airbyte-integrations/connectors/destination-bigquery-denormalized/Dockerfile index 1cfd9ee045d5d..e6cd0710659c2 100644 --- a/airbyte-integrations/connectors/destination-bigquery-denormalized/Dockerfile +++ b/airbyte-integrations/connectors/destination-bigquery-denormalized/Dockerfile @@ -17,5 +17,5 @@ ENV ENABLE_SENTRY true COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.2.11 +LABEL io.airbyte.version=1.2.12 LABEL io.airbyte.name=airbyte/destination-bigquery-denormalized diff --git a/airbyte-integrations/connectors/destination-bigquery/Dockerfile b/airbyte-integrations/connectors/destination-bigquery/Dockerfile index f79d950d1d7f0..5e0eba63c40d7 100644 --- a/airbyte-integrations/connectors/destination-bigquery/Dockerfile +++ b/airbyte-integrations/connectors/destination-bigquery/Dockerfile @@ -17,5 +17,5 @@ ENV ENABLE_SENTRY true COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.2.11 +LABEL io.airbyte.version=1.2.12 LABEL io.airbyte.name=airbyte/destination-bigquery diff --git a/airbyte-integrations/connectors/destination-bigquery/src/main/java/io/airbyte/integrations/destination/bigquery/BigQueryGcsOperations.java b/airbyte-integrations/connectors/destination-bigquery/src/main/java/io/airbyte/integrations/destination/bigquery/BigQueryGcsOperations.java index 51a269725befb..e955d005b871e 100644 --- a/airbyte-integrations/connectors/destination-bigquery/src/main/java/io/airbyte/integrations/destination/bigquery/BigQueryGcsOperations.java +++ b/airbyte-integrations/connectors/destination-bigquery/src/main/java/io/airbyte/integrations/destination/bigquery/BigQueryGcsOperations.java @@ -13,11 +13,14 @@ import com.google.cloud.bigquery.LoadJobConfiguration; import com.google.cloud.bigquery.Schema; import com.google.cloud.bigquery.TableId; +import com.google.common.collect.ImmutableList; +import io.airbyte.commons.exceptions.ConfigErrorException; import io.airbyte.integrations.destination.StandardNameTransformer; import io.airbyte.integrations.destination.bigquery.uploader.AbstractBigQueryUploader; import io.airbyte.integrations.destination.gcs.GcsDestinationConfig; import io.airbyte.integrations.destination.gcs.GcsStorageOperations; import io.airbyte.integrations.destination.record_buffer.SerializableBuffer; +import io.airbyte.integrations.util.ConnectorExceptionUtil; import io.airbyte.protocol.models.v0.DestinationSyncMode; import java.util.HashSet; import java.util.List; @@ -84,7 +87,15 @@ public String getStagingFullPath(final String datasetId, final String stream) { public void createSchemaIfNotExists(final String datasetId, final String datasetLocation) { if (!existingSchemas.contains(datasetId)) { LOGGER.info("Creating dataset {}", datasetId); - BigQueryUtils.getOrCreateDataset(bigQuery, datasetId, datasetLocation); + try { + BigQueryUtils.getOrCreateDataset(bigQuery, datasetId, datasetLocation); + } catch (BigQueryException e) { + if (ConnectorExceptionUtil.HTTP_AUTHENTICATION_ERROR_CODES.contains(e.getCode())) { + throw new ConfigErrorException(e.getMessage(), e); + } else { + throw e; + } + } existingSchemas.add(datasetId); } } @@ -99,7 +110,7 @@ public void createTmpTableIfNotExists(final TableId tmpTableId, final Schema tab public void createStageIfNotExists(final String datasetId, final String stream) { final String objectPath = getStagingFullPath(datasetId, stream); LOGGER.info("Creating staging path for stream {} (dataset {}): {}", stream, datasetId, objectPath); - gcsStorageOperations.createBucketObjectIfNotExists(objectPath); + gcsStorageOperations.createBucketIfNotExists(); } @Override diff --git a/airbyte-integrations/connectors/destination-bigquery/src/test-integration/java/io/airbyte/integrations/destination/bigquery/BigQueryDestinationTest.java b/airbyte-integrations/connectors/destination-bigquery/src/test-integration/java/io/airbyte/integrations/destination/bigquery/BigQueryDestinationTest.java index 065ff49844cec..3f2c05210cf02 100644 --- a/airbyte-integrations/connectors/destination-bigquery/src/test-integration/java/io/airbyte/integrations/destination/bigquery/BigQueryDestinationTest.java +++ b/airbyte-integrations/connectors/destination-bigquery/src/test-integration/java/io/airbyte/integrations/destination/bigquery/BigQueryDestinationTest.java @@ -84,8 +84,10 @@ class BigQueryDestinationTest { protected static final Path CREDENTIALS_WITH_GCS_STAGING_PATH = Path.of("secrets/credentials-gcs-staging.json"); - protected static final Path[] ALL_PATHS = {CREDENTIALS_WITH_GCS_STAGING_PATH, CREDENTIALS_BAD_PROJECT_PATH, CREDENTIALS_NO_DATASET_CREATION_PATH, + + protected static final Path[] ALL_PATHS = {CREDENTIALS_STANDARD_INSERT_PATH, CREDENTIALS_BAD_PROJECT_PATH, CREDENTIALS_NO_DATASET_CREATION_PATH, CREDENTIALS_NO_EDIT_PUBLIC_SCHEMA_ROLE_PATH, CREDENTIALS_NON_BILLABLE_PROJECT_PATH, CREDENTIALS_WITH_GCS_STAGING_PATH}; + private static final Logger LOGGER = LoggerFactory.getLogger(BigQueryDestinationTest.class); private static final String DATASET_NAME_PREFIX = "bq_dest_integration_test"; diff --git a/airbyte-integrations/connectors/destination-gcs/Dockerfile b/airbyte-integrations/connectors/destination-gcs/Dockerfile index c5534e0a9128c..f4d34c04bceb0 100644 --- a/airbyte-integrations/connectors/destination-gcs/Dockerfile +++ b/airbyte-integrations/connectors/destination-gcs/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION destination-gcs COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=0.2.12 +LABEL io.airbyte.version=0.2.13 LABEL io.airbyte.name=airbyte/destination-gcs diff --git a/airbyte-integrations/connectors/destination-redshift/Dockerfile b/airbyte-integrations/connectors/destination-redshift/Dockerfile index 5f06bd32cc8e4..882852e888115 100644 --- a/airbyte-integrations/connectors/destination-redshift/Dockerfile +++ b/airbyte-integrations/connectors/destination-redshift/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION destination-redshift COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=0.3.53 +LABEL io.airbyte.version=0.3.54 LABEL io.airbyte.name=airbyte/destination-redshift diff --git a/airbyte-integrations/connectors/destination-redshift/src/main/java/io/airbyte/integrations/destination/redshift/operations/RedshiftS3StagingSqlOperations.java b/airbyte-integrations/connectors/destination-redshift/src/main/java/io/airbyte/integrations/destination/redshift/operations/RedshiftS3StagingSqlOperations.java index 63abde3f69663..657a582d6eebc 100644 --- a/airbyte-integrations/connectors/destination-redshift/src/main/java/io/airbyte/integrations/destination/redshift/operations/RedshiftS3StagingSqlOperations.java +++ b/airbyte-integrations/connectors/destination-redshift/src/main/java/io/airbyte/integrations/destination/redshift/operations/RedshiftS3StagingSqlOperations.java @@ -77,7 +77,7 @@ public String getStagingPath(UUID connectionId, String namespace, String streamN public void createStageIfNotExists(JdbcDatabase database, String stageName) throws Exception { final String bucketPath = s3Config.getBucketPath(); final String prefix = bucketPath.isEmpty() ? "" : bucketPath + (bucketPath.endsWith("/") ? "" : "/"); - s3StorageOperations.createBucketObjectIfNotExists(prefix + stageName); + s3StorageOperations.createBucketIfNotExists(); } @Override diff --git a/airbyte-integrations/connectors/destination-s3/Dockerfile b/airbyte-integrations/connectors/destination-s3/Dockerfile index e11e5ea30b84f..73f794c6b7211 100644 --- a/airbyte-integrations/connectors/destination-s3/Dockerfile +++ b/airbyte-integrations/connectors/destination-s3/Dockerfile @@ -40,5 +40,5 @@ RUN /bin/bash -c 'set -e && \ echo "unknown arch" ;\ fi' -LABEL io.airbyte.version=0.3.18 +LABEL io.airbyte.version=0.3.19 LABEL io.airbyte.name=airbyte/destination-s3 diff --git a/airbyte-integrations/connectors/destination-snowflake/Dockerfile b/airbyte-integrations/connectors/destination-snowflake/Dockerfile index 4b8f627b28ea2..da6515de1feb3 100644 --- a/airbyte-integrations/connectors/destination-snowflake/Dockerfile +++ b/airbyte-integrations/connectors/destination-snowflake/Dockerfile @@ -20,5 +20,5 @@ RUN tar xf ${APPLICATION}.tar --strip-components=1 ENV ENABLE_SENTRY true -LABEL io.airbyte.version=0.4.43 +LABEL io.airbyte.version=0.4.44 LABEL io.airbyte.name=airbyte/destination-snowflake diff --git a/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3StagingSqlOperations.java b/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3StagingSqlOperations.java index 9cdc3058be4e9..e9c40de09116d 100644 --- a/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3StagingSqlOperations.java +++ b/airbyte-integrations/connectors/destination-snowflake/src/main/java/io/airbyte/integrations/destination/snowflake/SnowflakeS3StagingSqlOperations.java @@ -82,7 +82,7 @@ public String uploadRecordsToStage(final JdbcDatabase database, @Override public void createStageIfNotExists(final JdbcDatabase database, final String stageName) { - s3StorageOperations.createBucketObjectIfNotExists(stageName); + s3StorageOperations.createBucketIfNotExists(); } @Override diff --git a/docs/integrations/destinations/bigquery.md b/docs/integrations/destinations/bigquery.md index e418918e1f78d..6b6759b152f5b 100644 --- a/docs/integrations/destinations/bigquery.md +++ b/docs/integrations/destinations/bigquery.md @@ -136,6 +136,7 @@ Now that you have set up the BigQuery destination connector, check out the follo | Version | Date | Pull Request | Subject | |:--------|:-----------|:----------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------| +| 1.2.12 | 2023-01-18 | [#21087](https://github.com/airbytehq/airbyte/pull/21087) | Wrap Authentication Errors as Config Exceptions | | 1.2.11 | 2023-01-18 | [#21144](https://github.com/airbytehq/airbyte/pull/21144) | Added explicit error message if sync fails due to a config issue | | 1.2.9 | 2022-12-14 | [#20501](https://github.com/airbytehq/airbyte/pull/20501) | Report GCS staging failures that occur during connection check | | 1.2.8 | 2022-11-22 | [#19489](https://github.com/airbytehq/airbyte/pull/19489) | Added non-billable projects handle to check connection stage | diff --git a/docs/integrations/destinations/gcs.md b/docs/integrations/destinations/gcs.md index aa07d098ed178..e988530da08ce 100644 --- a/docs/integrations/destinations/gcs.md +++ b/docs/integrations/destinations/gcs.md @@ -235,31 +235,32 @@ Under the hood, an Airbyte data stream in Json schema is first converted to an A ## CHANGELOG -| Version | Date | Pull Request | Subject | -|:--------| :--- | :--- | :--- | -| 0.2.12 | 2022-10-18 | [\#17901](https://github.com/airbytehq/airbyte/pull/17901) | Fix logging to GCS | -| 0.2.11 | 2022-09-01 | [\#16243](https://github.com/airbytehq/airbyte/pull/16243) | Fix Json to Avro conversion when there is field name clash from combined restrictions (`anyOf`, `oneOf`, `allOf` fields) | -| 0.2.10 | 2022-08-05 | [\#14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | -| 0.2.9 | 2022-06-24 | [\#14114](https://github.com/airbytehq/airbyte/pull/14114) | Remove "additionalProperties": false from specs for connectors with staging | -| 0.2.8 | 2022-06-17 | [\#13753](https://github.com/airbytehq/airbyte/pull/13753) | Deprecate and remove PART_SIZE_MB fields from connectors based on StreamTransferManager | -| 0.2.7 | 2022-06-14 | [\#13483](https://github.com/airbytehq/airbyte/pull/13483) | Added support for int, long, float data types to Avro/Parquet formats. | -| 0.2.6 | 2022-05-17 | [12820](https://github.com/airbytehq/airbyte/pull/12820) | Improved 'check' operation performance | -| 0.2.5 | 2022-05-04 | [\#12578](https://github.com/airbytehq/airbyte/pull/12578) | In JSON to Avro conversion, log JSON field values that do not follow Avro schema for debugging. | -| 0.2.4 | 2022-04-22 | [\#12167](https://github.com/airbytehq/airbyte/pull/12167) | Add gzip compression option for CSV and JSONL formats. | -| 0.2.3 | 2022-04-22 | [\#11795](https://github.com/airbytehq/airbyte/pull/11795) | Fix the connection check to verify the provided bucket path. | -| 0.2.2 | 2022-04-05 | [\#11728](https://github.com/airbytehq/airbyte/pull/11728) | Properly clean-up bucket when running OVERWRITE sync mode | -| 0.2.1 | 2022-04-05 | [\#11499](https://github.com/airbytehq/airbyte/pull/11499) | Updated spec and documentation. | -| 0.2.0 | 2022-04-04 | [\#11686](https://github.com/airbytehq/airbyte/pull/11686) | Use serialized buffering strategy to reduce memory consumption; compress CSV and JSONL formats. | -| 0.1.22 | 2022-02-12 | [\#10256](https://github.com/airbytehq/airbyte/pull/10256) | Add JVM flag to exist on OOME. | -| 0.1.21 | 2022-02-12 | [\#10299](https://github.com/airbytehq/airbyte/pull/10299) | Fix connection check to require only the necessary permissions. | -| 0.1.20 | 2022-01-11 | [\#9367](https://github.com/airbytehq/airbyte/pull/9367) | Avro & Parquet: support array field with unknown item type; default any improperly typed field to string. | -| 0.1.19 | 2022-01-10 | [\#9121](https://github.com/airbytehq/airbyte/pull/9121) | Fixed check method for GCS mode to verify if all roles assigned to user | -| 0.1.18 | 2021-12-30 | [\#8809](https://github.com/airbytehq/airbyte/pull/8809) | Update connector fields title/description | -| 0.1.17 | 2021-12-21 | [\#8574](https://github.com/airbytehq/airbyte/pull/8574) | Added namespace to Avro and Parquet record types | -| 0.1.16 | 2021-12-20 | [\#8974](https://github.com/airbytehq/airbyte/pull/8974) | Release a new version to ensure there is no excessive logging. | -| 0.1.15 | 2021-12-03 | [\#8386](https://github.com/airbytehq/airbyte/pull/8386) | Add new GCP regions | -| 0.1.14 | 2021-12-01 | [\#7732](https://github.com/airbytehq/airbyte/pull/7732) | Support timestamp in Avro and Parquet | -| 0.1.13 | 2021-11-03 | [\#7288](https://github.com/airbytehq/airbyte/issues/7288) | Support Json `additionalProperties`. | -| 0.1.2 | 2021-09-12 | [\#5720](https://github.com/airbytehq/airbyte/issues/5720) | Added configurable block size for stream. Each stream is limited to 10,000 by GCS | -| 0.1.1 | 2021-08-26 | [\#5296](https://github.com/airbytehq/airbyte/issues/5296) | Added storing gcsCsvFileLocation property for CSV format. This is used by destination-bigquery \(GCS Staging upload type\) | -| 0.1.0 | 2021-07-16 | [\#4329](https://github.com/airbytehq/airbyte/pull/4784) | Initial release. | +| Version | Date | Pull Request | Subject | +|:--------| :--- |:------------------------------------------------------------| :--- | +| 0.2.13 | 2023-01-18 | [#21087](https://github.com/airbytehq/airbyte/pull/21087) | Wrap Authentication Errors as Config Exceptions | +| 0.2.12 | 2022-10-18 | [\#17901](https://github.com/airbytehq/airbyte/pull/17901) | Fix logging to GCS | +| 0.2.11 | 2022-09-01 | [\#16243](https://github.com/airbytehq/airbyte/pull/16243) | Fix Json to Avro conversion when there is field name clash from combined restrictions (`anyOf`, `oneOf`, `allOf` fields) | +| 0.2.10 | 2022-08-05 | [\#14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | +| 0.2.9 | 2022-06-24 | [\#14114](https://github.com/airbytehq/airbyte/pull/14114) | Remove "additionalProperties": false from specs for connectors with staging | +| 0.2.8 | 2022-06-17 | [\#13753](https://github.com/airbytehq/airbyte/pull/13753) | Deprecate and remove PART_SIZE_MB fields from connectors based on StreamTransferManager | +| 0.2.7 | 2022-06-14 | [\#13483](https://github.com/airbytehq/airbyte/pull/13483) | Added support for int, long, float data types to Avro/Parquet formats. | +| 0.2.6 | 2022-05-17 | [12820](https://github.com/airbytehq/airbyte/pull/12820) | Improved 'check' operation performance | +| 0.2.5 | 2022-05-04 | [\#12578](https://github.com/airbytehq/airbyte/pull/12578) | In JSON to Avro conversion, log JSON field values that do not follow Avro schema for debugging. | +| 0.2.4 | 2022-04-22 | [\#12167](https://github.com/airbytehq/airbyte/pull/12167) | Add gzip compression option for CSV and JSONL formats. | +| 0.2.3 | 2022-04-22 | [\#11795](https://github.com/airbytehq/airbyte/pull/11795) | Fix the connection check to verify the provided bucket path. | +| 0.2.2 | 2022-04-05 | [\#11728](https://github.com/airbytehq/airbyte/pull/11728) | Properly clean-up bucket when running OVERWRITE sync mode | +| 0.2.1 | 2022-04-05 | [\#11499](https://github.com/airbytehq/airbyte/pull/11499) | Updated spec and documentation. | +| 0.2.0 | 2022-04-04 | [\#11686](https://github.com/airbytehq/airbyte/pull/11686) | Use serialized buffering strategy to reduce memory consumption; compress CSV and JSONL formats. | +| 0.1.22 | 2022-02-12 | [\#10256](https://github.com/airbytehq/airbyte/pull/10256) | Add JVM flag to exist on OOME. | +| 0.1.21 | 2022-02-12 | [\#10299](https://github.com/airbytehq/airbyte/pull/10299) | Fix connection check to require only the necessary permissions. | +| 0.1.20 | 2022-01-11 | [\#9367](https://github.com/airbytehq/airbyte/pull/9367) | Avro & Parquet: support array field with unknown item type; default any improperly typed field to string. | +| 0.1.19 | 2022-01-10 | [\#9121](https://github.com/airbytehq/airbyte/pull/9121) | Fixed check method for GCS mode to verify if all roles assigned to user | +| 0.1.18 | 2021-12-30 | [\#8809](https://github.com/airbytehq/airbyte/pull/8809) | Update connector fields title/description | +| 0.1.17 | 2021-12-21 | [\#8574](https://github.com/airbytehq/airbyte/pull/8574) | Added namespace to Avro and Parquet record types | +| 0.1.16 | 2021-12-20 | [\#8974](https://github.com/airbytehq/airbyte/pull/8974) | Release a new version to ensure there is no excessive logging. | +| 0.1.15 | 2021-12-03 | [\#8386](https://github.com/airbytehq/airbyte/pull/8386) | Add new GCP regions | +| 0.1.14 | 2021-12-01 | [\#7732](https://github.com/airbytehq/airbyte/pull/7732) | Support timestamp in Avro and Parquet | +| 0.1.13 | 2021-11-03 | [\#7288](https://github.com/airbytehq/airbyte/issues/7288) | Support Json `additionalProperties`. | +| 0.1.2 | 2021-09-12 | [\#5720](https://github.com/airbytehq/airbyte/issues/5720) | Added configurable block size for stream. Each stream is limited to 10,000 by GCS | +| 0.1.1 | 2021-08-26 | [\#5296](https://github.com/airbytehq/airbyte/issues/5296) | Added storing gcsCsvFileLocation property for CSV format. This is used by destination-bigquery \(GCS Staging upload type\) | +| 0.1.0 | 2021-07-16 | [\#4329](https://github.com/airbytehq/airbyte/pull/4784) | Initial release. | diff --git a/docs/integrations/destinations/redshift.md b/docs/integrations/destinations/redshift.md index a2a7168dcd03f..0f2b0ac8e50fd 100644 --- a/docs/integrations/destinations/redshift.md +++ b/docs/integrations/destinations/redshift.md @@ -141,6 +141,7 @@ Each stream will be output into its own raw table in Redshift. Each table will c | Version | Date | Pull Request | Subject | |:--------|:-----------|:-----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 0.3.54 | 2023-01-18 | [#21087](https://github.com/airbytehq/airbyte/pull/21087) | Wrap Authentication Errors as Config Exceptions | | 0.3.53 | 2023-01-03 | [\#17273](https://github.com/airbytehq/airbyte/pull/17273) | Flatten JSON arrays to fix maximum size check for SUPER field | | 0.3.52 | 2022-12-30 | [\#20879](https://github.com/airbytehq/airbyte/pull/20879) | Added configurable parameter for number of file buffers | | 0.3.51 | 2022-10-26 | [\#18434](https://github.com/airbytehq/airbyte/pull/18434) | Fix empty S3 bucket path handling | @@ -178,5 +179,3 @@ Each stream will be output into its own raw table in Redshift. Each table will c | 0.3.13 | 2021-09-02 | [5745](https://github.com/airbytehq/airbyte/pull/5745) | Disable STATUPDATE flag when using S3 staging to speed up performance | | 0.3.12 | 2021-07-21 | [3555](https://github.com/airbytehq/airbyte/pull/3555) | Enable partial checkpointing for halfway syncs | | 0.3.11 | 2021-07-20 | [4874](https://github.com/airbytehq/airbyte/pull/4874) | allow `additionalProperties` in connector spec | - - diff --git a/docs/integrations/destinations/s3.md b/docs/integrations/destinations/s3.md index c642624c6ea32..db26ac102e0d0 100644 --- a/docs/integrations/destinations/s3.md +++ b/docs/integrations/destinations/s3.md @@ -330,6 +330,7 @@ In order for everything to work correctly, it is also necessary that the user wh | Version | Date | Pull Request | Subject | |:--------|:-----------|:-----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------| +| 0.3.19 | 2023-01-18 | [#21087](https://github.com/airbytehq/airbyte/pull/21087) | Wrap Authentication Errors as Config Exceptions | | 0.3.18 | 2022-12-15 | [\#20088](https://github.com/airbytehq/airbyte/pull/20088) | New data type support v0/v1 | | 0.3.17 | 2022-10-15 | [\#18031](https://github.com/airbytehq/airbyte/pull/18031) | Fix integration tests to use bucket path | | 0.3.16 | 2022-10-03 | [\#17340](https://github.com/airbytehq/airbyte/pull/17340) | Enforced encrypted only traffic to S3 buckets and check logic | diff --git a/docs/integrations/destinations/snowflake.md b/docs/integrations/destinations/snowflake.md index b9c6ba290ce20..1bbadee5053ad 100644 --- a/docs/integrations/destinations/snowflake.md +++ b/docs/integrations/destinations/snowflake.md @@ -277,7 +277,8 @@ Now that you have set up the Snowflake destination connector, check out the foll | Version | Date | Pull Request | Subject | |:--------|:-----------|:-----------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------| -| 0.4.43 | 2023-01-20 | [\#21450](https://github.com/airbytehq/airbyte/pull/21450) | Updated Check methods to handle more possible s3 and gcs stagings issues | +| 0.4.44 | 2023-01-20 | [#21087](https://github.com/airbytehq/airbyte/pull/21087) | Wrap Authentication Errors as Config Exceptions | +| 0.4.43 | 2023-01-20 | [\#21450](https://github.com/airbytehq/airbyte/pull/21450) | Updated Check methods to handle more possible s3 and gcs stagings issues | | 0.4.42 | 2023-01-12 | [\#21342](https://github.com/airbytehq/airbyte/pull/21342) | Better handling for conflicting destination streams | | 0.4.41 | 2022-12-16 | [\#20566](https://github.com/airbytehq/airbyte/pull/20566) | Improve spec to adhere to standards | | 0.4.40 | 2022-11-11 | [\#19302](https://github.com/airbytehq/airbyte/pull/19302) | Set jdbc application env variable depends on env - airbyte_oss or airbyte_cloud | From d77514dcfedbc4205f7f6161f29200a32d5d06d1 Mon Sep 17 00:00:00 2001 From: Augustin Date: Mon, 23 Jan 2023 18:25:53 +0100 Subject: [PATCH 029/195] CI connector ops: introduce QA checks in /test (#21699) --- .github/workflows/test-command.yml | 9 -- tools/bin/ci_integration_test.sh | 1 + .../ci_connector_ops/qa_checks.py | 91 +++++++++++++++++++ tools/ci_connector_ops/setup.py | 5 +- 4 files changed, 95 insertions(+), 11 deletions(-) create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_checks.py diff --git a/.github/workflows/test-command.yml b/.github/workflows/test-command.yml index 069d1cd46624e..8a6f36d5d7752 100644 --- a/.github/workflows/test-command.yml +++ b/.github/workflows/test-command.yml @@ -95,19 +95,12 @@ jobs: uses: actions/setup-python@v4 with: python-version: "3.9" - - name: Install Pyenv - run: | - python3 -m pip install --quiet virtualenv==16.7.9 --user - python3 -m virtualenv venv - source venv/bin/activate - name: Install CI scripts # all CI python packages have the prefix "ci_" run: | - source venv/bin/activate pip install --quiet -e ./tools/ci_* - name: Write Integration Test Credentials for ${{ github.event.inputs.connector }} run: | - source venv/bin/activate ci_credentials ${{ github.event.inputs.connector }} write-to-storage # normalization also runs destination-specific tests, so fetch their creds also if [ 'bases/base-normalization' = "${{ github.event.inputs.connector }}" ] || [ 'base-normalization' = "${{ github.event.inputs.connector }}" ]; then @@ -117,7 +110,6 @@ jobs: fi env: GCP_GSM_CREDENTIALS: ${{ secrets.GCP_GSM_CREDENTIALS }} - - name: Test ${{ github.event.inputs.connector }} id: test env: @@ -132,7 +124,6 @@ jobs: - name: Update Integration Test Credentials after test run for ${{ github.event.inputs.connector }} if: always() run: | - source venv/bin/activate ci_credentials ${{ github.event.inputs.connector }} update-secrets # normalization also runs destination-specific tests, so fetch their creds also if [ 'bases/base-normalization' = "${{ github.event.inputs.connector }}" ] || [ 'base-normalization' = "${{ github.event.inputs.connector }}" ]; then diff --git a/tools/bin/ci_integration_test.sh b/tools/bin/ci_integration_test.sh index 8fb208fdf83a3..3fbd1a65970d0 100755 --- a/tools/bin/ci_integration_test.sh +++ b/tools/bin/ci_integration_test.sh @@ -32,6 +32,7 @@ else export SUB_BUILD="CONNECTORS_BASE" elif [[ "$connector" == *"connectors"* ]]; then connector_name=$(echo $connector | cut -d / -f 2) + run-qa-checks $connector_name selected_integration_test=$(echo "$all_integration_tests" | grep "^$connector_name$" || echo "") integrationTestCommand="$(_to_gradle_path "airbyte-integrations/$connector" integrationTest)" else diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_checks.py b/tools/ci_connector_ops/ci_connector_ops/qa_checks.py new file mode 100644 index 0000000000000..dc384641c4546 --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_checks.py @@ -0,0 +1,91 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + +import sys + +def check_documentation_markdown_file(connector_name: str) -> bool: + """Check if a markdown file with connector documentation is available + in docs/integrations//.md + + Args: + connector_name (str): The connector name + + Returns: + bool: Wether a documentation file was found. + """ + # TODO implement + return True + +def check_changelog_entry_is_updated(connector_name: str) -> bool: + """Check that the changelog entry is updated for the latest connector version + in docs/integrations//.md + + Args: + connector_name (str): The connector name + + Returns: + bool: Wether a the changelog is up to date. + """ + # TODO implement + return True + +def check_connector_icon_is_available(connector_name: str) -> bool: + """Check an SVG icon exists for a connector in + in airbyte-config/init/src/main/resources/icons/.svg + + Args: + connector_name (str): The connector name + + Returns: + bool: Wether an icon exists for this connector. + """ + # TODO implement + return True + +def check_connector_https_url_only(connector_name: str) -> bool: + """Check a connector code contains only https url. + + Args: + connector_name (str): The connector name + + Returns: + bool: Wether the connector code contains only https url. + """ + # TODO implement + return True + +def check_connector_has_no_critical_vulnerabilities(connector_name: str) -> bool: + """Check if the connector image is free of critical Snyk vulnerabilities. + Runs a docker scan command. + + Args: + connector_name (str): The connector name + + Returns: + bool: Wether the connector is free of critical vulnerabilities. + """ + # TODO implement + return True + +QA_CHECKS = [ + check_documentation_markdown_file, + check_changelog_entry_is_updated, + check_connector_icon_is_available, + check_connector_https_url_only, + check_connector_has_no_critical_vulnerabilities +] + +def run_qa_checks(): + connector_name = sys.argv[1] + print(f"Running QA checks for {connector_name}") + qa_check_results = {qa_check.__name__: qa_check(connector_name) for qa_check in QA_CHECKS} + if not all(qa_check_results.values()): + print(f"QA checks failed for {connector_name}") + for check_name, check_result in qa_check_results.items(): + check_result_prefix = "✅" if check_result else "❌" + print(f"{check_result_prefix} - {check_name}") + sys.exit(1) + else: + print(f"All QA checks succeeded for {connector_name}") + sys.exit(0) diff --git a/tools/ci_connector_ops/setup.py b/tools/ci_connector_ops/setup.py index 09928f800c24b..c573c8d7148bb 100644 --- a/tools/ci_connector_ops/setup.py +++ b/tools/ci_connector_ops/setup.py @@ -9,7 +9,7 @@ setup( - version="0.1.1", + version="0.1.2", name="ci_connector_ops", description="Packaged maintained by the connector operations team to perform CI for connectors", author="Airbyte", @@ -21,7 +21,8 @@ "console_scripts": [ "check-test-strictness-level = ci_connector_ops.sat_config_checks:check_test_strictness_level", "write-review-requirements-file = ci_connector_ops.sat_config_checks:write_review_requirements_file", - "print-mandatory-reviewers = ci_connector_ops.sat_config_checks:print_mandatory_reviewers" + "print-mandatory-reviewers = ci_connector_ops.sat_config_checks:print_mandatory_reviewers", + "run-qa-checks = ci_connector_ops.qa_checks:run_qa_checks" ], }, ) From b786a180f02c6d48d82f19f51c8c8e730a14b983 Mon Sep 17 00:00:00 2001 From: Jonathan Pearlin Date: Mon, 23 Jan 2023 12:42:43 -0500 Subject: [PATCH 030/195] Add required roles to API endpoints (#21664) * Restore auth poc * Formatting * Custom Netty pipeline handler to aid authorization * Fix handler name * Cleanup * Remove cloud code * Disable API authorization in OSS * Remove unused dependency * Add newline * Add required roles --- .../io/airbyte/commons/auth/AuthRole.java | 92 +++++++++++++++++++ .../commons/auth/AuthRoleConstants.java | 21 +++++ .../io/airbyte/commons/auth/AuthRoleTest.java | 47 ++++++++++ .../server/apis/AttemptApiController.java | 6 ++ .../server/apis/ConnectionApiController.java | 14 +++ .../server/apis/DestinationApiController.java | 20 +++- .../DestinationDefinitionApiController.java | 19 ++++ ...nDefinitionSpecificationApiController.java | 6 ++ .../apis/DestinationOauthApiController.java | 9 ++ .../server/apis/HealthApiController.java | 3 + .../server/apis/JobsApiController.java | 14 +++ .../server/apis/LogsApiController.java | 6 ++ .../server/apis/NotFoundController.java | 3 + .../apis/NotificationsApiController.java | 6 ++ .../server/apis/OpenapiApiController.java | 6 ++ .../server/apis/OperationApiController.java | 13 +++ .../server/apis/SchedulerApiController.java | 9 ++ .../server/apis/SourceApiController.java | 15 +++ .../apis/SourceDefinitionApiController.java | 19 ++++ ...eDefinitionSpecificationApiController.java | 6 ++ .../server/apis/SourceOauthApiController.java | 9 ++ .../server/apis/StateApiController.java | 8 ++ .../server/apis/WebBackendApiController.java | 15 +++ .../server/apis/WorkspaceApiController.java | 16 ++++ .../src/main/resources/application.yml | 48 +++++++--- deps.toml | 2 + 26 files changed, 417 insertions(+), 15 deletions(-) create mode 100644 airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRole.java create mode 100644 airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRoleConstants.java create mode 100644 airbyte-commons/src/test/java/io/airbyte/commons/auth/AuthRoleTest.java diff --git a/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRole.java b/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRole.java new file mode 100644 index 0000000000000..b2ff02702545f --- /dev/null +++ b/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRole.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.commons.auth; + +import java.util.Comparator; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * This enum describes the standard auth levels for a given resource. It currently is only used for + * 2 resources Workspace and Instance (i.e. the entire instance or deployment of Airbyte). + * + * In the context of a workspace, there is a 1:1 mapping. + *
      + *
    • OWNER => WORKSPACE OWNER. Superadmin of the instance (typically the person that created it), + * has all the rights on the instance including deleting it.
    • + *
    • ADMIN => WORKSPACE ADMIN. Admin of the instance, can invite other users, update their + * permission and change settings of the instance.
    • + *
    • EDITOR => WORKSPACE EDITOR
    • + *
    • READER => WORKSPACE READER
    • + *
    • AUTHENTICATED_USER => INVALID
    • + *
    • NONE => NONE (does not have access to this resource)
    • + *
    + * In the context of the instance, there are currently only 3 levels. + *
      + *
    • ADMIN => INSTANCE ADMIN
    • + *
    • AUTHENTICATED_USER => Denotes that all that is required for access is an active Airbyte + * account. This should only ever be used when the associated resource is an INSTANCE. All other + * uses are invalid. It is a special value in the enum to handle a case that only applies to + * instances and no other resources.
    • + *
    • NONE => NONE (not applicable. anyone being checked in our auth stack already has an account + * so by definition they have some access to the instance.)
    • + *
    + */ +public enum AuthRole { + + OWNER(500, AuthRoleConstants.OWNER), + ADMIN(400, AuthRoleConstants.ADMIN), + EDITOR(300, AuthRoleConstants.EDITOR), + READER(200, AuthRoleConstants.READER), + AUTHENTICATED_USER(100, AuthRoleConstants.AUTHENTICATED_USER), // ONLY USE WITH INSTANCE RESOURCE! + NONE(0, AuthRoleConstants.NONE); + + private final int authority; + private final String label; + + AuthRole(final int authority, final String label) { + this.authority = authority; + this.label = label; + } + + public int getAuthority() { + return authority; + } + + public String getLabel() { + return label; + } + + /** + * Builds the set of roles based on the provided {@link AuthRole} value. + *

    + * The generated set of auth roles contains the provided {@link AuthRole} (if not {@code null}) and + * any other authentication roles with a lesser {@link #getAuthority()} value. + *

    + * + * @param authRole An {@link AuthRole} (may be {@code null}). + * @return The set of {@link AuthRole}s based on the provided {@link AuthRole}. + */ + public static Set buildAuthRolesSet(final AuthRole authRole) { + final Set authRoles = new HashSet<>(); + + if (authRole != null) { + authRoles.add(authRole); + authRoles.addAll(Stream.of(values()) + .filter(role -> !NONE.equals(role)) + .filter(role -> role.getAuthority() < authRole.getAuthority()) + .collect(Collectors.toSet())); + } + + // Sort final set by descending authority order + return authRoles.stream() + .sorted(Comparator.comparingInt(AuthRole::getAuthority)) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + +} diff --git a/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRoleConstants.java b/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRoleConstants.java new file mode 100644 index 0000000000000..6a206ee0e89e5 --- /dev/null +++ b/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRoleConstants.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.commons.auth; + +/** + * Collection of constants that defines authorization roles. + */ +public final class AuthRoleConstants { + + public static final String ADMIN = "ADMIN"; + public static final String AUTHENTICATED_USER = "AUTHENTICATED_USER"; + public static final String EDITOR = "EDITOR"; + public static final String OWNER = "OWNER"; + public static final String NONE = "NONE"; + public static final String READER = "READER"; + + private AuthRoleConstants() {} + +} diff --git a/airbyte-commons/src/test/java/io/airbyte/commons/auth/AuthRoleTest.java b/airbyte-commons/src/test/java/io/airbyte/commons/auth/AuthRoleTest.java new file mode 100644 index 0000000000000..835488fdd84a1 --- /dev/null +++ b/airbyte-commons/src/test/java/io/airbyte/commons/auth/AuthRoleTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.commons.auth; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Set; +import org.junit.jupiter.api.Test; + +/** + * Test suite for the {@link AuthRole} enumeration. + */ +class AuthRoleTest { + + @Test + void testBuildingAuthRoleSet() { + final Set ownerResult = AuthRole.buildAuthRolesSet(AuthRole.OWNER); + assertEquals(5, ownerResult.size()); + assertEquals(Set.of(AuthRole.OWNER, AuthRole.ADMIN, AuthRole.EDITOR, AuthRole.READER, AuthRole.AUTHENTICATED_USER), ownerResult); + + final Set adminResult = AuthRole.buildAuthRolesSet(AuthRole.ADMIN); + assertEquals(4, adminResult.size()); + assertEquals(Set.of(AuthRole.ADMIN, AuthRole.EDITOR, AuthRole.READER, AuthRole.AUTHENTICATED_USER), adminResult); + + final Set editorResult = AuthRole.buildAuthRolesSet(AuthRole.EDITOR); + assertEquals(3, editorResult.size()); + assertEquals(Set.of(AuthRole.EDITOR, AuthRole.READER, AuthRole.AUTHENTICATED_USER), editorResult); + + final Set readerResult = AuthRole.buildAuthRolesSet(AuthRole.READER); + assertEquals(2, readerResult.size()); + assertEquals(Set.of(AuthRole.READER, AuthRole.AUTHENTICATED_USER), readerResult); + + final Set authenticatedUserResult = AuthRole.buildAuthRolesSet(AuthRole.AUTHENTICATED_USER); + assertEquals(1, authenticatedUserResult.size()); + assertEquals(Set.of(AuthRole.AUTHENTICATED_USER), authenticatedUserResult); + + final Set noneResult = AuthRole.buildAuthRolesSet(AuthRole.NONE); + assertEquals(1, noneResult.size()); + assertEquals(Set.of(AuthRole.NONE), noneResult); + + final Set nullResult = AuthRole.buildAuthRolesSet(null); + assertEquals(0, nullResult.size()); + } + +} diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/AttemptApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/AttemptApiController.java index d50e731d5e8d8..c7c112405b44c 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/AttemptApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/AttemptApiController.java @@ -4,6 +4,8 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.ADMIN; + import io.airbyte.api.generated.AttemptApi; import io.airbyte.api.model.generated.InternalOperationResult; import io.airbyte.api.model.generated.SaveStatsRequestBody; @@ -14,10 +16,13 @@ import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/attempt/") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class AttemptApiController implements AttemptApi { private final AttemptHandler attemptHandler; @@ -36,6 +41,7 @@ public InternalOperationResult saveStats(final SaveStatsRequestBody requestBody) @Override @Post(uri = "/set_workflow_in_attempt", processes = MediaType.APPLICATION_JSON) + @Secured({ADMIN}) public InternalOperationResult setWorkflowInAttempt(@Body final SetWorkflowInAttemptRequestBody requestBody) { return ApiHelper.execute(() -> attemptHandler.setWorkflowInAttempt(requestBody)); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java index f0de78d03d312..f61b89e41447c 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java @@ -4,6 +4,9 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.ConnectionApi; import io.airbyte.api.model.generated.ConnectionCreate; import io.airbyte.api.model.generated.ConnectionIdRequestBody; @@ -21,11 +24,14 @@ import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/connections") @Context() @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class ConnectionApiController implements ConnectionApi { private final ConnectionsHandler connectionsHandler; @@ -42,24 +48,28 @@ public ConnectionApiController(final ConnectionsHandler connectionsHandler, @Override @Post(uri = "/create") + @Secured({EDITOR}) public ConnectionRead createConnection(@Body final ConnectionCreate connectionCreate) { return ApiHelper.execute(() -> connectionsHandler.createConnection(connectionCreate)); } @Override @Post(uri = "/update") + @Secured({EDITOR}) public ConnectionRead updateConnection(@Body final ConnectionUpdate connectionUpdate) { return ApiHelper.execute(() -> connectionsHandler.updateConnection(connectionUpdate)); } @Override @Post(uri = "/list") + @Secured({READER}) public ConnectionReadList listConnectionsForWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> connectionsHandler.listConnectionsForWorkspace(workspaceIdRequestBody)); } @Override @Post(uri = "/list_all") + @Secured({READER}) public ConnectionReadList listAllConnectionsForWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> connectionsHandler.listAllConnectionsForWorkspace(workspaceIdRequestBody)); } @@ -72,12 +82,14 @@ public ConnectionReadList searchConnections(@Body final ConnectionSearch connect @Override @Post(uri = "/get") + @Secured({READER}) public ConnectionRead getConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> connectionsHandler.getConnection(connectionIdRequestBody.getConnectionId())); } @Override @Post(uri = "/delete") + @Secured({EDITOR}) public void deleteConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) { ApiHelper.execute(() -> { operationsHandler.deleteOperationsForConnection(connectionIdRequestBody); @@ -88,12 +100,14 @@ public void deleteConnection(@Body final ConnectionIdRequestBody connectionIdReq @Override @Post(uri = "/sync") + @Secured({EDITOR}) public JobInfoRead syncConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> schedulerHandler.syncConnection(connectionIdRequestBody)); } @Override @Post(uri = "/reset") + @Secured({EDITOR}) public JobInfoRead resetConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> schedulerHandler.resetConnection(connectionIdRequestBody)); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java index 6c16cec4a596e..7a20184b0e4da 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java @@ -4,6 +4,9 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.DestinationApi; import io.airbyte.api.model.generated.CheckConnectionRead; import io.airbyte.api.model.generated.DestinationCloneRequestBody; @@ -20,24 +23,32 @@ import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; -import lombok.AllArgsConstructor; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/destinations") @Requires(property = "airbyte.deployment-mode", value = "OSS") -@AllArgsConstructor +@Secured(SecurityRule.IS_AUTHENTICATED) public class DestinationApiController implements DestinationApi { private final DestinationHandler destinationHandler; private final SchedulerHandler schedulerHandler; + public DestinationApiController(final DestinationHandler destinationHandler, final SchedulerHandler schedulerHandler) { + this.destinationHandler = destinationHandler; + this.schedulerHandler = schedulerHandler; + } + @Post(uri = "/check_connection") + @Secured({EDITOR}) @Override public CheckConnectionRead checkConnectionToDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) { return ApiHelper.execute(() -> schedulerHandler.checkDestinationConnectionFromDestinationId(destinationIdRequestBody)); } @Post(uri = "/check_connection_for_update") + @Secured({EDITOR}) @Override public CheckConnectionRead checkConnectionToDestinationForUpdate(@Body final DestinationUpdate destinationUpdate) { return ApiHelper.execute(() -> schedulerHandler.checkDestinationConnectionFromDestinationIdForUpdate(destinationUpdate)); @@ -50,12 +61,14 @@ public DestinationRead cloneDestination(@Body final DestinationCloneRequestBody } @Post(uri = "/create") + @Secured({EDITOR}) @Override public DestinationRead createDestination(@Body final DestinationCreate destinationCreate) { return ApiHelper.execute(() -> destinationHandler.createDestination(destinationCreate)); } @Post(uri = "/delete") + @Secured({EDITOR}) @Override public void deleteDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) { ApiHelper.execute(() -> { @@ -65,12 +78,14 @@ public void deleteDestination(@Body final DestinationIdRequestBody destinationId } @Post(uri = "/get") + @Secured({READER}) @Override public DestinationRead getDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) { return ApiHelper.execute(() -> destinationHandler.getDestination(destinationIdRequestBody)); } @Post(uri = "/list") + @Secured({READER}) @Override public DestinationReadList listDestinationsForWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> destinationHandler.listDestinationsForWorkspace(workspaceIdRequestBody)); @@ -83,6 +98,7 @@ public DestinationReadList searchDestinations(@Body final DestinationSearch dest } @Post(uri = "/update") + @Secured({EDITOR}) @Override public DestinationRead updateDestination(@Body final DestinationUpdate destinationUpdate) { return ApiHelper.execute(() -> destinationHandler.updateDestination(destinationUpdate)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java index 54409d2810210..ab559f6b3b099 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java @@ -4,6 +4,11 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.ADMIN; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.DestinationDefinitionApi; import io.airbyte.api.model.generated.CustomDestinationDefinitionCreate; import io.airbyte.api.model.generated.DestinationDefinitionIdRequestBody; @@ -19,11 +24,14 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/destination_definitions") @Requires(property = "airbyte.deployment-mode", value = "OSS") @Context +@Secured(SecurityRule.IS_AUTHENTICATED) public class DestinationDefinitionApiController implements DestinationDefinitionApi { private final DestinationDefinitionsHandler destinationDefinitionsHandler; @@ -33,12 +41,14 @@ public DestinationDefinitionApiController(final DestinationDefinitionsHandler de } @Post(uri = "/create_custom") + @Secured({EDITOR}) @Override public DestinationDefinitionRead createCustomDestinationDefinition(final CustomDestinationDefinitionCreate customDestinationDefinitionCreate) { return ApiHelper.execute(() -> destinationDefinitionsHandler.createCustomDestinationDefinition(customDestinationDefinitionCreate)); } @Post(uri = "/delete") + @Secured({ADMIN}) @Override public void deleteDestinationDefinition(final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody) { ApiHelper.execute(() -> { @@ -48,18 +58,21 @@ public void deleteDestinationDefinition(final DestinationDefinitionIdRequestBody } @Post(uri = "/get") + @Secured({AUTHENTICATED_USER}) @Override public DestinationDefinitionRead getDestinationDefinition(final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody) { return ApiHelper.execute(() -> destinationDefinitionsHandler.getDestinationDefinition(destinationDefinitionIdRequestBody)); } @Post(uri = "/get_for_workspace") + @Secured({READER}) @Override public DestinationDefinitionRead getDestinationDefinitionForWorkspace(final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId) { return ApiHelper.execute(() -> destinationDefinitionsHandler.getDestinationDefinitionForWorkspace(destinationDefinitionIdWithWorkspaceId)); } @Post(uri = "/grant_definition") + @Secured({ADMIN}) @Override public PrivateDestinationDefinitionRead grantDestinationDefinitionToWorkspace(final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId) { return ApiHelper @@ -67,30 +80,35 @@ public PrivateDestinationDefinitionRead grantDestinationDefinitionToWorkspace(fi } @Post(uri = "/list") + @Secured({AUTHENTICATED_USER}) @Override public DestinationDefinitionReadList listDestinationDefinitions() { return ApiHelper.execute(destinationDefinitionsHandler::listDestinationDefinitions); } @Post(uri = "/list_for_workspace") + @Secured({READER}) @Override public DestinationDefinitionReadList listDestinationDefinitionsForWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> destinationDefinitionsHandler.listDestinationDefinitionsForWorkspace(workspaceIdRequestBody)); } @Post(uri = "/list_latest") + @Secured({AUTHENTICATED_USER}) @Override public DestinationDefinitionReadList listLatestDestinationDefinitions() { return ApiHelper.execute(destinationDefinitionsHandler::listLatestDestinationDefinitions); } @Post(uri = "/list_private") + @Secured({ADMIN}) @Override public PrivateDestinationDefinitionReadList listPrivateDestinationDefinitions(final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> destinationDefinitionsHandler.listPrivateDestinationDefinitions(workspaceIdRequestBody)); } @Post(uri = "/revoke_definition") + @Secured({ADMIN}) @Override public void revokeDestinationDefinitionFromWorkspace(final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId) { ApiHelper.execute(() -> { @@ -100,6 +118,7 @@ public void revokeDestinationDefinitionFromWorkspace(final DestinationDefinition } @Post(uri = "/update") + @Secured({AUTHENTICATED_USER}) @Override public DestinationDefinitionRead updateDestinationDefinition(final DestinationDefinitionUpdate destinationDefinitionUpdate) { return ApiHelper.execute(() -> destinationDefinitionsHandler.updateDestinationDefinition(destinationDefinitionUpdate)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionSpecificationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionSpecificationApiController.java index 54492c4a905f4..d93bc6dcbe999 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionSpecificationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionSpecificationApiController.java @@ -4,6 +4,8 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; + import io.airbyte.api.generated.DestinationDefinitionSpecificationApi; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionSpecificationRead; @@ -11,10 +13,13 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/destination_definition_specifications") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class DestinationDefinitionSpecificationApiController implements DestinationDefinitionSpecificationApi { private final SchedulerHandler schedulerHandler; @@ -24,6 +29,7 @@ public DestinationDefinitionSpecificationApiController(final SchedulerHandler sc } @Post("/get") + @Secured({AUTHENTICATED_USER}) @Override public DestinationDefinitionSpecificationRead getDestinationDefinitionSpecification(final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId) { return ApiHelper.execute(() -> schedulerHandler.getDestinationSpecification(destinationDefinitionIdWithWorkspaceId)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java index 33318e14efcbc..58286dfacd483 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java @@ -4,6 +4,9 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.ADMIN; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; + import io.airbyte.api.generated.DestinationOauthApi; import io.airbyte.api.model.generated.CompleteDestinationOAuthRequest; import io.airbyte.api.model.generated.DestinationOauthConsentRequest; @@ -14,12 +17,15 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; import java.util.Map; @Controller("/api/v1/destination_oauths") @Requires(property = "airbyte.deployment-mode", value = "OSS") @Context +@Secured(SecurityRule.IS_AUTHENTICATED) public class DestinationOauthApiController implements DestinationOauthApi { private final OAuthHandler oAuthHandler; @@ -29,18 +35,21 @@ public DestinationOauthApiController(final OAuthHandler oAuthHandler) { } @Post("/complete_oauth") + @Secured({EDITOR}) @Override public Map completeDestinationOAuth(final CompleteDestinationOAuthRequest completeDestinationOAuthRequest) { return ApiHelper.execute(() -> oAuthHandler.completeDestinationOAuth(completeDestinationOAuthRequest)); } @Post("/get_consent_url") + @Secured({EDITOR}) @Override public OAuthConsentRead getDestinationOAuthConsent(final DestinationOauthConsentRequest destinationOauthConsentRequest) { return ApiHelper.execute(() -> oAuthHandler.getDestinationOAuthConsent(destinationOauthConsentRequest)); } @Post("/oauth_params/create") + @Secured({ADMIN}) @Override public void setInstancewideDestinationOauthParams(final SetInstancewideDestinationOauthParamsRequestBody setInstancewideDestinationOauthParamsRequestBody) { ApiHelper.execute(() -> { diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/HealthApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/HealthApiController.java index a5b46d39742b5..3ffb6851cbc55 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/HealthApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/HealthApiController.java @@ -11,10 +11,13 @@ import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/health") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_ANONYMOUS) public class HealthApiController implements HealthApi { private final HealthCheckHandler healthCheckHandler; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java index 9fadce045d05c..b930472e5d230 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java @@ -4,6 +4,10 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.ADMIN; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.JobsApi; import io.airbyte.api.model.generated.AttemptNormalizationStatusReadList; import io.airbyte.api.model.generated.ConnectionIdRequestBody; @@ -20,11 +24,14 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/jobs") @Requires(property = "airbyte.deployment-mode", value = "OSS") @Context +@Secured(SecurityRule.IS_AUTHENTICATED) public class JobsApiController implements JobsApi { private final JobHistoryHandler jobHistoryHandler; @@ -36,42 +43,49 @@ public JobsApiController(final JobHistoryHandler jobHistoryHandler, final Schedu } @Post("/cancel") + @Secured({EDITOR}) @Override public JobInfoRead cancelJob(final JobIdRequestBody jobIdRequestBody) { return ApiHelper.execute(() -> schedulerHandler.cancelJob(jobIdRequestBody)); } @Post("/get_normalization_status") + @Secured({ADMIN}) @Override public AttemptNormalizationStatusReadList getAttemptNormalizationStatusesForJob(final JobIdRequestBody jobIdRequestBody) { return ApiHelper.execute(() -> jobHistoryHandler.getAttemptNormalizationStatuses(jobIdRequestBody)); } @Post("/get_debug_info") + @Secured({READER}) @Override public JobDebugInfoRead getJobDebugInfo(final JobIdRequestBody jobIdRequestBody) { return ApiHelper.execute(() -> jobHistoryHandler.getJobDebugInfo(jobIdRequestBody)); } @Post("/get") + @Secured({READER}) @Override public JobInfoRead getJobInfo(final JobIdRequestBody jobIdRequestBody) { return ApiHelper.execute(() -> jobHistoryHandler.getJobInfo(jobIdRequestBody)); } @Post("/get_light") + @Secured({READER}) @Override public JobInfoLightRead getJobInfoLight(final JobIdRequestBody jobIdRequestBody) { return ApiHelper.execute(() -> jobHistoryHandler.getJobInfoLight(jobIdRequestBody)); } @Post("/get_last_replication_job") + @Secured({READER}) @Override public JobOptionalRead getLastReplicationJob(final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> jobHistoryHandler.getLastReplicationJob(connectionIdRequestBody)); } @Post("/list") + @Secured({READER}) @Override public JobReadList listJobsFor(final JobListRequestBody jobListRequestBody) { return ApiHelper.execute(() -> jobHistoryHandler.listJobsFor(jobListRequestBody)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/LogsApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/LogsApiController.java index 126ed82026938..13257412cf043 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/LogsApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/LogsApiController.java @@ -4,6 +4,8 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.ADMIN; + import io.airbyte.api.generated.LogsApi; import io.airbyte.api.model.generated.LogsRequestBody; import io.airbyte.server.handlers.LogsHandler; @@ -11,12 +13,15 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; import java.io.File; @Controller("/api/v1/logs") @Requires(property = "airbyte.deployment-mode", value = "OSS") @Context +@Secured(SecurityRule.IS_AUTHENTICATED) public class LogsApiController implements LogsApi { private final LogsHandler logsHandler; @@ -26,6 +31,7 @@ public LogsApiController(final LogsHandler logsHandler) { } @Post("/get") + @Secured({ADMIN}) @Override public File getLogs(final LogsRequestBody logsRequestBody) { return ApiHelper.execute(() -> logsHandler.getLogs(logsRequestBody)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/NotFoundController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/NotFoundController.java index a59dea440b05e..0a089a21b7629 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/NotFoundController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/NotFoundController.java @@ -11,6 +11,8 @@ import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Error; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; /** * Custom controller that handles global 404 responses for unknown/unmapped paths. @@ -18,6 +20,7 @@ @Controller("/api/notfound") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_ANONYMOUS) public class NotFoundController { @Error(status = HttpStatus.NOT_FOUND, diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/NotificationsApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/NotificationsApiController.java index 6af6a1cdf242a..c81799b9ac924 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/NotificationsApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/NotificationsApiController.java @@ -4,6 +4,8 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; + import io.airbyte.api.generated.NotificationsApi; import io.airbyte.api.model.generated.Notification; import io.airbyte.api.model.generated.NotificationRead; @@ -12,10 +14,13 @@ import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/notifications/try") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class NotificationsApiController implements NotificationsApi { private final WorkspacesHandler workspacesHandler; @@ -25,6 +30,7 @@ public NotificationsApiController(final WorkspacesHandler workspacesHandler) { } @Post + @Secured({AUTHENTICATED_USER}) @Override public NotificationRead tryNotificationConfig(@Body final Notification notification) { return ApiHelper.execute(() -> workspacesHandler.tryNotification(notification)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/OpenapiApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/OpenapiApiController.java index 3aa984d7b2c7e..5e574a23deb9d 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/OpenapiApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/OpenapiApiController.java @@ -4,16 +4,21 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; + import io.airbyte.api.generated.OpenapiApi; import io.airbyte.server.handlers.OpenApiConfigHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; import java.io.File; @Controller("/api/v1/openapi") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class OpenapiApiController implements OpenapiApi { private final OpenApiConfigHandler openApiConfigHandler; @@ -23,6 +28,7 @@ public OpenapiApiController(final OpenApiConfigHandler openApiConfigHandler) { } @Get(produces = "text/plain") + @Secured({AUTHENTICATED_USER}) @Override public File getOpenApiSpec() { return ApiHelper.execute(openApiConfigHandler::getFile); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java index a892ca03d47b2..172fbb76e40a3 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java @@ -4,6 +4,10 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.OperationApi; import io.airbyte.api.model.generated.CheckOperationRead; import io.airbyte.api.model.generated.ConnectionIdRequestBody; @@ -18,10 +22,13 @@ import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/operations") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class OperationApiController implements OperationApi { private final OperationsHandler operationsHandler; @@ -31,6 +38,7 @@ public OperationApiController(final OperationsHandler operationsHandler) { } @Post("/check") + @Secured({AUTHENTICATED_USER}) @Override public CheckOperationRead checkOperation(@Body final OperatorConfiguration operatorConfiguration) { return ApiHelper.execute(() -> operationsHandler.checkOperation(operatorConfiguration)); @@ -38,11 +46,13 @@ public CheckOperationRead checkOperation(@Body final OperatorConfiguration opera @Post("/create") @Override + @Secured({EDITOR}) public OperationRead createOperation(@Body final OperationCreate operationCreate) { return ApiHelper.execute(() -> operationsHandler.createOperation(operationCreate)); } @Post("/delete") + @Secured({EDITOR}) @Override public void deleteOperation(@Body final OperationIdRequestBody operationIdRequestBody) { ApiHelper.execute(() -> { @@ -52,18 +62,21 @@ public void deleteOperation(@Body final OperationIdRequestBody operationIdReques } @Post("/get") + @Secured({READER}) @Override public OperationRead getOperation(@Body final OperationIdRequestBody operationIdRequestBody) { return ApiHelper.execute(() -> operationsHandler.getOperation(operationIdRequestBody)); } @Post("/list") + @Secured({READER}) @Override public OperationReadList listOperationsForConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> operationsHandler.listOperationsForConnection(connectionIdRequestBody)); } @Post("/update") + @Secured({EDITOR}) @Override public OperationRead updateOperation(@Body final OperationUpdate operationUpdate) { return ApiHelper.execute(() -> operationsHandler.updateOperation(operationUpdate)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java index 53019774aeca0..365dc04afc465 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java @@ -4,6 +4,9 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; + import io.airbyte.api.generated.SchedulerApi; import io.airbyte.api.model.generated.CheckConnectionRead; import io.airbyte.api.model.generated.DestinationCoreConfig; @@ -13,10 +16,13 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/scheduler") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class SchedulerApiController implements SchedulerApi { private final SchedulerHandler schedulerHandler; @@ -26,18 +32,21 @@ public SchedulerApiController(final SchedulerHandler schedulerHandler) { } @Post("/destinations/check_connection") + @Secured({AUTHENTICATED_USER}) @Override public CheckConnectionRead executeDestinationCheckConnection(final DestinationCoreConfig destinationCoreConfig) { return ApiHelper.execute(() -> schedulerHandler.checkDestinationConnectionFromDestinationCreate(destinationCoreConfig)); } @Post("/sources/check_connection") + @Secured({AUTHENTICATED_USER}) @Override public CheckConnectionRead executeSourceCheckConnection(final SourceCoreConfig sourceCoreConfig) { return ApiHelper.execute(() -> schedulerHandler.checkSourceConnectionFromSourceCreate(sourceCoreConfig)); } @Post("/sources/discover_schema") + @Secured({EDITOR}) @Override public SourceDiscoverSchemaRead executeSourceDiscoverSchema(final SourceCoreConfig sourceCoreConfig) { return ApiHelper.execute(() -> schedulerHandler.discoverSchemaForSourceFromSourceCreate(sourceCoreConfig)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java index 64cf7c58dfd62..0c680f7429895 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java @@ -4,6 +4,9 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.SourceApi; import io.airbyte.api.model.generated.ActorCatalogWithUpdatedAt; import io.airbyte.api.model.generated.CheckConnectionRead; @@ -22,10 +25,13 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/sources") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class SourceApiController implements SourceApi { private final SchedulerHandler schedulerHandler; @@ -37,12 +43,14 @@ public SourceApiController(final SchedulerHandler schedulerHandler, final Source } @Post("/check_connection") + @Secured({EDITOR}) @Override public CheckConnectionRead checkConnectionToSource(final SourceIdRequestBody sourceIdRequestBody) { return ApiHelper.execute(() -> schedulerHandler.checkSourceConnectionFromSourceId(sourceIdRequestBody)); } @Post("/check_connection_for_update") + @Secured({EDITOR}) @Override public CheckConnectionRead checkConnectionToSourceForUpdate(final SourceUpdate sourceUpdate) { return ApiHelper.execute(() -> schedulerHandler.checkSourceConnectionFromSourceIdForUpdate(sourceUpdate)); @@ -55,12 +63,14 @@ public SourceRead cloneSource(final SourceCloneRequestBody sourceCloneRequestBod } @Post("/create") + @Secured({EDITOR}) @Override public SourceRead createSource(final SourceCreate sourceCreate) { return ApiHelper.execute(() -> sourceHandler.createSource(sourceCreate)); } @Post("/delete") + @Secured({EDITOR}) @Override public void deleteSource(final SourceIdRequestBody sourceIdRequestBody) { ApiHelper.execute(() -> { @@ -70,24 +80,28 @@ public void deleteSource(final SourceIdRequestBody sourceIdRequestBody) { } @Post("/discover_schema") + @Secured({EDITOR}) @Override public SourceDiscoverSchemaRead discoverSchemaForSource(final SourceDiscoverSchemaRequestBody sourceDiscoverSchemaRequestBody) { return ApiHelper.execute(() -> schedulerHandler.discoverSchemaForSourceFromSourceId(sourceDiscoverSchemaRequestBody)); } @Post("/get") + @Secured({READER}) @Override public SourceRead getSource(final SourceIdRequestBody sourceIdRequestBody) { return ApiHelper.execute(() -> sourceHandler.getSource(sourceIdRequestBody)); } @Post("/most_recent_source_actor_catalog") + @Secured({READER}) @Override public ActorCatalogWithUpdatedAt getMostRecentSourceActorCatalog(final SourceIdRequestBody sourceIdRequestBody) { return ApiHelper.execute(() -> sourceHandler.getMostRecentSourceActorCatalogWithUpdatedAt(sourceIdRequestBody)); } @Post("/list") + @Secured({READER}) @Override public SourceReadList listSourcesForWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> sourceHandler.listSourcesForWorkspace(workspaceIdRequestBody)); @@ -100,6 +114,7 @@ public SourceReadList searchSources(final SourceSearch sourceSearch) { } @Post("/update") + @Secured({EDITOR}) @Override public SourceRead updateSource(final SourceUpdate sourceUpdate) { return ApiHelper.execute(() -> sourceHandler.updateSource(sourceUpdate)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java index 71222c7873c22..97a030dc7f70f 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java @@ -4,6 +4,11 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.ADMIN; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.SourceDefinitionApi; import io.airbyte.api.model.generated.CustomSourceDefinitionCreate; import io.airbyte.api.model.generated.PrivateSourceDefinitionRead; @@ -19,11 +24,14 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/source_definitions") @Requires(property = "airbyte.deployment-mode", value = "OSS") @Context +@Secured(SecurityRule.IS_AUTHENTICATED) public class SourceDefinitionApiController implements SourceDefinitionApi { private final SourceDefinitionsHandler sourceDefinitionsHandler; @@ -33,12 +41,14 @@ public SourceDefinitionApiController(final SourceDefinitionsHandler sourceDefini } @Post("/create_custom") + @Secured({EDITOR}) @Override public SourceDefinitionRead createCustomSourceDefinition(final CustomSourceDefinitionCreate customSourceDefinitionCreate) { return ApiHelper.execute(() -> sourceDefinitionsHandler.createCustomSourceDefinition(customSourceDefinitionCreate)); } @Post("/delete") + @Secured({ADMIN}) @Override public void deleteSourceDefinition(final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody) { ApiHelper.execute(() -> { @@ -48,48 +58,56 @@ public void deleteSourceDefinition(final SourceDefinitionIdRequestBody sourceDef } @Post("/get") + @Secured({AUTHENTICATED_USER}) @Override public SourceDefinitionRead getSourceDefinition(final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody) { return ApiHelper.execute(() -> sourceDefinitionsHandler.getSourceDefinition(sourceDefinitionIdRequestBody)); } @Post("/get_for_workspace") + @Secured({READER}) @Override public SourceDefinitionRead getSourceDefinitionForWorkspace(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId) { return ApiHelper.execute(() -> sourceDefinitionsHandler.getSourceDefinitionForWorkspace(sourceDefinitionIdWithWorkspaceId)); } @Post("/grant_definition") + @Secured({ADMIN}) @Override public PrivateSourceDefinitionRead grantSourceDefinitionToWorkspace(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId) { return ApiHelper.execute(() -> sourceDefinitionsHandler.grantSourceDefinitionToWorkspace(sourceDefinitionIdWithWorkspaceId)); } @Post("/list_latest") + @Secured({AUTHENTICATED_USER}) @Override public SourceDefinitionReadList listLatestSourceDefinitions() { return ApiHelper.execute(sourceDefinitionsHandler::listLatestSourceDefinitions); } @Post("/list_private") + @Secured({ADMIN}) @Override public PrivateSourceDefinitionReadList listPrivateSourceDefinitions(final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> sourceDefinitionsHandler.listPrivateSourceDefinitions(workspaceIdRequestBody)); } @Post("/list") + @Secured({AUTHENTICATED_USER}) @Override public SourceDefinitionReadList listSourceDefinitions() { return ApiHelper.execute(sourceDefinitionsHandler::listSourceDefinitions); } @Post("/list_for_workspace") + @Secured({READER}) @Override public SourceDefinitionReadList listSourceDefinitionsForWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> sourceDefinitionsHandler.listSourceDefinitionsForWorkspace(workspaceIdRequestBody)); } @Post("/revoke_definition") + @Secured({ADMIN}) @Override public void revokeSourceDefinitionFromWorkspace(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId) { ApiHelper.execute(() -> { @@ -99,6 +117,7 @@ public void revokeSourceDefinitionFromWorkspace(final SourceDefinitionIdWithWork } @Post("/update") + @Secured({AUTHENTICATED_USER}) @Override public SourceDefinitionRead updateSourceDefinition(final SourceDefinitionUpdate sourceDefinitionUpdate) { return ApiHelper.execute(() -> sourceDefinitionsHandler.updateSourceDefinition(sourceDefinitionUpdate)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionSpecificationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionSpecificationApiController.java index 590f7340b61bf..e87b5c28bddc2 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionSpecificationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionSpecificationApiController.java @@ -4,6 +4,8 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; + import io.airbyte.api.generated.SourceDefinitionSpecificationApi; import io.airbyte.api.model.generated.SourceDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.SourceDefinitionSpecificationRead; @@ -11,10 +13,13 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/source_definition_specifications") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class SourceDefinitionSpecificationApiController implements SourceDefinitionSpecificationApi { private final SchedulerHandler schedulerHandler; @@ -24,6 +29,7 @@ public SourceDefinitionSpecificationApiController(final SchedulerHandler schedul } @Post("/get") + @Secured({AUTHENTICATED_USER}) @Override public SourceDefinitionSpecificationRead getSourceDefinitionSpecification(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId) { return ApiHelper.execute(() -> schedulerHandler.getSourceDefinitionSpecification(sourceDefinitionIdWithWorkspaceId)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java index 2bba632cf6386..52cbc82beb97f 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java @@ -4,6 +4,9 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.ADMIN; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; + import io.airbyte.api.generated.SourceOauthApi; import io.airbyte.api.model.generated.CompleteSourceOauthRequest; import io.airbyte.api.model.generated.OAuthConsentRead; @@ -14,11 +17,14 @@ import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; import java.util.Map; @Controller("/api/v1/source_oauths") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class SourceOauthApiController implements SourceOauthApi { private final OAuthHandler oAuthHandler; @@ -28,18 +34,21 @@ public SourceOauthApiController(final OAuthHandler oAuthHandler) { } @Post("/complete_oauth") + @Secured({EDITOR}) @Override public Map completeSourceOAuth(@Body final CompleteSourceOauthRequest completeSourceOauthRequest) { return ApiHelper.execute(() -> oAuthHandler.completeSourceOAuth(completeSourceOauthRequest)); } @Post("/get_consent_url") + @Secured({EDITOR}) @Override public OAuthConsentRead getSourceOAuthConsent(@Body final SourceOauthConsentRequest sourceOauthConsentRequest) { return ApiHelper.execute(() -> oAuthHandler.getSourceOAuthConsent(sourceOauthConsentRequest)); } @Post("/oauth_params/create") + @Secured({ADMIN}) @Override public void setInstancewideSourceOauthParams(@Body final SetInstancewideSourceOauthParamsRequestBody setInstancewideSourceOauthParamsRequestBody) { ApiHelper.execute(() -> { diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/StateApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/StateApiController.java index b1b62373aaa1c..870a499d5999d 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/StateApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/StateApiController.java @@ -4,6 +4,9 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.ADMIN; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.StateApi; import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; @@ -12,10 +15,13 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/state") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class StateApiController implements StateApi { private final StateHandler stateHandler; @@ -25,12 +31,14 @@ public StateApiController(final StateHandler stateHandler) { } @Post("/create_or_update") + @Secured({ADMIN}) @Override public ConnectionState createOrUpdateState(final ConnectionStateCreateOrUpdate connectionStateCreateOrUpdate) { return ApiHelper.execute(() -> stateHandler.createOrUpdateState(connectionStateCreateOrUpdate)); } @Post("/get") + @Secured({READER}) @Override public ConnectionState getState(final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> stateHandler.getState(connectionIdRequestBody)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/WebBackendApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/WebBackendApiController.java index ac13e02015c1b..af8c5a3ad3167 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/WebBackendApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/WebBackendApiController.java @@ -4,6 +4,10 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; +import static io.airbyte.commons.auth.AuthRoleConstants.EDITOR; +import static io.airbyte.commons.auth.AuthRoleConstants.READER; + import io.airbyte.api.generated.WebBackendApi; import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionStateType; @@ -23,10 +27,13 @@ import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/web_backend") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) public class WebBackendApiController implements WebBackendApi { private final WebBackendConnectionsHandler webBackendConnectionsHandler; @@ -42,48 +49,56 @@ public WebBackendApiController(final WebBackendConnectionsHandler webBackendConn } @Post("/state/get_type") + @Secured({READER}) @Override public ConnectionStateType getStateType(final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> webBackendConnectionsHandler.getStateType(connectionIdRequestBody)); } @Post("/check_updates") + @Secured({READER}) @Override public WebBackendCheckUpdatesRead webBackendCheckUpdates() { return ApiHelper.execute(webBackendCheckUpdatesHandler::checkUpdates); } @Post("/connections/create") + @Secured({EDITOR}) @Override public WebBackendConnectionRead webBackendCreateConnection(final WebBackendConnectionCreate webBackendConnectionCreate) { return ApiHelper.execute(() -> webBackendConnectionsHandler.webBackendCreateConnection(webBackendConnectionCreate)); } @Post("/connections/get") + @Secured({READER}) @Override public WebBackendConnectionRead webBackendGetConnection(final WebBackendConnectionRequestBody webBackendConnectionRequestBody) { return ApiHelper.execute(() -> webBackendConnectionsHandler.webBackendGetConnection(webBackendConnectionRequestBody)); } @Post("/workspace/state") + @Secured({READER}) @Override public WebBackendWorkspaceStateResult webBackendGetWorkspaceState(final WebBackendWorkspaceState webBackendWorkspaceState) { return ApiHelper.execute(() -> webBackendConnectionsHandler.getWorkspaceState(webBackendWorkspaceState)); } @Post("/connections/list") + @Secured({READER}) @Override public WebBackendConnectionReadList webBackendListConnectionsForWorkspace(final WebBackendConnectionListRequestBody webBackendConnectionListRequestBody) { return ApiHelper.execute(() -> webBackendConnectionsHandler.webBackendListConnectionsForWorkspace(webBackendConnectionListRequestBody)); } @Post("/geographies/list") + @Secured({AUTHENTICATED_USER}) @Override public WebBackendGeographiesListResult webBackendListGeographies() { return ApiHelper.execute(webBackendGeographiesHandler::listGeographiesOSS); } @Post("/connections/update") + @Secured({EDITOR}) @Override public WebBackendConnectionRead webBackendUpdateConnection(final WebBackendConnectionUpdate webBackendConnectionUpdate) { return ApiHelper.execute(() -> webBackendConnectionsHandler.webBackendUpdateConnection(webBackendConnectionUpdate)); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java index 14d3fdc90ad8d..1942a4d03afbb 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java @@ -4,6 +4,9 @@ package io.airbyte.server.apis; +import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; +import static io.airbyte.commons.auth.AuthRoleConstants.OWNER; + import io.airbyte.api.generated.WorkspaceApi; import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.SlugRequestBody; @@ -19,10 +22,14 @@ import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.security.annotation.Secured; +import io.micronaut.security.rules.SecurityRule; @Controller("/api/v1/workspaces") @Requires(property = "airbyte.deployment-mode", value = "OSS") +@Secured(SecurityRule.IS_AUTHENTICATED) +@SuppressWarnings("PMD.AvoidDuplicateLiterals") public class WorkspaceApiController implements WorkspaceApi { private final WorkspacesHandler workspacesHandler; @@ -32,12 +39,14 @@ public WorkspaceApiController(final WorkspacesHandler workspacesHandler) { } @Post("/create") + @Secured({AUTHENTICATED_USER}) @Override public WorkspaceRead createWorkspace(@Body final WorkspaceCreate workspaceCreate) { return ApiHelper.execute(() -> workspacesHandler.createWorkspace(workspaceCreate)); } @Post("/delete") + @Secured({OWNER}) @Override public void deleteWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { ApiHelper.execute(() -> { @@ -47,30 +56,35 @@ public void deleteWorkspace(@Body final WorkspaceIdRequestBody workspaceIdReques } @Post("/get") + @Secured({OWNER}) @Override public WorkspaceRead getWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { return ApiHelper.execute(() -> workspacesHandler.getWorkspace(workspaceIdRequestBody)); } @Post("/get_by_slug") + @Secured({OWNER}) @Override public WorkspaceRead getWorkspaceBySlug(@Body final SlugRequestBody slugRequestBody) { return ApiHelper.execute(() -> workspacesHandler.getWorkspaceBySlug(slugRequestBody)); } @Post("/list") + @Secured({AUTHENTICATED_USER}) @Override public WorkspaceReadList listWorkspaces() { return ApiHelper.execute(workspacesHandler::listWorkspaces); } @Post("/update") + @Secured({OWNER}) @Override public WorkspaceRead updateWorkspace(@Body final WorkspaceUpdate workspaceUpdate) { return ApiHelper.execute(() -> workspacesHandler.updateWorkspace(workspaceUpdate)); } @Post("/tag_feedback_status_as_done") + @Secured({OWNER}) @Override public void updateWorkspaceFeedback(@Body final WorkspaceGiveFeedback workspaceGiveFeedback) { ApiHelper.execute(() -> { @@ -80,12 +94,14 @@ public void updateWorkspaceFeedback(@Body final WorkspaceGiveFeedback workspaceG } @Post("/update_name") + @Secured({OWNER}) @Override public WorkspaceRead updateWorkspaceName(@Body final WorkspaceUpdateName workspaceUpdateName) { return ApiHelper.execute(() -> workspacesHandler.updateWorkspaceName(workspaceUpdateName)); } @Post("/get_by_connection_id") + @Secured({AUTHENTICATED_USER}) @Override public WorkspaceRead getWorkspaceByConnectionId(@Body final ConnectionIdRequestBody connectionIdRequestBody) { return ApiHelper.execute(() -> workspacesHandler.getWorkspaceByConnectionId(connectionIdRequestBody)); diff --git a/airbyte-server/src/main/resources/application.yml b/airbyte-server/src/main/resources/application.yml index 53e670c2c523a..1c58a63ef5466 100644 --- a/airbyte-server/src/main/resources/application.yml +++ b/airbyte-server/src/main/resources/application.yml @@ -2,19 +2,8 @@ micronaut: application: name: airbyte-server security: - intercept-url-map: - - pattern: /** - httpMethod: GET - access: - - isAnonymous() - - pattern: /** - httpMethod: POST - access: - - isAnonymous() - - pattern: /** - httpMethod: HEAD - access: - - isAnonymous() + authentication-provider-strategy: ALL + enabled: ${API_AUTHORIZATION_ENABLED:false} server: port: 8001 cors: @@ -118,6 +107,32 @@ datasources: username: ${DATABASE_USER} password: ${DATABASE_PASSWORD} +endpoints: + beans: + enabled: true + sensitive: false + env: + enabled: true + sensitive: false + health: + enabled: true + sensitive: false + info: + enabled: true + sensitive: true + loggers: + enabled: true + sensitive: true + refresh: + enabled: false + sensitive: true + routes: + enabled: true + sensitive: false + threaddump: + enabled: true + sensitive: true + flyway: enabled: true datasources: @@ -138,3 +153,10 @@ jooq: jobs: jackson-converter-enabled: true sql-dialect: POSTGRES + +logger: + levels: + # Uncomment to help resolve issues with conditional beans + # io.micronaut.context.condition: DEBUG + # Uncomment to help resolve issues with security beans + # io.micronaut.security: DEBUG diff --git a/deps.toml b/deps.toml index f3a642d9bab42..0fa2bd639d690 100644 --- a/deps.toml +++ b/deps.toml @@ -24,6 +24,7 @@ micronaut = "3.8.1" micronaut-test = "3.8.0" platform-testcontainers = "1.17.3" postgresql = "42.3.5" +reactor = "3.5.2" slf4j = "1.7.36" temporal = "1.17.0" @@ -101,6 +102,7 @@ platform-testcontainers-jdbc = { module = "org.testcontainers:jdbc", version.ref platform-testcontainers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "platform-testcontainers" } postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql" } quartz-scheduler = { module = "org.quartz-scheduler:quartz", version = "2.3.2" } +reactor-core = { module = "io.projectreactor:reactor-core", version.ref = "reactor" } s3 = { module = "software.amazon.awssdk:s3", version = "2.16.84" } slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } spotbugs-annotations = { module = "com.github.spotbugs:spotbugs-annotations", version = "4.7.3" } From ea5574ac437fe4bf34023a1682fdf01c946897c2 Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 23 Jan 2023 10:18:34 -0800 Subject: [PATCH 031/195] Update limitations (#21354) --- docs/integrations/destinations/google-sheets.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/integrations/destinations/google-sheets.md b/docs/integrations/destinations/google-sheets.md index ef4c122966aee..7b836e0535089 100644 --- a/docs/integrations/destinations/google-sheets.md +++ b/docs/integrations/destinations/google-sheets.md @@ -107,12 +107,12 @@ Please be aware of the [Google Spreadsheet limitations](#limitations) before you ### Google Sheets Limitations -During the upload process and from the data storage perspective there are some limitations that should be considered beforehands: +During the upload process and from the data storage perspective there are some limitations that should be considered beforehand as [determined by Google here](https://support.google.com/drive/answer/37603): -- **Maximum of 5 Million Cells** +- **Maximum of 10 Million Cells** -A Google Sheets document can have a maximum of 5 million cells. These can be in a single worksheet or in multiple sheets. -In case you already have the 5 million limit reached in fewer columns, it will not allow you to add more columns (and vice versa, i.e., if 5 million cells limit is reached with a certain number of rows, it will not allow more rows). +A Google Sheets document can have a maximum of 10 million cells. These can be in a single worksheet or in multiple sheets. +In case you already have the 10 million limit reached in fewer columns, it will not allow you to add more columns (and vice versa, i.e., if 10 million cells limit is reached with a certain number of rows, it will not allow more rows). - **Maximum of 18,278 Columns** From e93a463983fc583b1f1091a163d732ef277c1f61 Mon Sep 17 00:00:00 2001 From: Yowan Ramchoreeter <26179814+YowanR@users.noreply.github.com> Date: Mon, 23 Jan 2023 23:53:58 +0530 Subject: [PATCH 032/195] Update shopify.md (#21502) Adding call to action to Shopify doc to help us land OAuth in Cloud --- docs/integrations/sources/shopify.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/integrations/sources/shopify.md b/docs/integrations/sources/shopify.md index f0617da479cef..44f5cc6530725 100644 --- a/docs/integrations/sources/shopify.md +++ b/docs/integrations/sources/shopify.md @@ -5,6 +5,13 @@ description: >- # Shopify + +:::note + +Our Shopify Source Connector does not support OAuth at this time due to limitations outside of our control. If OAuth for Shopify is critical to your business, [please reach out to us](mailto:product@airbyte.io) to discuss how we may be able to partner on this effort. + +::: + ## Sync overview The Shopify source supports both Full Refresh and Incremental syncs. You can choose if this connector will copy only the new or updated data, or all rows in the tables and columns you set up for replication, every time a sync is run. From e844d73b286f407e84b895e3ebf5d40847b9aa87 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 23 Jan 2023 19:29:10 +0100 Subject: [PATCH 033/195] pin cdk version (#21708) --- airbyte-connector-builder-server/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-connector-builder-server/setup.py b/airbyte-connector-builder-server/setup.py index 66d7c37273420..e25a3dab72266 100644 --- a/airbyte-connector-builder-server/setup.py +++ b/airbyte-connector-builder-server/setup.py @@ -41,7 +41,7 @@ }, packages=find_packages(exclude=("unit_tests", "integration_tests", "docs")), package_data={}, - install_requires=["airbyte-cdk~=0.15", "fastapi", "uvicorn"], + install_requires=["airbyte-cdk==0.21.0", "fastapi", "uvicorn"], python_requires=">=3.9.11", extras_require={ "tests": [ From b7d5be9e800354bfb7824a64ce2ece1414757aca Mon Sep 17 00:00:00 2001 From: Benoit Moriceau Date: Mon, 23 Jan 2023 10:32:36 -0800 Subject: [PATCH 034/195] Add No content status code (#21655) * Add No content status code * Format --- .../java/io/airbyte/server/apis/ConnectionApiController.java | 3 +++ .../java/io/airbyte/server/apis/DestinationApiController.java | 3 +++ .../server/apis/DestinationDefinitionApiController.java | 3 +++ .../java/io/airbyte/server/apis/OperationApiController.java | 3 +++ .../main/java/io/airbyte/server/apis/SourceApiController.java | 3 +++ .../io/airbyte/server/apis/SourceDefinitionApiController.java | 4 ++++ .../java/io/airbyte/server/apis/WorkspaceApiController.java | 3 +++ 7 files changed, 22 insertions(+) diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java index f61b89e41447c..aca38ca5ccec7 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java @@ -21,9 +21,11 @@ import io.airbyte.server.handlers.SchedulerHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; +import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.http.annotation.Status; import io.micronaut.security.annotation.Secured; import io.micronaut.security.rules.SecurityRule; @@ -89,6 +91,7 @@ public ConnectionRead getConnection(@Body final ConnectionIdRequestBody connecti @Override @Post(uri = "/delete") + @Status(HttpStatus.NO_CONTENT) @Secured({EDITOR}) public void deleteConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) { ApiHelper.execute(() -> { diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java index 7a20184b0e4da..0c1d5f074faa1 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java @@ -20,9 +20,11 @@ import io.airbyte.server.handlers.DestinationHandler; import io.airbyte.server.handlers.SchedulerHandler; import io.micronaut.context.annotation.Requires; +import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.http.annotation.Status; import io.micronaut.security.annotation.Secured; import io.micronaut.security.rules.SecurityRule; @@ -70,6 +72,7 @@ public DestinationRead createDestination(@Body final DestinationCreate destinati @Post(uri = "/delete") @Secured({EDITOR}) @Override + @Status(HttpStatus.NO_CONTENT) public void deleteDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) { ApiHelper.execute(() -> { destinationHandler.deleteDestination(destinationIdRequestBody); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java index ab559f6b3b099..e3796c033c320 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java @@ -22,8 +22,10 @@ import io.airbyte.server.handlers.DestinationDefinitionsHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; +import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.http.annotation.Status; import io.micronaut.security.annotation.Secured; import io.micronaut.security.rules.SecurityRule; @@ -50,6 +52,7 @@ public DestinationDefinitionRead createCustomDestinationDefinition(final CustomD @Post(uri = "/delete") @Secured({ADMIN}) @Override + @Status(HttpStatus.NO_CONTENT) public void deleteDestinationDefinition(final DestinationDefinitionIdRequestBody destinationDefinitionIdRequestBody) { ApiHelper.execute(() -> { destinationDefinitionsHandler.deleteDestinationDefinition(destinationDefinitionIdRequestBody); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java index 172fbb76e40a3..64ac3c337f51a 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java @@ -19,9 +19,11 @@ import io.airbyte.api.model.generated.OperatorConfiguration; import io.airbyte.server.handlers.OperationsHandler; import io.micronaut.context.annotation.Requires; +import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.http.annotation.Status; import io.micronaut.security.annotation.Secured; import io.micronaut.security.rules.SecurityRule; @@ -54,6 +56,7 @@ public OperationRead createOperation(@Body final OperationCreate operationCreate @Post("/delete") @Secured({EDITOR}) @Override + @Status(HttpStatus.NO_CONTENT) public void deleteOperation(@Body final OperationIdRequestBody operationIdRequestBody) { ApiHelper.execute(() -> { operationsHandler.deleteOperation(operationIdRequestBody); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java index 0c680f7429895..c1d5970465ca1 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java @@ -23,8 +23,10 @@ import io.airbyte.server.handlers.SchedulerHandler; import io.airbyte.server.handlers.SourceHandler; import io.micronaut.context.annotation.Requires; +import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.http.annotation.Status; import io.micronaut.security.annotation.Secured; import io.micronaut.security.rules.SecurityRule; @@ -72,6 +74,7 @@ public SourceRead createSource(final SourceCreate sourceCreate) { @Post("/delete") @Secured({EDITOR}) @Override + @Status(HttpStatus.NO_CONTENT) public void deleteSource(final SourceIdRequestBody sourceIdRequestBody) { ApiHelper.execute(() -> { sourceHandler.deleteSource(sourceIdRequestBody); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java index 97a030dc7f70f..1dac7ca5b7089 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java @@ -22,8 +22,10 @@ import io.airbyte.server.handlers.SourceDefinitionsHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; +import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.http.annotation.Status; import io.micronaut.security.annotation.Secured; import io.micronaut.security.rules.SecurityRule; @@ -50,6 +52,7 @@ public SourceDefinitionRead createCustomSourceDefinition(final CustomSourceDefin @Post("/delete") @Secured({ADMIN}) @Override + @Status(HttpStatus.NO_CONTENT) public void deleteSourceDefinition(final SourceDefinitionIdRequestBody sourceDefinitionIdRequestBody) { ApiHelper.execute(() -> { sourceDefinitionsHandler.deleteSourceDefinition(sourceDefinitionIdRequestBody); @@ -109,6 +112,7 @@ public SourceDefinitionReadList listSourceDefinitionsForWorkspace(final Workspac @Post("/revoke_definition") @Secured({ADMIN}) @Override + @Status(HttpStatus.NO_CONTENT) public void revokeSourceDefinitionFromWorkspace(final SourceDefinitionIdWithWorkspaceId sourceDefinitionIdWithWorkspaceId) { ApiHelper.execute(() -> { sourceDefinitionsHandler.revokeSourceDefinitionFromWorkspace(sourceDefinitionIdWithWorkspaceId); diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java index 1942a4d03afbb..c270ce286ccf9 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java @@ -19,9 +19,11 @@ import io.airbyte.api.model.generated.WorkspaceUpdateName; import io.airbyte.server.handlers.WorkspacesHandler; import io.micronaut.context.annotation.Requires; +import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; +import io.micronaut.http.annotation.Status; import io.micronaut.security.annotation.Secured; import io.micronaut.security.rules.SecurityRule; @@ -48,6 +50,7 @@ public WorkspaceRead createWorkspace(@Body final WorkspaceCreate workspaceCreate @Post("/delete") @Secured({OWNER}) @Override + @Status(HttpStatus.NO_CONTENT) public void deleteWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) { ApiHelper.execute(() -> { workspacesHandler.deleteWorkspace(workspaceIdRequestBody); From 083778183e788e09728a0e13eca35b8fccc48a1d Mon Sep 17 00:00:00 2001 From: Xiaohan Song Date: Mon, 23 Jan 2023 11:02:30 -0800 Subject: [PATCH 035/195] Add write discover fetch event API (#21506) * api changes for writing discover catalog * api changes * format * change return type of the API to return catalogId * PR comments fix * format --- airbyte-api/src/main/openapi/config.yaml | 44 ++++++ .../server/apis/SourceApiController.java | 8 ++ .../server/handlers/ConnectionsHandler.java | 4 +- .../server/handlers/SchedulerHandler.java | 2 +- .../server/handlers/SourceHandler.java | 15 +++ .../WebBackendConnectionsHandler.java | 4 +- .../handlers/helpers/CatalogConverter.java | 39 +++++- .../converters/CatalogConverterTest.java | 23 ++-- .../server/handlers/SourceHandlerTest.java | 28 ++++ .../WebBackendConnectionsHandlerTest.java | 2 +- .../api/generated-api-html/index.html | 125 ++++++++++++++++++ 11 files changed, 272 insertions(+), 22 deletions(-) diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index 2107c31066f7e..3d22973efe42e 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -754,6 +754,27 @@ paths: $ref: "#/components/responses/NotFoundResponse" "422": $ref: "#/components/responses/InvalidInputResponse" + + /v1/sources/write_discover_catalog_result: + post: + tags: + - source + - internal + summary: Should only called from worker, to write result from discover activity back to DB. + operationId: writeDiscoverCatalogResult + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SourceDiscoverSchemaWriteRequestBody" + required: true + responses: + "200": + description: Successful Operation + content: + application/json: + schema: + $ref: "#/components/schemas/DiscoverCatalogResult" /v1/destination_definitions/update: post: tags: @@ -2812,6 +2833,21 @@ components: type: array items: $ref: "#/components/schemas/SourceRead" + SourceDiscoverSchemaWriteRequestBody: + description: to write this requested object to database. + type: object + required: + - catalog + properties: + catalog: + $ref: "#/components/schemas/AirbyteCatalog" + sourceId: + $ref: "#/components/schemas/SourceId" + connectorVersion: + type: string + configurationHash: + type: string + SourceDiscoverSchemaRead: description: Returns the results of a discover catalog job. If the job was not successful, the catalog field will not be present. jobInfo will aways be present and its status be used to determine if the job was successful or not. type: object @@ -4993,6 +5029,14 @@ components: properties: succeeded: type: boolean + DiscoverCatalogResult: + type: object + required: + - catalogId + properties: + catalogId: + type: string + format: uuid AttemptNormalizationStatusReadList: type: object properties: diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java index c1d5970465ca1..d7946484d8ee4 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java @@ -10,10 +10,12 @@ import io.airbyte.api.generated.SourceApi; import io.airbyte.api.model.generated.ActorCatalogWithUpdatedAt; import io.airbyte.api.model.generated.CheckConnectionRead; +import io.airbyte.api.model.generated.DiscoverCatalogResult; import io.airbyte.api.model.generated.SourceCloneRequestBody; import io.airbyte.api.model.generated.SourceCreate; import io.airbyte.api.model.generated.SourceDiscoverSchemaRead; import io.airbyte.api.model.generated.SourceDiscoverSchemaRequestBody; +import io.airbyte.api.model.generated.SourceDiscoverSchemaWriteRequestBody; import io.airbyte.api.model.generated.SourceIdRequestBody; import io.airbyte.api.model.generated.SourceRead; import io.airbyte.api.model.generated.SourceReadList; @@ -123,4 +125,10 @@ public SourceRead updateSource(final SourceUpdate sourceUpdate) { return ApiHelper.execute(() -> sourceHandler.updateSource(sourceUpdate)); } + @Post("/write_discover_catalog_result") + @Override + public DiscoverCatalogResult writeDiscoverCatalogResult(final SourceDiscoverSchemaWriteRequestBody request) { + return ApiHelper.execute(() -> sourceHandler.writeDiscoverCatalogResult(request)); + } + } diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/ConnectionsHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/ConnectionsHandler.java index ba32bfeb380ea..12aff047d12a0 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/ConnectionsHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/ConnectionsHandler.java @@ -160,7 +160,7 @@ public ConnectionRead createConnection(final ConnectionCreate connectionCreate) // TODO Undesirable behavior: sending a null configured catalog should not be valid? if (connectionCreate.getSyncCatalog() != null) { - standardSync.withCatalog(CatalogConverter.toProtocol(connectionCreate.getSyncCatalog())); + standardSync.withCatalog(CatalogConverter.toConfiguredProtocol(connectionCreate.getSyncCatalog())); standardSync.withFieldSelectionData(CatalogConverter.getFieldSelectionData(connectionCreate.getSyncCatalog())); } else { standardSync.withCatalog(new ConfiguredAirbyteCatalog().withStreams(Collections.emptyList())); @@ -318,7 +318,7 @@ private static void applyPatchToStandardSync(final StandardSync sync, final Conn // in the patch. Otherwise, leave the field unchanged. if (patch.getSyncCatalog() != null) { - sync.setCatalog(CatalogConverter.toProtocol(patch.getSyncCatalog())); + sync.setCatalog(CatalogConverter.toConfiguredProtocol(patch.getSyncCatalog())); sync.withFieldSelectionData(CatalogConverter.getFieldSelectionData(patch.getSyncCatalog())); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java index d2270ccf172b7..97e8bfb5cc006 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java @@ -404,7 +404,7 @@ private void generateCatalogDiffsAndDisableConnectionsIfNeeded(final SourceDisco connectionRead.getSyncCatalog(); final CatalogDiff diff = connectionsHandler.getDiff(catalogUsedToMakeConfiguredCatalog.orElse(currentAirbyteCatalog), discoveredSchema.getCatalog(), - CatalogConverter.toProtocol(currentAirbyteCatalog)); + CatalogConverter.toConfiguredProtocol(currentAirbyteCatalog)); final boolean containsBreakingChange = containsBreakingChange(diff); final ConnectionUpdate updateObject = new ConnectionUpdate().breakingChange(containsBreakingChange).connectionId(connectionRead.getConnectionId()); diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java index cfb0fb278b8c6..c8c366bab4a8b 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java @@ -8,10 +8,12 @@ import com.google.common.collect.Lists; import io.airbyte.api.model.generated.ActorCatalogWithUpdatedAt; import io.airbyte.api.model.generated.ConnectionRead; +import io.airbyte.api.model.generated.DiscoverCatalogResult; import io.airbyte.api.model.generated.SourceCloneConfiguration; import io.airbyte.api.model.generated.SourceCloneRequestBody; import io.airbyte.api.model.generated.SourceCreate; import io.airbyte.api.model.generated.SourceDefinitionIdRequestBody; +import io.airbyte.api.model.generated.SourceDiscoverSchemaWriteRequestBody; import io.airbyte.api.model.generated.SourceIdRequestBody; import io.airbyte.api.model.generated.SourceRead; import io.airbyte.api.model.generated.SourceReadList; @@ -27,8 +29,10 @@ import io.airbyte.config.persistence.SecretsRepositoryWriter; import io.airbyte.config.persistence.split_secrets.JsonSecretsProcessor; import io.airbyte.persistence.job.factory.OAuthConfigSupplier; +import io.airbyte.protocol.models.AirbyteCatalog; import io.airbyte.protocol.models.ConnectorSpecification; import io.airbyte.server.converters.ConfigurationUpdate; +import io.airbyte.server.handlers.helpers.CatalogConverter; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Inject; @@ -261,6 +265,17 @@ public void deleteSource(final SourceRead source) spec); } + public DiscoverCatalogResult writeDiscoverCatalogResult(final SourceDiscoverSchemaWriteRequestBody request) + throws JsonValidationException, IOException { + final AirbyteCatalog persistenceCatalog = CatalogConverter.toProtocol(request.getCatalog()); + UUID catalogId = configRepository.writeActorCatalogFetchEvent( + persistenceCatalog, + request.getSourceId(), + request.getConnectorVersion(), + request.getConfigurationHash()); + return new DiscoverCatalogResult().catalogId(catalogId); + } + private SourceRead buildSourceRead(final UUID sourceId) throws ConfigNotFoundException, IOException, JsonValidationException { // read configuration from db diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendConnectionsHandler.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendConnectionsHandler.java index 99303a29f615a..e45c356867041 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendConnectionsHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendConnectionsHandler.java @@ -546,7 +546,7 @@ public WebBackendConnectionRead webBackendUpdateConnection(final WebBackendConne Jsons.object(mostRecentActorCatalog.get().getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); final CatalogDiff catalogDiff = connectionsHandler.getDiff(newAirbyteCatalog, CatalogConverter.toApi(mostRecentAirbyteCatalog), - CatalogConverter.toProtocol(newAirbyteCatalog)); + CatalogConverter.toConfiguredProtocol(newAirbyteCatalog)); breakingChange = containsBreakingChange(catalogDiff); } } @@ -602,7 +602,7 @@ private void resetStreamsIfNeeded(final WebBackendConnectionUpdate webBackendCon CatalogConverter.getFieldSelectionData(oldConnectionRead.getSyncCatalog())); final AirbyteCatalog upToDateAirbyteCatalog = updatedConnectionRead.getSyncCatalog(); final CatalogDiff catalogDiff = - connectionsHandler.getDiff(apiExistingCatalog, upToDateAirbyteCatalog, CatalogConverter.toProtocol(upToDateAirbyteCatalog)); + connectionsHandler.getDiff(apiExistingCatalog, upToDateAirbyteCatalog, CatalogConverter.toConfiguredProtocol(upToDateAirbyteCatalog)); final List apiStreamsToReset = getStreamsToReset(catalogDiff); final Set changedConfigStreamDescriptors = connectionsHandler.getConfigurationDiff(apiExistingCatalog, upToDateAirbyteCatalog); diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java b/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java index 8864c1b8130fb..6cf626f381b47 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java +++ b/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java @@ -48,7 +48,7 @@ private static io.airbyte.api.model.generated.AirbyteStream toApi(final io.airby } @SuppressWarnings("PMD.AvoidLiteralsInIfCondition") - private static io.airbyte.protocol.models.AirbyteStream toProtocol(final AirbyteStream stream, AirbyteStreamConfiguration config) + private static io.airbyte.protocol.models.AirbyteStream toConfiguredProtocol(final AirbyteStream stream, AirbyteStreamConfiguration config) throws JsonValidationException { if (config.getFieldSelectionEnabled() != null && config.getFieldSelectionEnabled()) { // Validate the selected field paths. @@ -173,7 +173,8 @@ private static Boolean getStreamHasFieldSelectionEnabled(FieldSelectionData fiel /** * Converts the API catalog model into a protocol catalog. Note: returns all streams, regardless of * selected status. See - * {@link CatalogConverter#toProtocol(AirbyteStream, AirbyteStreamConfiguration)} for context. + * {@link CatalogConverter#toConfiguredProtocol(AirbyteStream, AirbyteStreamConfiguration)} for + * context. * * @param catalog api catalog * @return protocol catalog @@ -183,7 +184,35 @@ public static io.airbyte.protocol.models.ConfiguredAirbyteCatalog toProtocolKeep throws JsonValidationException { final AirbyteCatalog clone = Jsons.clone(catalog); clone.getStreams().forEach(stream -> stream.getConfig().setSelected(true)); - return toProtocol(clone); + return toConfiguredProtocol(clone); + } + + /** + * To convert AirbyteCatalog from APIs to model. This is to differentiate between + * toConfiguredProtocol as the other one converts to ConfiguredAirbyteCatalog object instead. + */ + public static io.airbyte.protocol.models.AirbyteCatalog toProtocol( + final io.airbyte.api.model.generated.AirbyteCatalog catalog) + throws JsonValidationException { + final ArrayList errors = new ArrayList<>(); + + io.airbyte.protocol.models.AirbyteCatalog protoCatalog = + new io.airbyte.protocol.models.AirbyteCatalog(); + var airbyteStream = catalog.getStreams().stream().map(stream -> { + try { + return toConfiguredProtocol(stream.getStream(), stream.getConfig()); + } catch (JsonValidationException e) { + LOGGER.error("Error parsing catalog: {}", e); + errors.add(e); + return null; + } + }).collect(Collectors.toList()); + + if (!errors.isEmpty()) { + throw errors.get(0); + } + protoCatalog.withStreams(airbyteStream); + return protoCatalog; } /** @@ -196,7 +225,7 @@ public static io.airbyte.protocol.models.ConfiguredAirbyteCatalog toProtocolKeep * @param catalog api catalog * @return protocol catalog */ - public static io.airbyte.protocol.models.ConfiguredAirbyteCatalog toProtocol(final io.airbyte.api.model.generated.AirbyteCatalog catalog) + public static io.airbyte.protocol.models.ConfiguredAirbyteCatalog toConfiguredProtocol(final io.airbyte.api.model.generated.AirbyteCatalog catalog) throws JsonValidationException { final ArrayList errors = new ArrayList<>(); final List streams = catalog.getStreams() @@ -205,7 +234,7 @@ public static io.airbyte.protocol.models.ConfiguredAirbyteCatalog toProtocol(fin .map(s -> { try { return new io.airbyte.protocol.models.ConfiguredAirbyteStream() - .withStream(toProtocol(s.getStream(), s.getConfig())) + .withStream(toConfiguredProtocol(s.getStream(), s.getConfig())) .withSyncMode(Enums.convertTo(s.getConfig().getSyncMode(), io.airbyte.protocol.models.SyncMode.class)) .withCursorField(s.getConfig().getCursorField()) .withDestinationSyncMode(Enums.convertTo(s.getConfig().getDestinationSyncMode(), diff --git a/airbyte-server/src/test/java/io/airbyte/server/converters/CatalogConverterTest.java b/airbyte-server/src/test/java/io/airbyte/server/converters/CatalogConverterTest.java index 59602b2e72634..d9d41bda7ec4a 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/converters/CatalogConverterTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/converters/CatalogConverterTest.java @@ -28,7 +28,8 @@ class CatalogConverterTest { @Test void testConvertToProtocol() throws JsonValidationException { - assertEquals(ConnectionHelpers.generateBasicConfiguredAirbyteCatalog(), CatalogConverter.toProtocol(ConnectionHelpers.generateBasicApiCatalog())); + assertEquals(ConnectionHelpers.generateBasicConfiguredAirbyteCatalog(), + CatalogConverter.toConfiguredProtocol(ConnectionHelpers.generateBasicApiCatalog())); } @Test @@ -49,7 +50,7 @@ void testConvertToProtocolColumnSelectionValidation() { // fieldSelectionEnabled=true but selectedFields=null. final var catalog = ConnectionHelpers.generateBasicApiCatalog(); catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).selectedFields(null); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); assertThrows(JsonValidationException.class, () -> { @@ -57,14 +58,14 @@ void testConvertToProtocolColumnSelectionValidation() { final var catalog = ConnectionHelpers.generateBasicApiCatalog(); ((ObjectNode) catalog.getStreams().get(0).getStream().getJsonSchema()).remove("properties"); catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).addSelectedFieldsItem(new SelectedFieldInfo().addFieldPathItem("foo")); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); assertThrows(JsonValidationException.class, () -> { // SelectedFieldInfo with empty path. final var catalog = ConnectionHelpers.generateBasicApiCatalog(); catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).addSelectedFieldsItem(new SelectedFieldInfo()); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); assertThrows(UnsupportedOperationException.class, () -> { @@ -72,14 +73,14 @@ void testConvertToProtocolColumnSelectionValidation() { final var catalog = ConnectionHelpers.generateBasicApiCatalog(); catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true) .addSelectedFieldsItem(new SelectedFieldInfo().addFieldPathItem("foo").addFieldPathItem("bar")); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); assertThrows(JsonValidationException.class, () -> { // SelectedFieldInfo with empty path. final var catalog = ConnectionHelpers.generateBasicApiCatalog(); catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).addSelectedFieldsItem(new SelectedFieldInfo().addFieldPathItem("foo")); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); assertThrows(JsonValidationException.class, () -> { @@ -88,7 +89,7 @@ void testConvertToProtocolColumnSelectionValidation() { catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).addSelectedFieldsItem(new SelectedFieldInfo().addFieldPathItem(FIELD_NAME)); // The sync mode is INCREMENTAL and SECOND_FIELD_NAME is a cursor field. catalog.getStreams().get(0).getConfig().syncMode(SyncMode.INCREMENTAL).cursorField(List.of(SECOND_FIELD_NAME)); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); assertDoesNotThrow(() -> { @@ -97,7 +98,7 @@ void testConvertToProtocolColumnSelectionValidation() { catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).addSelectedFieldsItem(new SelectedFieldInfo().addFieldPathItem(FIELD_NAME)); // The cursor field is not selected, but it's okay because it's FULL_REFRESH so it doesn't throw. catalog.getStreams().get(0).getConfig().syncMode(SyncMode.FULL_REFRESH).cursorField(List.of(SECOND_FIELD_NAME)); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); assertThrows(JsonValidationException.class, () -> { @@ -106,7 +107,7 @@ void testConvertToProtocolColumnSelectionValidation() { catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).addSelectedFieldsItem(new SelectedFieldInfo().addFieldPathItem(FIELD_NAME)); // The destination sync mode is DEDUP and SECOND_FIELD_NAME is a primary key. catalog.getStreams().get(0).getConfig().destinationSyncMode(DestinationSyncMode.APPEND_DEDUP).primaryKey(List.of(List.of(SECOND_FIELD_NAME))); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); assertDoesNotThrow(() -> { @@ -115,7 +116,7 @@ void testConvertToProtocolColumnSelectionValidation() { catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).addSelectedFieldsItem(new SelectedFieldInfo().addFieldPathItem(FIELD_NAME)); // The primary key is not selected but that's okay because the destination sync mode is OVERWRITE. catalog.getStreams().get(0).getConfig().destinationSyncMode(DestinationSyncMode.OVERWRITE).primaryKey(List.of(List.of(SECOND_FIELD_NAME))); - CatalogConverter.toProtocol(catalog); + CatalogConverter.toConfiguredProtocol(catalog); }); } @@ -123,7 +124,7 @@ void testConvertToProtocolColumnSelectionValidation() { void testConvertToProtocolFieldSelection() throws JsonValidationException { final var catalog = ConnectionHelpers.generateApiCatalogWithTwoFields(); catalog.getStreams().get(0).getConfig().fieldSelectionEnabled(true).addSelectedFieldsItem(new SelectedFieldInfo().addFieldPathItem(FIELD_NAME)); - assertEquals(ConnectionHelpers.generateBasicConfiguredAirbyteCatalog(), CatalogConverter.toProtocol(catalog)); + assertEquals(ConnectionHelpers.generateBasicConfiguredAirbyteCatalog(), CatalogConverter.toConfiguredProtocol(catalog)); } } diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceHandlerTest.java index 758bad37f9095..61a27553bea37 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceHandlerTest.java @@ -15,11 +15,13 @@ import com.google.common.collect.Lists; import io.airbyte.api.model.generated.ConnectionRead; import io.airbyte.api.model.generated.ConnectionReadList; +import io.airbyte.api.model.generated.DiscoverCatalogResult; import io.airbyte.api.model.generated.SourceCloneConfiguration; import io.airbyte.api.model.generated.SourceCloneRequestBody; import io.airbyte.api.model.generated.SourceCreate; import io.airbyte.api.model.generated.SourceDefinitionIdRequestBody; import io.airbyte.api.model.generated.SourceDefinitionSpecificationRead; +import io.airbyte.api.model.generated.SourceDiscoverSchemaWriteRequestBody; import io.airbyte.api.model.generated.SourceIdRequestBody; import io.airbyte.api.model.generated.SourceRead; import io.airbyte.api.model.generated.SourceReadList; @@ -36,8 +38,13 @@ import io.airbyte.config.persistence.SecretsRepositoryWriter; import io.airbyte.config.persistence.split_secrets.JsonSecretsProcessor; import io.airbyte.persistence.job.factory.OAuthConfigSupplier; +import io.airbyte.protocol.models.AirbyteCatalog; +import io.airbyte.protocol.models.CatalogHelpers; import io.airbyte.protocol.models.ConnectorSpecification; +import io.airbyte.protocol.models.Field; +import io.airbyte.protocol.models.JsonSchemaType; import io.airbyte.server.converters.ConfigurationUpdate; +import io.airbyte.server.handlers.helpers.CatalogConverter; import io.airbyte.server.helpers.ConnectionHelpers; import io.airbyte.server.helpers.ConnectorSpecificationHelpers; import io.airbyte.server.helpers.SourceHelpers; @@ -67,6 +74,11 @@ class SourceHandlerTest { private ConnectorSpecification connectorSpecification; private OAuthConfigSupplier oAuthConfigSupplier; + private static final String SHOES = "shoes"; + private static final String SKU = "sku"; + private static final AirbyteCatalog airbyteCatalog = CatalogHelpers.createAirbyteCatalog(SHOES, + Field.of(SKU, JsonSchemaType.STRING)); + // needs to match name of file in src/test/resources/icons private static final String ICON = "test-source.svg"; @@ -369,4 +381,20 @@ void testDeleteSource() throws JsonValidationException, ConfigNotFoundException, verify(connectionsHandler).deleteConnection(connectionRead.getConnectionId()); } + @Test + void testWriteDiscoverCatalogResult() throws JsonValidationException, IOException { + UUID actorId = UUID.randomUUID(); + UUID catalogId = UUID.randomUUID(); + String connectorVersion = "0.0.1"; + String hashValue = "0123456789abcd"; + SourceDiscoverSchemaWriteRequestBody request = new SourceDiscoverSchemaWriteRequestBody().catalog( + CatalogConverter.toApi(airbyteCatalog)).sourceId(actorId).connectorVersion(connectorVersion).configurationHash(hashValue); + + when(configRepository.writeActorCatalogFetchEvent(airbyteCatalog, actorId, connectorVersion, hashValue)).thenReturn(catalogId); + DiscoverCatalogResult result = sourceHandler.writeDiscoverCatalogResult(request); + + verify(configRepository).writeActorCatalogFetchEvent(airbyteCatalog, actorId, connectorVersion, hashValue); + assert (result.getCatalogId()).equals(catalogId); + } + } diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java b/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java index 0103d8f0f5fdf..abf564dee15aa 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java @@ -1016,7 +1016,7 @@ void testUpdateConnectionNoStreamsToReset() throws JsonValidationException, Conf final ConnectionIdRequestBody connectionId = new ConnectionIdRequestBody().connectionId(result.getConnectionId()); verify(connectionsHandler).getDiff(expected.getSyncCatalog(), expectedWithNewSchema.getSyncCatalog(), - CatalogConverter.toProtocol(result.getSyncCatalog())); + CatalogConverter.toConfiguredProtocol(result.getSyncCatalog())); verify(connectionsHandler).getConfigurationDiff(expected.getSyncCatalog(), expectedWithNewSchema.getSyncCatalog()); verify(schedulerHandler, times(0)).resetConnection(connectionId); verify(schedulerHandler, times(0)).syncConnection(connectionId); diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index 7489b2e65eefd..147055182ed25 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -274,6 +274,7 @@

    Internal

  • post /v1/jobs/get_normalization_status
  • post /v1/attempt/save_stats
  • post /v1/attempt/set_workflow_in_attempt
  • +
  • post /v1/sources/write_discover_catalog_result
  • Jobs

    SourceDefinition


    +
    +
    + Up +
    post /v1/sources/write_discover_catalog_result
    +
    Should only called from worker, to write result from discover activity back to DB. (writeDiscoverCatalogResult)
    +
    + + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • application/json
    • +
    + +

    Request body

    +
    +
    SourceDiscoverSchemaWriteRequestBody SourceDiscoverSchemaWriteRequestBody (required)
    + +
    Body Parameter
    + +
    + + + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "catalogId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
    +}
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Successful Operation + DiscoverCatalogResult +
    +

    Jobs


    +
    +
    + Up +
    post /v1/sources/write_discover_catalog_result
    +
    Should only called from worker, to write result from discover activity back to DB. (writeDiscoverCatalogResult)
    +
    + + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • application/json
    • +
    + +

    Request body

    +
    +
    SourceDiscoverSchemaWriteRequestBody SourceDiscoverSchemaWriteRequestBody (required)
    + +
    Body Parameter
    + +
    + + + + +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    {
    +  "catalogId" : "046b6c7f-0b8a-43b9-b35d-6489e6daee91"
    +}
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Successful Operation + DiscoverCatalogResult +
    +

    SourceDefinition

    +
    +

    DiscoverCatalogResult - Up

    +
    +
    +
    catalogId
    UUID format: uuid
    +
    +
    +
    +

    SourceDiscoverSchemaWriteRequestBody - Up

    +
    to write this requested object to database.
    +
    +
    catalog
    +
    sourceId (optional)
    UUID format: uuid
    +
    connectorVersion (optional)
    +
    configurationHash (optional)
    +
    +

    SourceIdRequestBody - Up

    From ab8e4b5998869d4e64acae02182cb65054357f1a Mon Sep 17 00:00:00 2001 From: Catherine Noll Date: Mon, 23 Jan 2023 14:20:56 -0500 Subject: [PATCH 036/195] [Low Code CDK] Pass DeclarativeStream's `name` into DefaultSchemaLoader options (#21658) --- .../parsers/model_to_component_factory.py | 5 ++- .../test_model_to_component_factory.py | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py index b8a307ce799c0..ca5e46d79c6c6 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py @@ -359,7 +359,10 @@ def create_declarative_stream(model: DeclarativeStreamModel, config: Config, **k if model.schema_loader: schema_loader = _create_component_from_model(model=model.schema_loader, config=config) else: - schema_loader = DefaultSchemaLoader(config=config, options=model.options) + options = model.options or {} + if "name" not in options: + options["name"] = model.name + schema_loader = DefaultSchemaLoader(config=config, options=options) transformations = [] if model.transformations: diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py b/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py index ab01d46692b38..9c3abb9acd0fe 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/parsers/test_model_to_component_factory.py @@ -1011,3 +1011,37 @@ def test_add_fields(self): ) ] assert stream.transformations == expected + + def test_default_schema_loader(self): + component_definition = { + "type": "DeclarativeStream", + "name": "test", + "primary_key": [], + "retriever": { + "type": "SimpleRetriever", + "name": "test", + "primary_key": [], + "requester": { + "type": "HttpRequester", + "name": "test", + "url_base": "http://localhost:6767/", + "path": "items/", + "request_options_provider": { + "request_parameters": {}, + "request_headers": {}, + "request_body_json": {}, + "type": "InterpolatedRequestOptionsProvider", + }, + "authenticator": {"type": "BearerAuthenticator", "api_token": "{{ config['api_key'] }}"}, + }, + "record_selector": {"type": "RecordSelector", "extractor": {"type": "DpathExtractor", "field_pointer": ["items"]}}, + "paginator": {"type": "NoPagination"}, + }, + } + resolved_manifest = resolver.preprocess_manifest(component_definition) + propagated_source_config = ManifestComponentTransformer().propagate_types_and_options("", resolved_manifest, {}) + stream = factory.create_component( + model_type=DeclarativeStreamModel, component_definition=propagated_source_config, config=input_config + ) + schema_loader = stream.schema_loader + assert schema_loader.default_loader._get_json_filepath().split("/")[-1] == f"{stream.name}.json" From 39ec49b9da3c29a0954f83ae8b9b6ea7a5060415 Mon Sep 17 00:00:00 2001 From: Joe Bell Date: Mon, 23 Jan 2023 11:24:28 -0800 Subject: [PATCH 037/195] remove failing line (#21740) Co-authored-by: Topher Lubaway --- .../io/airbyte/integrations/destination/s3/S3BaseChecksTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/airbyte-integrations/bases/base-java-s3/src/test/java/io/airbyte/integrations/destination/s3/S3BaseChecksTest.java b/airbyte-integrations/bases/base-java-s3/src/test/java/io/airbyte/integrations/destination/s3/S3BaseChecksTest.java index 6f08faa683e30..08e6eecd65108 100644 --- a/airbyte-integrations/bases/base-java-s3/src/test/java/io/airbyte/integrations/destination/s3/S3BaseChecksTest.java +++ b/airbyte-integrations/bases/base-java-s3/src/test/java/io/airbyte/integrations/destination/s3/S3BaseChecksTest.java @@ -46,7 +46,6 @@ public void attemptWriteAndDeleteS3Object_should_createSpecificFiles() { S3BaseChecks.attemptS3WriteAndDelete(operations, config, "test/bucket/path"); - verify(s3Client).putObject("test_bucket", "test/bucket/path/", ""); verify(s3Client).putObject(eq("test_bucket"), startsWith("test/bucket/path/_airbyte_connection_test_"), anyString()); verify(s3Client).listObjects(ArgumentMatchers.argThat(request -> "test_bucket".equals(request.getBucketName()))); verify(s3Client).deleteObject(eq("test_bucket"), startsWith("test/bucket/path/_airbyte_connection_test_")); From 1fba39a6bf166238626aa2d31038cfe47ea55c45 Mon Sep 17 00:00:00 2001 From: Anne <102554163+alovew@users.noreply.github.com> Date: Mon, 23 Jan 2023 11:41:44 -0800 Subject: [PATCH 038/195] Uncomment auto detect schema (#21731) --- .../workers/config/ActivityBeanFactory.java | 4 +- .../temporal/sync/SyncWorkflowImpl.java | 56 ++++++++++--------- .../temporal/sync/SyncWorkflowTest.java | 48 ++++++++-------- 3 files changed, 56 insertions(+), 52 deletions(-) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/config/ActivityBeanFactory.java b/airbyte-workers/src/main/java/io/airbyte/workers/config/ActivityBeanFactory.java index b66dfa5cfd741..6e9b5be2333c4 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/config/ActivityBeanFactory.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/config/ActivityBeanFactory.java @@ -112,10 +112,10 @@ public List syncActivities( final PersistStateActivity persistStateActivity, final NormalizationSummaryCheckActivity normalizationSummaryCheckActivity, final WebhookOperationActivity webhookOperationActivity, - // final ConfigFetchActivity configFetchActivity, + final ConfigFetchActivity configFetchActivity, final RefreshSchemaActivity refreshSchemaActivity) { return List.of(replicationActivity, normalizationActivity, dbtTransformationActivity, persistStateActivity, normalizationSummaryCheckActivity, - webhookOperationActivity, /* configFetchActivity, */ refreshSchemaActivity); + webhookOperationActivity, configFetchActivity, refreshSchemaActivity); } @Singleton diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java index c839a8a28f237..0aa8eb8e9dc61 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java @@ -12,6 +12,7 @@ import static io.airbyte.metrics.lib.ApmTraceConstants.WORKFLOW_TRACE_OPERATION_NAME; import datadog.trace.api.Trace; +import io.airbyte.api.client.model.generated.ConnectionStatus; import io.airbyte.commons.temporal.scheduling.SyncWorkflow; import io.airbyte.config.NormalizationInput; import io.airbyte.config.NormalizationSummary; @@ -21,12 +22,16 @@ import io.airbyte.config.StandardSyncOperation; import io.airbyte.config.StandardSyncOperation.OperatorType; import io.airbyte.config.StandardSyncOutput; +import io.airbyte.config.StandardSyncSummary; +import io.airbyte.config.StandardSyncSummary.ReplicationStatus; +import io.airbyte.config.SyncStats; import io.airbyte.config.WebhookOperationSummary; import io.airbyte.metrics.lib.ApmTraceUtils; import io.airbyte.persistence.job.models.IntegrationLauncherConfig; import io.airbyte.persistence.job.models.JobRunConfig; import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; import io.airbyte.workers.temporal.annotations.TemporalActivityStub; +import io.airbyte.workers.temporal.scheduling.activities.ConfigFetchActivity; import io.temporal.workflow.Workflow; import java.util.Map; import java.util.Optional; @@ -57,10 +62,10 @@ public class SyncWorkflowImpl implements SyncWorkflow { private NormalizationSummaryCheckActivity normalizationSummaryCheckActivity; @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") private WebhookOperationActivity webhookOperationActivity; - // @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") - // private RefreshSchemaActivity refreshSchemaActivity; - // @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") - // private ConfigFetchActivity configFetchActivity; + @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") + private RefreshSchemaActivity refreshSchemaActivity; + @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") + private ConfigFetchActivity configFetchActivity; @Trace(operationName = WORKFLOW_TRACE_OPERATION_NAME) @Override @@ -79,28 +84,27 @@ public StandardSyncOutput run(final JobRunConfig jobRunConfig, final int version = Workflow.getVersion(VERSION_LABEL, Workflow.DEFAULT_VERSION, CURRENT_VERSION); final String taskQueue = Workflow.getInfo().getTaskQueue(); - // final int autoDetectSchemaVersion = - // Workflow.getVersion(AUTO_DETECT_SCHEMA_TAG, Workflow.DEFAULT_VERSION, - // AUTO_DETECT_SCHEMA_VERSION); - // - // if (autoDetectSchemaVersion >= AUTO_DETECT_SCHEMA_VERSION) { - // final Optional sourceId = configFetchActivity.getSourceId(connectionId); - // - // if (!sourceId.isEmpty() && refreshSchemaActivity.shouldRefreshSchema(sourceId.get())) { - // LOGGER.info("Refreshing source schema..."); - // refreshSchemaActivity.refreshSchema(sourceId.get(), connectionId); - // } - // - // final Optional status = configFetchActivity.getStatus(connectionId); - // if (!status.isEmpty() && ConnectionStatus.INACTIVE == status.get()) { - // LOGGER.info("Connection is disabled. Cancelling run."); - // final StandardSyncOutput output = - // new StandardSyncOutput() - // .withStandardSyncSummary(new - // StandardSyncSummary().withStatus(ReplicationStatus.CANCELLED).withTotalStats(new SyncStats())); - // return output; - // } - // } + final int autoDetectSchemaVersion = + Workflow.getVersion(AUTO_DETECT_SCHEMA_TAG, Workflow.DEFAULT_VERSION, + AUTO_DETECT_SCHEMA_VERSION); + + if (autoDetectSchemaVersion >= AUTO_DETECT_SCHEMA_VERSION) { + final Optional sourceId = configFetchActivity.getSourceId(connectionId); + + if (!sourceId.isEmpty() && refreshSchemaActivity.shouldRefreshSchema(sourceId.get())) { + LOGGER.info("Refreshing source schema..."); + refreshSchemaActivity.refreshSchema(sourceId.get(), connectionId); + } + + final Optional status = configFetchActivity.getStatus(connectionId); + if (!status.isEmpty() && ConnectionStatus.INACTIVE == status.get()) { + LOGGER.info("Connection is disabled. Cancelling run."); + final StandardSyncOutput output = + new StandardSyncOutput() + .withStandardSyncSummary(new StandardSyncSummary().withStatus(ReplicationStatus.CANCELLED).withTotalStats(new SyncStats())); + return output; + } + } StandardSyncOutput syncOutput = replicationActivity.replicate(jobRunConfig, sourceLauncherConfig, destinationLauncherConfig, syncInput, taskQueue); diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java index 5c73bf469afa1..9a39dd0b9a827 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java @@ -229,8 +229,8 @@ void testSuccess() { verifyNormalize(normalizationActivity, normalizationInput); verifyDbtTransform(dbtTransformationActivity, syncInput.getResourceRequirements(), operatorDbtInput); - // verifyShouldRefreshSchema(refreshSchemaActivity); - // verifyRefreshSchema(refreshSchemaActivity, sync); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); assertEquals( replicationSuccessOutput.withNormalizationSummary(normalizationSummary).getStandardSyncSummary(), actualOutput.getStandardSyncSummary()); @@ -246,8 +246,8 @@ void testReplicationFailure() { assertThrows(WorkflowFailedException.class, this::execute); - // verifyShouldRefreshSchema(refreshSchemaActivity); - // verifyRefreshSchema(refreshSchemaActivity, sync); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyNoInteractions(persistStateActivity); verifyNoInteractions(normalizationActivity); @@ -269,8 +269,8 @@ void testReplicationFailedGracefully() { final StandardSyncOutput actualOutput = execute(); - // verifyShouldRefreshSchema(refreshSchemaActivity); - // verifyRefreshSchema(refreshSchemaActivity, sync); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyPersistState(persistStateActivity, sync, replicationFailOutput, syncInput.getCatalog()); verifyNormalize(normalizationActivity, normalizationInput); @@ -296,8 +296,8 @@ void testNormalizationFailure() { assertThrows(WorkflowFailedException.class, this::execute); - // verifyShouldRefreshSchema(refreshSchemaActivity); - // verifyRefreshSchema(refreshSchemaActivity, sync); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyPersistState(persistStateActivity, sync, replicationSuccessOutput, syncInput.getCatalog()); verifyNormalize(normalizationActivity, normalizationInput); @@ -317,8 +317,8 @@ void testCancelDuringReplication() { assertThrows(WorkflowFailedException.class, this::execute); - // verifyShouldRefreshSchema(refreshSchemaActivity); - // verifyRefreshSchema(refreshSchemaActivity, sync); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyNoInteractions(persistStateActivity); verifyNoInteractions(normalizationActivity); @@ -343,8 +343,8 @@ void testCancelDuringNormalization() { assertThrows(WorkflowFailedException.class, this::execute); - // verifyShouldRefreshSchema(refreshSchemaActivity); - // verifyRefreshSchema(refreshSchemaActivity, sync); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyPersistState(persistStateActivity, sync, replicationSuccessOutput, syncInput.getCatalog()); verifyNormalize(normalizationActivity, normalizationInput); @@ -368,8 +368,8 @@ void testSkipNormalization() { execute(); - // verifyShouldRefreshSchema(refreshSchemaActivity); - // verifyRefreshSchema(refreshSchemaActivity, sync); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); verifyReplication(replicationActivity, syncInput); verifyPersistState(persistStateActivity, sync, replicationSuccessOutputNoRecordsCommitted, syncInput.getCatalog()); verifyNoInteractions(normalizationActivity); @@ -396,16 +396,16 @@ void testWebhookOperation() { assertEquals(actualOutput.getWebhookOperationSummary().getSuccesses().get(0), WEBHOOK_CONFIG_ID); } - // @Test - // void testSkipReplicationAfterRefreshSchema() { - // when(configFetchActivity.getStatus(any())).thenReturn(Optional.of(ConnectionStatus.INACTIVE)); - // final StandardSyncOutput output = execute(); - // verifyShouldRefreshSchema(refreshSchemaActivity); - // verifyRefreshSchema(refreshSchemaActivity, sync); - // verifyNoInteractions(replicationActivity); - // verifyNoInteractions(normalizationActivity); - // assertEquals(output.getStandardSyncSummary().getStatus(), ReplicationStatus.CANCELLED); - // } + @Test + void testSkipReplicationAfterRefreshSchema() { + when(configFetchActivity.getStatus(any())).thenReturn(Optional.of(ConnectionStatus.INACTIVE)); + final StandardSyncOutput output = execute(); + verifyShouldRefreshSchema(refreshSchemaActivity); + verifyRefreshSchema(refreshSchemaActivity, sync); + verifyNoInteractions(replicationActivity); + verifyNoInteractions(normalizationActivity); + assertEquals(output.getStandardSyncSummary().getStatus(), ReplicationStatus.CANCELLED); + } @SuppressWarnings("ResultOfMethodCallIgnored") private void cancelWorkflow() { From 828b32a3a26f7f3b34ffd9abbe4daeb4be247dbf Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Mon, 23 Jan 2023 21:10:23 +0100 Subject: [PATCH 039/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=94=A7=20Migrate?= =?UTF-8?q?=20from=20react-scripts=20to=20Vite=20(#21421)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Migrate to Vite * Continue work on vite migration * More environment fixes * Add CSP headers to dev server * Remove react-scripts * Shim process.env * Cleanup * Create ESLint failure for CI test * create vite-plugins package * Update nodeJS * Make eslint warnings fail build * Remove trailing empty line in nvmrc * Match package.json with nvmrc * Fix eslint test breakage * Revert node upgrade * Remove setupProxy script * Change default API endpoints to be http --- airbyte-webapp/build.gradle | 10 +- airbyte-webapp/craco.config.js | 26 - airbyte-webapp/{public => }/index.html | 11 +- airbyte-webapp/package-lock.json | 5822 ++++++++++++----- airbyte-webapp/package.json | 27 +- .../packages/vite-plugins/doc-middleware.ts | 27 + airbyte-webapp/packages/vite-plugins/index.ts | 2 + .../vite-plugins/patch-react-virtualized.ts | 29 + .../CatalogTree/next/BulkEditPanel.test.tsx | 2 +- airbyte-webapp/src/config/defaultConfig.ts | 4 +- airbyte-webapp/src/config/types.ts | 1 - .../hooks/services/Feature/FeatureService.tsx | 4 + airbyte-webapp/src/hooks/useSegment.tsx | 2 + airbyte-webapp/src/react-app-env.d.ts | 1 - airbyte-webapp/src/setupProxy.js | 24 - airbyte-webapp/src/types/react-app-env.d.ts | 1 - airbyte-webapp/src/types/rehype-urls.d.ts | 1 - .../src/views/common/StoreProvider.tsx | 6 +- airbyte-webapp/src/vite-env.d.ts | 1 + airbyte-webapp/tsconfig.json | 5 +- airbyte-webapp/vite.config.ts | 81 + 21 files changed, 4459 insertions(+), 1628 deletions(-) delete mode 100644 airbyte-webapp/craco.config.js rename airbyte-webapp/{public => }/index.html (68%) create mode 100644 airbyte-webapp/packages/vite-plugins/doc-middleware.ts create mode 100644 airbyte-webapp/packages/vite-plugins/index.ts create mode 100644 airbyte-webapp/packages/vite-plugins/patch-react-virtualized.ts delete mode 100644 airbyte-webapp/src/react-app-env.d.ts delete mode 100644 airbyte-webapp/src/setupProxy.js delete mode 100644 airbyte-webapp/src/types/react-app-env.d.ts create mode 100644 airbyte-webapp/src/vite-env.d.ts create mode 100644 airbyte-webapp/vite.config.ts diff --git a/airbyte-webapp/build.gradle b/airbyte-webapp/build.gradle index 0d58b5218d043..5fd9ee0dce4be 100644 --- a/airbyte-webapp/build.gradle +++ b/airbyte-webapp/build.gradle @@ -106,16 +106,8 @@ task copyNginx(type: Copy) { into "build/docker/bin/nginx" } -task stylelint(type: NpmTask) { - dependsOn npmInstall - args = ['run', 'stylelint'] - inputs.files commonConfigs - inputs.file '.stylelintrc' - inputs.dir 'src' -} - // Those tasks should be run as part of the "check" task -check.dependsOn validateLinks, licenseCheck, test, stylelint +check.dependsOn validateLinks, licenseCheck, test build.dependsOn buildStorybook diff --git a/airbyte-webapp/craco.config.js b/airbyte-webapp/craco.config.js deleted file mode 100644 index 45bea2176cf52..0000000000000 --- a/airbyte-webapp/craco.config.js +++ /dev/null @@ -1,26 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const MiniCssExtractPlugin = require("mini-css-extract-plugin"); - -module.exports = { - webpack: { - configure: (webpackConfig) => { - webpackConfig = { - ...webpackConfig, - plugins: [ - ...webpackConfig.plugins.filter((element) => { - if (element.options) { - return !element.options.hasOwnProperty("ignoreOrder"); - } - return true; - }), - new MiniCssExtractPlugin({ - ignoreOrder: true, - filename: "static/css/[name].[contenthash:8].css", - chunkFilename: "static/css/[name].[contenthash:8].chunk.css", - }), - ], - }; - return webpackConfig; - }, - }, -}; diff --git a/airbyte-webapp/public/index.html b/airbyte-webapp/index.html similarity index 68% rename from airbyte-webapp/public/index.html rename to airbyte-webapp/index.html index b04f783d9e6e1..1389418021201 100644 --- a/airbyte-webapp/public/index.html +++ b/airbyte-webapp/index.html @@ -2,7 +2,7 @@ - + - - - + + + Airbyte
    + diff --git a/airbyte-webapp/package-lock.json b/airbyte-webapp/package-lock.json index 01f3d90ec7da9..e3aa44e3f9af0 100644 --- a/airbyte-webapp/package-lock.json +++ b/airbyte-webapp/package-lock.json @@ -73,7 +73,6 @@ "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", - "@craco/craco": "^7.0.0-alpha.7", "@storybook/addon-essentials": "^6.5.7", "@storybook/builder-webpack5": "^6.5.7", "@storybook/manager-webpack5": "^6.5.7", @@ -105,14 +104,16 @@ "@types/unist": "^2.0.5", "@typescript-eslint/eslint-plugin": "^5.27.1", "@typescript-eslint/parser": "^5.27.1", + "@vitejs/plugin-basic-ssl": "^1.0.1", + "@vitejs/plugin-react": "^3.0.1", "babel-jest": "^29.3.1", "dotenv": "^16.0.3", - "eslint-config-prettier": "^8.5.0", + "eslint-config-prettier": "^8.6.0", "eslint-config-react-app": "^7.0.1", "eslint-plugin-css-modules": "^2.11.0", "eslint-plugin-jest": "^26.5.3", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-unused-imports": "^2.0.0", "express": "^4.18.1", "husky": "^8.0.1", @@ -120,11 +121,11 @@ "jest-environment-jsdom": "^29.3.1", "license-checker": "^25.0.1", "lint-staged": "^12.3.7", - "mini-css-extract-plugin": "^2.6.1", + "meow": "^9.0.0", "node-fetch": "^2.6.7", + "optionator": "^0.9.1", "orval": "^6.11.0-alpha.10", "prettier": "^2.6.2", - "react-scripts": "^5.0.1", "react-select-event": "^5.5.0", "storybook-addon-mock": "^2.4.1", "stylelint": "^14.9.1", @@ -136,7 +137,11 @@ "timezone-mock": "^1.3.4", "tmpl": "^1.0.5", "ts-node": "^10.8.1", - "typescript": "^4.7.3" + "typescript": "^4.7.3", + "vite": "^4.0.4", + "vite-plugin-checker": "^0.5.3", + "vite-plugin-svgr": "^2.4.0", + "vite-tsconfig-paths": "^4.0.3" }, "engines": { "node": "16.18.1" @@ -1732,6 +1737,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.13.tgz", "integrity": "sha512-qmzKVTn46Upvtxv8LQoQ8mTCdUC83AOVQIQm57e9oekLT5cmK9GOMOfcWhe8jMNx4UJXn/UDhVZ/7lGofVNeDQ==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1788,6 +1794,36 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", + "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", @@ -2326,24 +2362,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", - "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", - "dev": true, + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", + "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -2433,119 +2456,6 @@ "node": ">=0.1.90" } }, - "node_modules/@craco/craco": { - "version": "7.0.0-alpha.7", - "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-7.0.0-alpha.7.tgz", - "integrity": "sha512-3RU+Ur1GvBQKDBL1JhssSgazc8s3pMAgndyS+95UaXdMTuozpI9h4k4OokQRRjiLmr7i0y39l6fBZvknGj2i1w==", - "dev": true, - "dependencies": { - "autoprefixer": "^10.4.7", - "cosmiconfig": "^7.0.1", - "cosmiconfig-typescript-loader": "^2.0.2", - "cross-spawn": "^7.0.3", - "lodash": "^4.17.21", - "semver": "^7.3.7", - "webpack-merge": "^5.8.0" - }, - "bin": { - "craco": "dist/bin/craco.js" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "react-scripts": "^5.0.0" - } - }, - "node_modules/@craco/craco/node_modules/autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/@craco/craco/node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@craco/craco/node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "peer": true, - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@craco/craco/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2562,7 +2472,8 @@ "version": "12.0.0", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@datadog/browser-core": { "version": "4.21.2", @@ -2767,6 +2678,150 @@ "node": ">=12" } }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-loong64": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", @@ -2783,11 +2838,188 @@ "node": ">=12" } }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, + "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2808,6 +3040,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, + "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -2823,6 +3056,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "peer": true, "engines": { "node": ">= 4" } @@ -2832,6 +3066,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -3745,6 +3980,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, + "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -3758,7 +3994,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@ibm-cloud/openapi-ruleset": { "version": "0.37.3", @@ -6230,6 +6467,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -6274,6 +6512,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", "dev": true, + "peer": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -6294,6 +6533,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6303,6 +6543,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, + "peer": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -7927,6 +8168,12 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "node_modules/@storybook/builder-webpack4/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/@storybook/builder-webpack4/node_modules/enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -8347,6 +8594,23 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/@storybook/builder-webpack4/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@storybook/builder-webpack4/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -8535,18 +8799,6 @@ "integrity": "sha512-j11XSuRuAlft6vLDEX4RvhqC0KxNxx6QIyMXNb0vHHSNPXTPeiy3algESWmOOIzEtiEL0qiowPU3ewW9hHVa7Q==", "dev": true }, - "node_modules/@storybook/builder-webpack5/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/@storybook/builder-webpack5/node_modules/clean-css": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", @@ -8991,24 +9243,6 @@ "node": ">=6" } }, - "node_modules/@storybook/builder-webpack5/node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@storybook/builder-webpack5/node_modules/terser-webpack-plugin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", @@ -9043,12 +9277,6 @@ } } }, - "node_modules/@storybook/builder-webpack5/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz", @@ -9608,6 +9836,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@storybook/core-common/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/@storybook/core-common/node_modules/enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -10066,6 +10300,23 @@ "node": ">=8" } }, + "node_modules/@storybook/core-common/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@storybook/core-common/node_modules/terser-webpack-plugin": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", @@ -10880,6 +11131,23 @@ "node": ">=8" } }, + "node_modules/@storybook/core-server/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@storybook/core-server/node_modules/terser-webpack-plugin": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", @@ -10903,6 +11171,12 @@ "webpack": "^4.0.0" } }, + "node_modules/@storybook/core-server/node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/@storybook/core-server/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -11396,6 +11670,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@storybook/manager-webpack4/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/@storybook/manager-webpack4/node_modules/enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -11842,6 +12122,23 @@ "node": ">=8" } }, + "node_modules/@storybook/manager-webpack4/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@storybook/manager-webpack4/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -12021,18 +12318,6 @@ "integrity": "sha512-j11XSuRuAlft6vLDEX4RvhqC0KxNxx6QIyMXNb0vHHSNPXTPeiy3algESWmOOIzEtiEL0qiowPU3ewW9hHVa7Q==", "dev": true }, - "node_modules/@storybook/manager-webpack5/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/@storybook/manager-webpack5/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -12617,24 +12902,6 @@ "node": ">=6" } }, - "node_modules/@storybook/manager-webpack5/node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@storybook/manager-webpack5/node_modules/terser-webpack-plugin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", @@ -12669,12 +12936,6 @@ } } }, - "node_modules/@storybook/manager-webpack5/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/@storybook/manager-webpack5/node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -13797,6 +14058,7 @@ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, + "peer": true, "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", @@ -13809,6 +14071,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5" }, @@ -13824,6 +14087,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -13863,6 +14127,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -13876,6 +14141,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -13889,6 +14155,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -13902,6 +14169,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -13915,6 +14183,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -13928,6 +14197,7 @@ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", "dev": true, + "peer": true, "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", @@ -13951,6 +14221,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", "dev": true, + "peer": true, "dependencies": { "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", @@ -13969,6 +14240,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, + "peer": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -13985,6 +14257,7 @@ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.12.6" }, @@ -14001,6 +14274,7 @@ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@svgr/babel-preset": "^5.5.0", @@ -14020,6 +14294,7 @@ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", "dev": true, + "peer": true, "dependencies": { "cosmiconfig": "^7.0.0", "deepmerge": "^4.2.2", @@ -14038,6 +14313,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, + "peer": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -14054,6 +14330,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -14063,6 +14340,7 @@ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/plugin-transform-react-constant-elements": "^7.12.1", @@ -14086,6 +14364,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5" }, @@ -14101,6 +14380,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, + "peer": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -14175,15 +14455,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/@testing-library/dom/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -14276,15 +14547,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@testing-library/jest-dom/node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/@testing-library/jest-dom/node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -14444,6 +14706,7 @@ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, + "peer": true, "engines": { "node": ">=10.13.0" } @@ -14530,6 +14793,7 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, + "peer": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -14540,6 +14804,7 @@ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -14549,6 +14814,7 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -14558,6 +14824,7 @@ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", "dev": true, + "peer": true, "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -14616,6 +14883,7 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", "dev": true, + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -14628,6 +14896,7 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -14687,6 +14956,7 @@ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -14816,7 +15086,8 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/minimatch": { "version": "3.0.3", @@ -14894,7 +15165,8 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/qs": { "version": "6.9.6", @@ -14916,7 +15188,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/react": { "version": "17.0.39", @@ -15035,6 +15308,7 @@ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -15043,7 +15317,8 @@ "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/sanitize-html": { "version": "2.6.2", @@ -15069,6 +15344,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", "dev": true, + "peer": true, "dependencies": { "@types/express": "*" } @@ -15078,6 +15354,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dev": true, + "peer": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -15088,6 +15365,7 @@ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -15140,7 +15418,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/uglify-js": { "version": "3.12.0", @@ -15235,6 +15514,7 @@ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -15823,6 +16103,58 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.1.tgz", + "integrity": "sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.7", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -16192,6 +16524,7 @@ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", "dev": true, + "peer": true, "dependencies": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", @@ -16221,6 +16554,7 @@ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, + "peer": true, "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -16234,6 +16568,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5" }, @@ -16249,6 +16584,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, + "peer": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -16501,7 +16837,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/argparse": { "version": "2.0.1", @@ -16509,18 +16846,48 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/aria-query/node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", "dev": true, "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, - "engines": { - "node": ">=6.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aria-query/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -16561,18 +16928,19 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -16627,14 +16995,15 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16785,6 +17154,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.14" } @@ -16851,19 +17221,68 @@ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.2.tgz", + "integrity": "sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/axobject-query/node_modules/deep-equal": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axobject-query/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "node_modules/babel-jest": { @@ -17266,6 +17685,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", "dev": true, + "peer": true, "peerDependencies": { "@babel/core": "^7.1.0" } @@ -17562,7 +17982,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true + "dev": true, + "peer": true }, "node_modules/better-opn": { "version": "2.1.1", @@ -17597,6 +18018,7 @@ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", "dev": true, + "peer": true, "dependencies": { "bluebird": "^3.5.5", "check-types": "^11.1.1", @@ -17716,6 +18138,7 @@ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, + "peer": true, "dependencies": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", @@ -17901,7 +18324,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true + "dev": true, + "peer": true }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -18053,7 +18477,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/buffer-xor": { "version": "1.0.3", @@ -18066,6 +18491,7 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true, + "peer": true, "engines": { "node": ">=6" }, @@ -18316,27 +18742,50 @@ } }, "node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, - "optional": true, "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" + } + }, + "node_modules/camelcase-keys/node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/camelize": { @@ -18349,6 +18798,7 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, + "peer": true, "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -18467,7 +18917,8 @@ "version": "11.1.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/chokidar": { "version": "3.5.3", @@ -18782,6 +19233,7 @@ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, + "peer": true, "dependencies": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -18896,6 +19348,7 @@ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, + "peer": true, "engines": { "node": ">=4.0.0" } @@ -19018,6 +19471,7 @@ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true, + "peer": true, "engines": { "node": ">=0.8" } @@ -19203,41 +19657,6 @@ "node": ">=8" } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz", - "integrity": "sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7", - "ts-node": "^10.8.1" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "typescript": ">=3" - } - }, - "node_modules/cosmiconfig-typescript-loader/node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/cp-file": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", @@ -19629,6 +20048,7 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -19704,6 +20124,7 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -19715,7 +20136,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/css-to-react-native": { "version": "3.0.0", @@ -19732,6 +20154,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, + "peer": true, "dependencies": { "mdn-data": "2.0.4", "source-map": "^0.6.1" @@ -19745,6 +20168,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -19759,6 +20183,7 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true, + "peer": true, "engines": { "node": ">= 6" }, @@ -19776,7 +20201,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/cssesc": { "version": "3.0.0", @@ -19795,6 +20221,7 @@ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, + "peer": true, "dependencies": { "css-tree": "^1.1.2" }, @@ -19807,6 +20234,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", "dev": true, + "peer": true, "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -19819,13 +20247,15 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "dev": true, + "peer": true }, "node_modules/csso/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -20127,6 +20557,7 @@ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dev": true, + "peer": true, "dependencies": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -20171,6 +20602,186 @@ "node": ">=0.10.0" } }, + "node_modules/default-browser-id/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "optional": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "optional": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "optional": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "optional": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "optional": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "optional": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "optional": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "optional": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "optional": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser-id/node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -20263,7 +20874,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true + "dev": true, + "peer": true }, "node_modules/degenerator": { "version": "3.0.2", @@ -20401,6 +21013,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true, + "peer": true, "engines": { "node": ">= 0.6" } @@ -20503,6 +21116,7 @@ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "dev": true, + "peer": true, "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" @@ -20520,6 +21134,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -20528,7 +21143,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "dev": true, + "peer": true }, "node_modules/detect-port/node_modules/debug": { "version": "2.6.9", @@ -20550,6 +21166,7 @@ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", "dev": true, + "peer": true, "dependencies": { "acorn-node": "^1.6.1", "defined": "^1.0.0", @@ -20576,7 +21193,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/diff": { "version": "5.1.0", @@ -20628,19 +21246,22 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true + "dev": true, + "peer": true }, "node_modules/dns-packet": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, + "peer": true, "dependencies": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -20651,6 +21272,7 @@ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, + "peer": true, "dependencies": { "buffer-indexof": "^1.0.0" } @@ -20695,6 +21317,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, + "peer": true, "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -20710,7 +21333,8 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "peer": true }, "node_modules/dom-walk": { "version": "0.1.2", @@ -20732,7 +21356,8 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/domexception": { "version": "4.0.0", @@ -20776,6 +21401,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, + "peer": true, "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -20816,7 +21442,8 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/duplexify": { "version": "3.7.1", @@ -20871,6 +21498,7 @@ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", "dev": true, + "peer": true, "dependencies": { "jake": "^10.8.5" }, @@ -21159,6 +21787,15 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -21673,6 +22310,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", "dev": true, + "peer": true, "dependencies": { "@eslint/eslintrc": "^1.0.5", "@humanwhocodes/config-array": "^0.9.2", @@ -21721,9 +22359,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -22005,23 +22643,26 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", "dev": true, "dependencies": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", "semver": "^6.3.0" }, "engines": { @@ -22038,15 +22679,15 @@ "dev": true }, "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.0.0" }, "peerDependencies": { "eslint": ">=7.28.0", @@ -22223,6 +22864,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -22238,6 +22880,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22254,6 +22897,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -22265,13 +22909,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -22284,6 +22930,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -22297,6 +22944,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true, + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -22306,6 +22954,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -22315,6 +22964,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -22327,6 +22977,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, + "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -22342,6 +22993,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -22351,6 +23003,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -22363,6 +23016,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -22375,6 +23029,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, + "peer": true, "dependencies": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", @@ -22389,6 +23044,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -22401,6 +23057,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true, + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -22423,6 +23080,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -22435,6 +23093,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -23319,6 +23978,7 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", "dev": true, + "peer": true, "dependencies": { "minimatch": "^5.0.1" } @@ -23328,6 +23988,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -23337,6 +23998,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -23349,6 +24011,7 @@ "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -23546,6 +24209,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "peer": true, "engines": { "node": ">=4.0" }, @@ -23555,6 +24219,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -23817,6 +24490,7 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, + "peer": true, "engines": { "node": "*" }, @@ -24146,7 +24820,8 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/get-package-type": { "version": "0.1.0", @@ -24431,6 +25106,12 @@ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "node_modules/gonzales-pe": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", @@ -24446,6 +25127,18 @@ "node": ">=0.6.0" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -24457,6 +25150,7 @@ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, + "peer": true, "dependencies": { "duplexer": "^0.1.2" }, @@ -24471,7 +25165,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/handlebars": { "version": "4.7.7", @@ -24516,7 +25211,8 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/has": { "version": "1.0.3", @@ -24922,6 +25618,7 @@ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", "dev": true, + "peer": true, "engines": { "node": ">= 6.0.0" } @@ -24937,6 +25634,7 @@ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, + "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -24949,6 +25647,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -24964,6 +25663,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -25016,6 +25716,38 @@ "node": ">= 6" } }, + "node_modules/html-minifier-terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-minifier-terser/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/html-tags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", @@ -25130,7 +25862,8 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true + "dev": true, + "peer": true }, "node_modules/http-errors": { "version": "2.0.0", @@ -25170,13 +25903,15 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "peer": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -25475,6 +26210,7 @@ "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", "dev": true, + "peer": true, "dependencies": { "harmony-reflect": "^1.4.6" }, @@ -25756,12 +26492,13 @@ } }, "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -25770,6 +26507,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -25880,10 +26631,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -26036,7 +26790,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true + "dev": true, + "peer": true }, "node_modules/is-negative-zero": { "version": "2.0.2", @@ -26078,6 +26833,7 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -26096,6 +26852,7 @@ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -26105,6 +26862,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -26160,6 +26918,7 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -26169,6 +26928,7 @@ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -26233,6 +26993,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -26246,6 +27025,15 @@ "dev": true, "optional": true }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -26258,6 +27046,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-whitespace-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", @@ -26457,6 +27258,7 @@ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, + "peer": true, "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -26475,6 +27277,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -26489,13 +27292,15 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -26512,6 +27317,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -26523,13 +27329,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jake/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -26539,6 +27347,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -28070,6 +28879,7 @@ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/source-map": "^27.5.1", @@ -28098,6 +28908,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -28115,6 +28926,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, + "peer": true, "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", @@ -28130,6 +28942,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", @@ -28147,6 +28960,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", @@ -28161,6 +28975,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dev": true, + "peer": true, "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", @@ -28175,6 +28990,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", @@ -28190,6 +29006,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", @@ -28216,6 +29033,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -28232,6 +29050,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, + "peer": true, "dependencies": { "@sinonjs/commons": "^1.7.0" } @@ -28241,6 +29060,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -28250,6 +29070,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -28265,6 +29086,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -28287,6 +29109,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "peer": true, "engines": { "node": ">=8" } @@ -28296,6 +29119,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -28307,13 +29131,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jest-jasmine2/node_modules/expect": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -28329,6 +29155,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -28338,6 +29165,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -28354,6 +29182,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -28380,6 +29209,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -28400,6 +29230,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" @@ -28413,6 +29244,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", "dev": true, + "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -28422,6 +29254,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -28455,6 +29288,7 @@ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -28468,6 +29302,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", @@ -28501,6 +29336,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -28518,6 +29354,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -28532,6 +29369,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -28547,6 +29385,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -28562,6 +29401,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -28571,6 +29411,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -29038,6 +29879,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -29081,6 +29923,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -29097,6 +29940,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -29106,6 +29950,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -29121,6 +29966,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -29143,6 +29989,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "peer": true, "engines": { "node": ">=8" } @@ -29152,6 +29999,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -29163,13 +30011,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -29179,6 +30029,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -29205,6 +30056,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", "dev": true, + "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -29214,6 +30066,7 @@ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -29227,6 +30080,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -29244,6 +30098,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -29258,6 +30113,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -29273,6 +30129,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -30511,6 +31368,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", @@ -30528,6 +31386,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -30544,6 +31403,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -30553,6 +31413,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -30568,6 +31429,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -30584,6 +31446,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -30595,13 +31458,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -30611,6 +31476,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -31088,7 +31954,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/json-schema-ref-parser": { "version": "5.1.3", @@ -31144,7 +32011,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "dev": true, + "peer": true }, "node_modules/json2mq": { "version": "0.2.0", @@ -31732,13 +32600,15 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true + "dev": true, + "peer": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/lodash.omit": { "version": "4.5.0", @@ -31752,11 +32622,18 @@ "integrity": "sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==", "dev": true }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true + "dev": true, + "peer": true }, "node_modules/lodash.throttle": { "version": "4.1.1", @@ -32657,7 +33534,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/mdurl": { "version": "1.0.1", @@ -32759,149 +33637,83 @@ } }, "node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, - "optional": true, "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "optional": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "optional": true, "dependencies": { - "repeating": "^2.0.0" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/meow/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "optional": true, "dependencies": { - "pinkie-promise": "^2.0.0" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/meow/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "node_modules/meow/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, - "optional": true, "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "dev": true, - "optional": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "lru-cache": "^6.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "dev": true, - "optional": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/meow/node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "optional": true, - "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meow/node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", - "dev": true, - "optional": true, - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge-descriptors": { @@ -33963,6 +34775,7 @@ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dev": true, + "peer": true, "dependencies": { "schema-utils": "^4.0.0" }, @@ -33982,6 +34795,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -33998,6 +34812,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -34009,13 +34824,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "peer": true }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -34274,6 +35091,7 @@ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, + "peer": true, "dependencies": { "dns-packet": "^1.3.1", "thunky": "^1.0.2" @@ -34286,7 +35104,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true + "dev": true, + "peer": true }, "node_modules/nan": { "version": "2.16.0", @@ -34671,6 +35490,7 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -34713,6 +35533,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, + "peer": true, "dependencies": { "boolbase": "~1.0.0" } @@ -34900,6 +35721,7 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", "dev": true, + "peer": true, "engines": { "node": ">= 6" } @@ -34914,12 +35736,12 @@ } }, "node_modules/object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" }, "engines": { @@ -34969,28 +35791,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -35073,7 +35895,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/on-finished": { "version": "2.4.1", @@ -35825,7 +36648,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "dev": true, + "peer": true }, "node_modules/picocolors": { "version": "1.0.0", @@ -35867,7 +36691,7 @@ "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "optional": true, "engines": { @@ -35877,7 +36701,7 @@ "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "optional": true, "dependencies": { @@ -35913,6 +36737,7 @@ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dev": true, + "peer": true, "dependencies": { "find-up": "^3.0.0" }, @@ -35925,6 +36750,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -35937,6 +36763,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -35950,6 +36777,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -35962,6 +36790,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -36020,6 +36849,7 @@ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dev": true, + "peer": true, "dependencies": { "async": "^2.6.2", "debug": "^3.1.1", @@ -36034,6 +36864,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -36078,6 +36909,7 @@ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", "dev": true, + "peer": true, "dependencies": { "lilconfig": "^2.0.4", "yaml": "^1.10.2" @@ -36333,6 +37165,7 @@ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, + "peer": true, "engines": { "node": ">=6" }, @@ -36425,6 +37258,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "dev": true, + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -36693,6 +37527,7 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true, + "peer": true, "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" @@ -36779,6 +37614,7 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -36791,6 +37627,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "dev": true, + "peer": true, "dependencies": { "performance-now": "^2.1.0" } @@ -36938,6 +37775,7 @@ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", "dev": true, + "peer": true, "dependencies": { "core-js": "^3.19.2", "object-assign": "^4.1.1", @@ -36985,6 +37823,7 @@ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -37020,6 +37859,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -37035,6 +37875,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -37051,6 +37892,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -37062,13 +37904,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-dev-utils/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -37081,6 +37925,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -37097,6 +37942,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -37106,6 +37952,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", "dev": true, + "peer": true, "engines": { "node": ">= 12.13.0" } @@ -37115,6 +37962,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -37130,6 +37978,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -37145,6 +37994,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -37160,6 +38010,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -37269,7 +38120,8 @@ "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-fast-compare": { "version": "2.0.4", @@ -37767,6 +38619,7 @@ "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -37840,6 +38693,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -37857,6 +38711,7 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^27.5.1", "@jest/reporters": "^27.5.1", @@ -37904,6 +38759,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, + "peer": true, "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", @@ -37919,6 +38775,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", @@ -37936,6 +38793,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", @@ -37950,6 +38808,7 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", "dev": true, + "peer": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.5.1", @@ -37994,6 +38853,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -38003,6 +38863,7 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", "dev": true, + "peer": true, "dependencies": { "@sinclair/typebox": "^0.24.1" }, @@ -38015,6 +38876,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dev": true, + "peer": true, "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", @@ -38029,6 +38891,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -38038,6 +38901,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", @@ -38053,6 +38917,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", "dev": true, + "peer": true, "dependencies": { "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", @@ -38068,6 +38933,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", @@ -38094,6 +38960,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -38103,6 +38970,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -38119,6 +38987,7 @@ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz", "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==", "dev": true, + "peer": true, "dependencies": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -38169,6 +39038,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, + "peer": true, "dependencies": { "@sinonjs/commons": "^1.7.0" } @@ -38177,13 +39047,15 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-scripts/node_modules/@types/yargs": { "version": "16.0.5", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -38193,6 +39065,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -38205,6 +39078,7 @@ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, + "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -38215,6 +39089,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -38227,6 +39102,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -38242,6 +39118,7 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", "dev": true, + "peer": true, "dependencies": { "browserslist": "^4.19.1", "caniuse-lite": "^1.0.30001297", @@ -38269,6 +39146,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", "dev": true, + "peer": true, "dependencies": { "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", @@ -38291,6 +39169,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", "dev": true, + "peer": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -38306,6 +39185,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", "dev": true, + "peer": true, "dependencies": { "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" @@ -38322,6 +39202,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -38344,6 +39225,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "peer": true, "engines": { "node": ">=8" } @@ -38353,6 +39235,7 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.3.tgz", "integrity": "sha512-qjywD7LvpZJ5+E16lf00GnMVUX5TEVBcKW1/vtGPgAerHwRwE4JP4p1Y40zbLnup2ZfWsd30P2bHdoAKH93XxA==", "dev": true, + "peer": true, "dependencies": { "source-map": "~0.6.0" }, @@ -38365,6 +39248,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -38374,6 +39258,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -38385,13 +39270,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-scripts/node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, + "peer": true, "engines": { "node": ">= 12" } @@ -38401,6 +39288,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, + "peer": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -38417,6 +39305,7 @@ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.2.tgz", "integrity": "sha512-hOb1LFjRR+8ocA071xUSmg5VslJ8NGo/I2qpUpdeAYyBVCgupS5O8SEVo4SxEMYyFBNodBkzG3T1iqW9HCXxew==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.8" }, @@ -38435,6 +39324,7 @@ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", "dev": true, + "peer": true, "dependencies": { "timsort": "^0.3.0" }, @@ -38450,6 +39340,7 @@ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.3.tgz", "integrity": "sha512-0gDYWEKaGacwxCqvQ3Ypg6wGdD1AztbMm5h1JsactG2hP2eiflj808QITmuWBpE7sjSEVrAlZhPTVd/nNMj/hQ==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.8" }, @@ -38468,6 +39359,7 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dev": true, + "peer": true, "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.2.15", @@ -38494,6 +39386,7 @@ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", "dev": true, + "peer": true, "dependencies": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", @@ -38532,6 +39425,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -38548,6 +39442,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -38560,6 +39455,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -38579,6 +39475,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -38588,6 +39485,7 @@ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", "dev": true, + "peer": true, "bin": { "css-prefers-color-scheme": "dist/cli.cjs" }, @@ -38603,6 +39501,7 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dev": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^5.1.0", @@ -38619,6 +39518,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, + "peer": true, "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -38632,6 +39532,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -38641,6 +39542,7 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true, + "peer": true, "engines": { "node": ">= 6" }, @@ -38653,6 +39555,7 @@ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.16.tgz", "integrity": "sha512-ryhRI9/B9VFCwPbb1z60LLK5/ldoExi7nwdnJzpkLZkm2/r7j2X3jfY+ZvDVJhC/0fPZlrAguYdHNFg0iglPKQ==", "dev": true, + "peer": true, "dependencies": { "cssnano-preset-default": "^5.1.11", "lilconfig": "^2.0.3", @@ -38674,6 +39577,7 @@ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.11.tgz", "integrity": "sha512-ETet5hqHxmzQq2ynXMOQofKuLm7VOjMiOB7E2zdtm/hSeCKlD9fabzIUV4GoPcRyJRHi+4kGf0vsfGYbQ4nmPw==", "dev": true, + "peer": true, "dependencies": { "css-declaration-sorter": "^6.0.3", "cssnano-utils": "^3.0.1", @@ -38717,6 +39621,7 @@ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.1.tgz", "integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==", "dev": true, + "peer": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -38728,13 +39633,15 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-scripts/node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, + "peer": true, "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -38749,6 +39656,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -38758,6 +39666,7 @@ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, + "peer": true, "dependencies": { "execa": "^5.0.0" }, @@ -38770,6 +39679,7 @@ "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, + "peer": true, "dependencies": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -38792,6 +39702,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, + "peer": true, "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -38811,13 +39722,15 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "peer": true }, "node_modules/react-scripts/node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, + "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -38830,6 +39743,7 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -38839,6 +39753,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, + "peer": true, "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -38853,6 +39768,7 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -38862,6 +39778,7 @@ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -38874,6 +39791,7 @@ "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz", "integrity": "sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==", "dev": true, + "peer": true, "dependencies": { "@types/eslint": "^7.28.2", "jest-worker": "^27.3.1", @@ -38898,6 +39816,7 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -38913,6 +39832,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "peer": true, "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -38925,6 +39845,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -38941,6 +39862,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -38953,6 +39875,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -38962,6 +39885,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, + "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -38973,13 +39897,15 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-scripts/node_modules/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, + "peer": true, "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -39001,6 +39927,7 @@ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, + "peer": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -39024,6 +39951,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", "dev": true, + "peer": true, "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -39043,6 +39971,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -39055,6 +39984,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "peer": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -39067,6 +39997,7 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true, + "peer": true, "engines": { "node": ">= 10" } @@ -39076,6 +40007,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -39085,6 +40017,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, + "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -39110,6 +40043,7 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "execa": "^5.0.0", @@ -39124,6 +40058,7 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -39154,6 +40089,7 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", "dev": true, + "peer": true, "dependencies": { "@jest/core": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -39188,6 +40124,7 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.8.0", "@jest/test-sequencer": "^27.5.1", @@ -39231,6 +40168,7 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", "dev": true, + "peer": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -39243,6 +40181,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -39259,6 +40198,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -39277,6 +40217,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -39294,6 +40235,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -39320,6 +40262,7 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", "dev": true, + "peer": true, "dependencies": { "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" @@ -39333,6 +40276,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -39353,6 +40297,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*" @@ -39366,6 +40311,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", "dev": true, + "peer": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -39375,6 +40321,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "jest-regex-util": "^27.5.1", @@ -39389,6 +40336,7 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^27.5.1", "@jest/environment": "^27.5.1", @@ -39421,6 +40369,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", "dev": true, + "peer": true, "dependencies": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -39454,6 +40403,7 @@ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -39467,6 +40417,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dev": true, + "peer": true, "dependencies": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", @@ -39500,6 +40451,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -39517,6 +40469,7 @@ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", "dev": true, + "peer": true, "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", @@ -39538,6 +40491,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -39555,6 +40509,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -39564,6 +40519,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^28.1.3", "@jest/types": "^28.1.3", @@ -39579,6 +40535,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", "dev": true, + "peer": true, "dependencies": { "@jest/schemas": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -39596,6 +40553,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", "dev": true, + "peer": true, "dependencies": { "@types/yargs-parser": "*" } @@ -39605,6 +40563,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -39617,6 +40576,7 @@ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -39629,6 +40589,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^28.1.3", @@ -39649,6 +40610,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -39658,6 +40620,7 @@ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", "dev": true, + "peer": true, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } @@ -39667,6 +40630,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -39684,6 +40648,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", "dev": true, + "peer": true, "dependencies": { "@jest/test-result": "^28.1.3", "@jest/types": "^28.1.3", @@ -39703,6 +40668,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "peer": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -39716,6 +40682,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -39728,6 +40695,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", "dev": true, + "peer": true, "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -39743,6 +40711,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -39755,6 +40724,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", "dev": true, + "peer": true, "dependencies": { "char-regex": "^2.0.0", "strip-ansi": "^7.0.1" @@ -39771,6 +40741,7 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", "dev": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -39780,6 +40751,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -39795,6 +40767,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -39807,6 +40780,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", "dev": true, + "peer": true, "dependencies": { "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", @@ -39825,6 +40799,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -39839,6 +40814,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -39854,6 +40830,7 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, + "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -39900,6 +40877,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -39920,13 +40898,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-scripts/node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5" }, @@ -39942,6 +40922,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, + "peer": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -39956,6 +40937,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -39970,13 +40952,15 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-scripts/node_modules/node-forge": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", "dev": true, + "peer": true, "engines": { "node": ">= 6.13.0" } @@ -39986,6 +40970,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, + "peer": true, "dependencies": { "boolbase": "^1.0.0" }, @@ -39998,6 +40983,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -40013,6 +40999,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -40028,6 +41015,7 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, + "peer": true, "dependencies": { "@types/retry": "^0.12.0", "retry": "^0.13.1" @@ -40041,6 +41029,7 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dev": true, + "peer": true, "dependencies": { "nanoid": "^3.1.30", "picocolors": "^1.0.0", @@ -40059,6 +41048,7 @@ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.2" }, @@ -40071,6 +41061,7 @@ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", "dev": true, + "peer": true, "engines": { "node": ">=8" }, @@ -40084,6 +41075,7 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.3.tgz", "integrity": "sha512-EGM2EBBWqP57N0E7N7WOLT116PJ39dwHVU01WO4XPPQLJfkL2xVgkMZ+TZvCfapj/uJH07UEfKHQNPHzSw/14Q==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.0.2" @@ -40097,6 +41089,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.1.tgz", "integrity": "sha512-62OBIXCjRXpQZcFOYIXwXBlpAVWrYk8ek1rcjvMING4Q2cf0ipyN9qT+BhHA6HmftGSEnFQu2qgKO3gMscl3Rw==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40112,6 +41105,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.2.tgz", "integrity": "sha512-gyx8RgqSmGVK156NAdKcsfkY3KPGHhKqvHTL3hhveFrBBToguKFzhyiuk3cljH6L4fJ0Kv+JENuPXs1Wij27Zw==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40127,6 +41121,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40142,6 +41137,7 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.4.tgz", "integrity": "sha512-rYlC5015aNqVQt/B6Cy156g7sH5tRUJGmT9xeagYthtKehetbKx7jHxhyLpulP4bs4vbp8u/B2rac0J7S7qPQg==", "dev": true, + "peer": true, "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", @@ -40160,6 +41156,7 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.3.tgz", "integrity": "sha512-fVkjHm2T0PSMqXUCIhHNWVGjhB9mHEWX2GboVs7j3iCgr6FpIl9c/IdXy0PHWZSQ9LFTRgmj98amxJE6KOnlsA==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40175,6 +41172,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", "dev": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -40187,6 +41185,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.3.tgz", "integrity": "sha512-rtu3otIeY532PnEuuBrIIe+N+pcdbX/7JMZfrcL09wc78YayrHw5E8UkDfvnlOhEUrI4ptCuzXQfj+Or6spbGA==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40202,6 +41201,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -40217,6 +41217,7 @@ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.3.tgz", "integrity": "sha512-qiPm+CNAlgXiMf0J5IbBBEXA9l/Q5HGsNGkL3znIwT2ZFRLGY9U2fTUpa4lqCUXQOxaLimpacHeQC80BD2qbDw==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.8" }, @@ -40232,6 +41233,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.2.tgz", "integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==", "dev": true, + "peer": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -40244,6 +41246,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.2.tgz", "integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==", "dev": true, + "peer": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -40256,6 +41259,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.2.tgz", "integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==", "dev": true, + "peer": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -40268,6 +41272,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.3.tgz", "integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==", "dev": true, + "peer": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -40280,6 +41285,7 @@ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.4.tgz", "integrity": "sha512-qz+s5vhKJlsHw8HjSs+HVk2QGFdRyC68KGRQGX3i+GcnUjhWhXQEmCXW6siOJkZ1giu0ddPwSO6I6JdVVVPoog==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40295,6 +41301,7 @@ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.4.tgz", "integrity": "sha512-0ltahRTPtXSIlEZFv7zIvdEib7HN0ZbUQxrxIKn8KbiRyhALo854I/CggU5lyZe6ZBvSTJ6Al2vkZecI2OhneQ==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40310,6 +41317,7 @@ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", "dev": true, + "peer": true, "peerDependencies": { "postcss": "^8.1.4" } @@ -40319,6 +41327,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.3.tgz", "integrity": "sha512-ozOsg+L1U8S+rxSHnJJiET6dNLyADcPHhEarhhtCI9DBLGOPG/2i4ddVoFch9LzrBgb8uDaaRI4nuid2OM82ZA==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.8" }, @@ -40334,6 +41343,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.3.tgz", "integrity": "sha512-fk9y2uFS6/Kpp7/A9Hz9Z4rlFQ8+tzgBcQCXAFSrXFGAbKx+4ZZOmmfHuYjCOMegPWoz0pnC6fNzi8j7Xyqp5Q==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.8" }, @@ -40349,6 +41359,7 @@ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "dev": true, + "peer": true, "peerDependencies": { "postcss": "^8.1.0" } @@ -40358,6 +41369,7 @@ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", "dev": true, + "peer": true, "engines": { "node": "^12 || ^14 || >=16" }, @@ -40370,6 +41382,7 @@ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.4.tgz", "integrity": "sha512-BlEo9gSTj66lXjRNByvkMK9dEdEGFXRfGjKRi9fo8s0/P3oEk74cAoonl/utiM50E2OPVb/XSu+lWvdW4KtE/Q==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40385,6 +41398,7 @@ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", "dev": true, + "peer": true, "peerDependencies": { "postcss": "^8.0.0" } @@ -40394,6 +41408,7 @@ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "dev": true, + "peer": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -40413,6 +41428,7 @@ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.3.tgz", "integrity": "sha512-MH4tymWmefdZQ7uVG/4icfLjAQmH6o2NRYyVh2mKoB4RXJp9PjsyhZwhH4ouaCQHvg+qJVj3RzeAR1EQpIlXZA==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40428,6 +41444,7 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, + "peer": true, "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -40450,6 +41467,7 @@ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", "dev": true, + "peer": true, "engines": { "node": "^12 || ^14 || >=16" }, @@ -40462,6 +41480,7 @@ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "dev": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -40474,6 +41493,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.5.tgz", "integrity": "sha512-R2BCPJJ/U2oh1uTWEYn9CcJ7MMcQ1iIbj9wfr2s/zHu5om5MP/ewKdaunpfJqR1WYzqCsgnXuRoVXPAzxdqy8g==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.0.2" @@ -40490,6 +41510,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.5.tgz", "integrity": "sha512-3Oa26/Pb9VOFVksJjFG45SNoe4nhGvJ2Uc6TlRimqF8uhfOCEhVCaJ3rvEat5UFOn2UZqTY5Da8dFgCh3Iq0Ug==", "dev": true, + "peer": true, "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", @@ -40508,6 +41529,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.3.tgz", "integrity": "sha512-bC45rVzEwsLhv/cL1eCjoo2OOjbSk9I7HKFBYnBvtyuIZlf7uMipMATXtA0Fc3jwPo3wuPIW1jRJWKzflMh1sA==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40523,6 +41545,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.5.tgz", "integrity": "sha512-/YjvXs8PepsoiZAIpjstOO4IHKwFAqYNqbA1yVdqklM84tbUUneh6omJxGlRlF3mi6K5Pa067Mg6IwqEnYC8Zg==", "dev": true, + "peer": true, "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.0.1", @@ -40540,6 +41563,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.4.tgz", "integrity": "sha512-Z0vjod9lRZEmEPfEmA2sCfjbfEEFKefMD3RDIQSUfXK4LpCyWkX1CniUgyNvnjJFLDPSxtgKzozhHhPHKoeGkg==", "dev": true, + "peer": true, "dependencies": { "browserslist": "^4.16.6", "cssnano-utils": "^3.0.1", @@ -40557,6 +41581,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.2.tgz", "integrity": "sha512-gpn1nJDMCf3g32y/7kl+jsdamhiYT+/zmEt57RoT9GmzlixBNRPohI7k8UIHelLABhdLf3MSZhtM33xuH5eQOQ==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -40572,6 +41597,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, + "peer": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -40584,6 +41610,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, + "peer": true, "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -40601,6 +41628,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -40616,6 +41644,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "peer": true, "dependencies": { "icss-utils": "^5.0.0" }, @@ -40631,6 +41660,7 @@ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.6" }, @@ -40650,6 +41680,7 @@ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.8" }, @@ -40665,6 +41696,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", "dev": true, + "peer": true, "dependencies": { "@csstools/normalize.css": "*", "postcss-browser-comments": "^4", @@ -40683,6 +41715,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.2.tgz", "integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==", "dev": true, + "peer": true, "engines": { "node": "^10 || ^12 || >=14.0" }, @@ -40695,6 +41728,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz", "integrity": "sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40710,6 +41744,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.3.tgz", "integrity": "sha512-U+rmhjrNBvIGYqr/1tD4wXPFFMKUbXsYXvlUCzLi0tOCUS6LoeEAnmVXXJY/MEB/1CKZZwBSs2tmzGawcygVBA==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40725,6 +41760,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.3.tgz", "integrity": "sha512-uk1+xYx0AMbA3nLSNhbDrqbf/rx+Iuq5tVad2VNyaxxJzx79oGieJ6D9F6AfOL2GtiIbP7vTYlpYHtG+ERFXTg==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40740,6 +41776,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.3.tgz", "integrity": "sha512-Mf2V4JbIDboNGQhW6xW0YREDiYXoX3WrD3EjKkjvnpAJ6W4qqjLnK/c9aioyVFaWWHVdP5zVRw/9DI5S3oLDFw==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40755,6 +41792,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz", "integrity": "sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40770,6 +41808,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.3.tgz", "integrity": "sha512-uNC7BmS/7h6to2UWa4RFH8sOTzu2O9dVWPE/F9Vm9GdhONiD/c1kNaCLbmsFHlKWcEx7alNUChQ+jH/QAlqsQw==", "dev": true, + "peer": true, "dependencies": { "browserslist": "^4.16.6", "postcss-value-parser": "^4.2.0" @@ -40786,6 +41825,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz", "integrity": "sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==", "dev": true, + "peer": true, "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" @@ -40802,6 +41842,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.3.tgz", "integrity": "sha512-333JWRnX655fSoUbufJ10HJop3c8mrpKkCCUnEmgz/Cb/QEtW+/TMZwDAUt4lnwqP6tCCk0x0b58jqvDgiQm/A==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40817,6 +41858,7 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.4.tgz", "integrity": "sha512-taKtGDZtyYUMVYkg+MuJeBUiTF6cGHZmo/qcW7ibvW79UlyKuSHbo6dpCIiqI+j9oJsXWzP+ovIxoyLDOeQFdw==", "dev": true, + "peer": true, "dependencies": { "cssnano-utils": "^3.0.1", "postcss-value-parser": "^4.2.0" @@ -40833,6 +41875,7 @@ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", "dev": true, + "peer": true, "engines": { "node": "^12 || ^14 || >=16" }, @@ -40845,6 +41888,7 @@ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "dev": true, + "peer": true, "peerDependencies": { "postcss": "^8" } @@ -40854,6 +41898,7 @@ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.3.tgz", "integrity": "sha512-tDQ3m+GYoOar+KoQgj+pwPAvGHAp/Sby6vrFiyrELrMKQJ4AejL0NcS0mm296OKKYA2SRg9ism/hlT/OLhBrdQ==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40869,6 +41914,7 @@ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", "dev": true, + "peer": true, "dependencies": { "autoprefixer": "^10.4.2", "browserslist": "^4.19.1", @@ -40916,6 +41962,7 @@ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.2.tgz", "integrity": "sha512-CG35J1COUH7OOBgpw5O+0koOLUd5N4vUGKUqSAuIe4GiuLHWU96Pqp+UPC8QITTd12zYAFx76pV7qWT/0Aj/TA==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.8" }, @@ -40931,6 +41978,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz", "integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==", "dev": true, + "peer": true, "dependencies": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0" @@ -40947,6 +41995,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.3.tgz", "integrity": "sha512-yDnTUab5i7auHiNwdcL1f+pBnqQFf+7eC4cbC7D8Lc1FkvNZhtpkdad+9U4wDdFb84haupMf0rA/Zc5LcTe/3A==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -40962,6 +42011,7 @@ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "dev": true, + "peer": true, "peerDependencies": { "postcss": "^8.0.3" } @@ -40971,6 +42021,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", "dev": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0" }, @@ -40983,6 +42034,7 @@ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", "dev": true, + "peer": true, "dependencies": { "postcss-value-parser": "^4.1.0", "svgo": "^2.7.0" @@ -40999,6 +42051,7 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.3.tgz", "integrity": "sha512-V5tX2hadSSn+miVCluuK1IDGy+7jAXSOfRZ2DQ+s/4uQZb/orDYBjH0CHgFrXsRw78p4QTuEFA9kI6C956UnHQ==", "dev": true, + "peer": true, "dependencies": { "postcss-selector-parser": "^6.0.5" }, @@ -41014,6 +42067,7 @@ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -41023,13 +42077,15 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-scripts/node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, + "peer": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -41043,6 +42099,7 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "peer": true, "engines": { "node": ">= 4" } @@ -41052,6 +42109,7 @@ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", "dev": true, + "peer": true, "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -41086,6 +42144,7 @@ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, + "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -41098,6 +42157,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -41116,6 +42176,7 @@ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", "dev": true, + "peer": true, "dependencies": { "node-forge": "^1.2.0" }, @@ -41128,6 +42189,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -41143,6 +42205,7 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -41152,6 +42215,7 @@ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, + "peer": true, "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -41163,6 +42227,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true, + "peer": true, "engines": { "node": ">= 8" } @@ -41172,6 +42237,7 @@ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", "dev": true, + "peer": true, "dependencies": { "abab": "^2.0.5", "iconv-lite": "^0.6.3", @@ -41193,6 +42259,7 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "dev": true, + "peer": true, "engines": { "node": ">= 12.13.0" }, @@ -41209,6 +42276,7 @@ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.2.tgz", "integrity": "sha512-114zeJdOpTrbQYRD4OU5UWJ99LKUaqCPJTU1HQ/n3q3BwmllFN8kHENaLnOeqVq6AhXrWfxHNZTl33iJ4oy3cQ==", "dev": true, + "peer": true, "dependencies": { "browserslist": "^4.16.6", "postcss-selector-parser": "^6.0.4" @@ -41225,6 +42293,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -41237,6 +42306,7 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dev": true, + "peer": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -41258,6 +42328,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "peer": true, "engines": { "node": ">= 10" } @@ -41267,6 +42338,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.17.tgz", "integrity": "sha512-OiHUsmOKQQEg/ocXaLIjk/kOz8EK2jF6iPuc1bQ4NsmhYl7sk70UDsGV02AJvBAAiJhinPCkDR8egT9qY+ulCw==", "dev": true, + "peer": true, "dependencies": { "arg": "^5.0.1", "chalk": "^4.1.2", @@ -41306,33 +42378,17 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } }, - "node_modules/react-scripts/node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/react-scripts/node_modules/terser-webpack-plugin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "dev": true, + "peer": true, "dependencies": { "jest-worker": "^27.4.1", "schema-utils": "^3.1.1", @@ -41367,21 +42423,17 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/react-scripts/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/react-scripts/node_modules/tr46": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, + "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -41408,6 +42460,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -41417,6 +42470,7 @@ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, + "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -41429,6 +42483,7 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, + "peer": true, "engines": { "node": ">=10.4" } @@ -41438,6 +42493,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", "dev": true, + "peer": true, "dependencies": { "colorette": "^2.0.10", "memfs": "^3.2.2", @@ -41461,6 +42517,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -41477,6 +42534,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -41489,6 +42547,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -41508,6 +42567,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", "dev": true, + "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -41559,6 +42619,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -41575,6 +42636,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -41587,6 +42649,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "peer": true, "engines": { "node": ">=12" }, @@ -41599,6 +42662,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -41618,6 +42682,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -41633,6 +42698,7 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "peer": true, "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -41647,6 +42713,7 @@ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, + "peer": true, "dependencies": { "iconv-lite": "0.4.24" } @@ -41656,6 +42723,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -41667,13 +42735,15 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-scripts/node_modules/whatwg-url": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.7.0", "tr46": "^2.1.0", @@ -41687,7 +42757,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/react-select": { "version": "5.4.0", @@ -42092,6 +43163,7 @@ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "dev": true, + "peer": true, "dependencies": { "minimatch": "3.0.4" }, @@ -42205,9 +43277,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.1", @@ -42235,7 +43307,8 @@ "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", @@ -43586,6 +44659,7 @@ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", "dev": true, + "peer": true, "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -43614,6 +44688,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5" }, @@ -43629,6 +44704,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, + "peer": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -43643,6 +44719,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -43738,6 +44815,7 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", @@ -43748,51 +44826,16 @@ "rollup": "^2.0.0" } }, - "node_modules/rollup-plugin-terser/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/rollup-plugin-terser/node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -44252,7 +45295,8 @@ "version": "13.0.0", "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/sass": { "version": "1.52.3", @@ -44279,7 +45323,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/saxes": { "version": "6.0.0", @@ -44335,7 +45380,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true + "dev": true, + "peer": true }, "node_modules/selenium-webdriver": { "version": "4.1.2", @@ -44475,6 +45521,7 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, + "peer": true, "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -44493,6 +45540,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -44502,6 +45550,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, + "peer": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -44516,19 +45565,22 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "dev": true, + "peer": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "dev": true, + "peer": true }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/serve-static": { "version": "1.15.0", @@ -44652,7 +45704,8 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/should": { "version": "13.2.3", @@ -45134,6 +46187,7 @@ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, + "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -45150,6 +46204,7 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, + "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -45324,6 +46379,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true, + "peer": true, "engines": { "node": ">= 0.6" } @@ -45643,6 +46699,7 @@ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, + "peer": true, "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -45677,6 +46734,7 @@ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -46073,32 +47131,6 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, - "node_modules/stylelint/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/stylelint/node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylelint/node_modules/cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -46127,18 +47159,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/stylelint/node_modules/import-lazy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", @@ -46157,59 +47177,6 @@ "node": ">=0.10.0" } }, - "node_modules/stylelint/node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/stylelint/node_modules/postcss": { "version": "8.4.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", @@ -46250,15 +47217,6 @@ "postcss": "^8.3.3" } }, - "node_modules/stylelint/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -46268,42 +47226,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylelint/node_modules/write-file-atomic": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", @@ -46396,6 +47318,7 @@ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", "dev": true, + "peer": true, "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -46423,6 +47346,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -46432,6 +47356,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -46703,6 +47628,7 @@ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -46712,6 +47638,7 @@ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, + "peer": true, "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", @@ -46730,6 +47657,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -46742,6 +47670,7 @@ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "peer": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -46754,20 +47683,21 @@ } }, "node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, "node_modules/terser-webpack-plugin": { @@ -46797,24 +47727,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/terser-webpack-plugin/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/terser-webpack-plugin/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -46857,22 +47769,16 @@ "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "node_modules/terser/node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, "bin": { - "terser": "bin/terser" + "acorn": "bin/acorn" }, "engines": { - "node": ">=10" + "node": ">=0.4.0" } }, "node_modules/terser/node_modules/commander": { @@ -46881,15 +47787,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -46919,7 +47816,8 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/throttle-debounce": { "version": "3.0.1", @@ -46973,7 +47871,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/timers-browserify": { "version": "2.0.12", @@ -46997,6 +47896,13 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true, + "peer": true + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", "dev": true }, "node_modules/tiny-warning": { @@ -47164,13 +48070,12 @@ "dev": true }, "node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, - "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/trim-trailing-lines": { @@ -47197,7 +48102,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/ts-dedent": { "version": "2.1.1", @@ -47646,6 +48552,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "peer": true, "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -47837,7 +48744,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true + "dev": true, + "peer": true }, "node_modules/unset-value": { "version": "1.0.0", @@ -48098,6 +49006,7 @@ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, + "peer": true, "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", @@ -48313,6 +49222,566 @@ "node": ">=4" } }, + "node_modules/vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "dev": true, + "dependencies": { + "esbuild": "^0.16.3", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.5.3.tgz", + "integrity": "sha512-upPESKsQTypC2S7LPjxu9HknOymNSToAAHTYSFHb0at5GKLcN1QGMAR5Hb+7KqZclGMVniXAj7QdhZv+fTx83Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "lodash.debounce": "^4.0.8", + "lodash.pick": "^4.4.0", + "npm-run-path": "^4.0.1", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vite-plugin-checker/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vite-plugin-checker/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vite-plugin-checker/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/vite-plugin-checker/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/vite-plugin-checker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-checker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vite-plugin-svgr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz", + "integrity": "sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.2", + "@svgr/core": "^6.5.1" + }, + "peerDependencies": { + "vite": "^2.6.0 || 3 || 4" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/vite-plugin-svgr/node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "node_modules/vite-plugin-svgr/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vite-plugin-svgr/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.0.3.tgz", + "integrity": "sha512-gRO2Q/tOkV+9kMht5tz90+IaEKvW2zCnvwJV3tp2ruPNZOTM5rF+yXorJT4ggmAMYEaJ3nyXjx5P5jY5FwiZ+A==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.0.1" + }, + "peerDependencies": { + "vite": ">2.0.0-0" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.0.tgz", + "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -48356,12 +49825,91 @@ "node": ">=0.4.0" } }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true, + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageclient/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "dev": true + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, + "peer": true, "dependencies": { "browser-process-hrtime": "^1.0.0" } @@ -48707,6 +50255,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -48860,6 +50409,7 @@ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", "dev": true, + "peer": true, "dependencies": { "tapable": "^2.0.0", "webpack-sources": "^2.2.0" @@ -48876,6 +50426,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -48885,6 +50436,7 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -48894,6 +50446,7 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "dev": true, + "peer": true, "dependencies": { "source-list-map": "^2.0.1", "source-map": "^0.6.1" @@ -48902,19 +50455,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -48979,12 +50519,6 @@ "acorn": "^8" } }, - "node_modules/webpack/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/webpack/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -49068,24 +50602,6 @@ "node": ">=6" } }, - "node_modules/webpack/node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/webpack/node_modules/terser-webpack-plugin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", @@ -49176,7 +50692,8 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/whatwg-mimetype": { "version": "3.0.0", @@ -49231,6 +50748,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -49252,12 +50804,6 @@ "node": ">=8" } }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -49278,6 +50824,7 @@ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.4.2.tgz", "integrity": "sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==", "dev": true, + "peer": true, "dependencies": { "idb": "^6.1.4", "workbox-core": "6.4.2" @@ -49287,13 +50834,15 @@ "version": "6.1.5", "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/workbox-broadcast-update": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.4.2.tgz", "integrity": "sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==", "dev": true, + "peer": true, "dependencies": { "workbox-core": "6.4.2" } @@ -49303,6 +50852,7 @@ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.4.2.tgz", "integrity": "sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==", "dev": true, + "peer": true, "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -49352,6 +50902,7 @@ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz", "integrity": "sha512-JdEazx7qiVqTBzzBl5rolRwl5cmhihjfIcpqRzIZjtT6b18liVmDn/VlWpqW4C/qP2hrFFMLRV1wlex8ZVBPTg==", "dev": true, + "peer": true, "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", @@ -49369,6 +50920,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -49385,6 +50937,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "peer": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -49399,13 +50952,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "peer": true }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, + "peer": true, "dependencies": { "whatwg-url": "^7.0.0" }, @@ -49418,6 +50973,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, + "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -49427,6 +50983,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -49435,13 +50992,15 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/workbox-build/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, + "peer": true, "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -49453,6 +51012,7 @@ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.2.tgz", "integrity": "sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==", "dev": true, + "peer": true, "dependencies": { "workbox-core": "6.4.2" } @@ -49461,13 +51021,15 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.2.tgz", "integrity": "sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/workbox-expiration": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.2.tgz", "integrity": "sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==", "dev": true, + "peer": true, "dependencies": { "idb": "^6.1.4", "workbox-core": "6.4.2" @@ -49477,13 +51039,15 @@ "version": "6.1.5", "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/workbox-google-analytics": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.4.2.tgz", "integrity": "sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==", "dev": true, + "peer": true, "dependencies": { "workbox-background-sync": "6.4.2", "workbox-core": "6.4.2", @@ -49496,6 +51060,7 @@ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.4.2.tgz", "integrity": "sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==", "dev": true, + "peer": true, "dependencies": { "workbox-core": "6.4.2" } @@ -49505,6 +51070,7 @@ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.2.tgz", "integrity": "sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==", "dev": true, + "peer": true, "dependencies": { "workbox-core": "6.4.2", "workbox-routing": "6.4.2", @@ -49516,6 +51082,7 @@ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.4.2.tgz", "integrity": "sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==", "dev": true, + "peer": true, "dependencies": { "workbox-core": "6.4.2" } @@ -49525,6 +51092,7 @@ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.4.2.tgz", "integrity": "sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==", "dev": true, + "peer": true, "dependencies": { "workbox-cacheable-response": "6.4.2", "workbox-core": "6.4.2", @@ -49539,6 +51107,7 @@ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.2.tgz", "integrity": "sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==", "dev": true, + "peer": true, "dependencies": { "workbox-core": "6.4.2" } @@ -49548,6 +51117,7 @@ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.2.tgz", "integrity": "sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==", "dev": true, + "peer": true, "dependencies": { "workbox-core": "6.4.2" } @@ -49557,6 +51127,7 @@ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.4.2.tgz", "integrity": "sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==", "dev": true, + "peer": true, "dependencies": { "workbox-core": "6.4.2", "workbox-routing": "6.4.2" @@ -49566,13 +51137,15 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.4.2.tgz", "integrity": "sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/workbox-webpack-plugin": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.4.2.tgz", "integrity": "sha512-CiEwM6kaJRkx1cP5xHksn13abTzUqMHiMMlp5Eh/v4wRcedgDTyv6Uo8+Hg9MurRbHDosO5suaPyF9uwVr4/CQ==", "dev": true, + "peer": true, "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", @@ -49593,6 +51166,7 @@ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.4.2.tgz", "integrity": "sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==", "dev": true, + "peer": true, "dependencies": { "@types/trusted-types": "^2.0.2", "workbox-core": "6.4.2" @@ -50955,6 +52529,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.12.13.tgz", "integrity": "sha512-qmzKVTn46Upvtxv8LQoQ8mTCdUC83AOVQIQm57e9oekLT5cmK9GOMOfcWhe8jMNx4UJXn/UDhVZ/7lGofVNeDQ==", "dev": true, + "peer": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -50990,6 +52565,24 @@ "@babel/plugin-transform-react-jsx": "^7.18.6" } }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", + "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, "@babel/plugin-transform-react-pure-annotations": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", @@ -51390,21 +52983,11 @@ } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz", - "integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==", - "dev": true, + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", + "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", "requires": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/template": { @@ -51473,71 +53056,6 @@ "dev": true, "optional": true }, - "@craco/craco": { - "version": "7.0.0-alpha.7", - "resolved": "https://registry.npmjs.org/@craco/craco/-/craco-7.0.0-alpha.7.tgz", - "integrity": "sha512-3RU+Ur1GvBQKDBL1JhssSgazc8s3pMAgndyS+95UaXdMTuozpI9h4k4OokQRRjiLmr7i0y39l6fBZvknGj2i1w==", - "dev": true, - "requires": { - "autoprefixer": "^10.4.7", - "cosmiconfig": "^7.0.1", - "cosmiconfig-typescript-loader": "^2.0.2", - "cross-spawn": "^7.0.3", - "lodash": "^4.17.21", - "semver": "^7.3.7", - "webpack-merge": "^5.8.0" - }, - "dependencies": { - "autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", - "dev": true, - "requires": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, - "peer": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -51551,7 +53069,8 @@ "version": "12.0.0", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==", - "dev": true + "dev": true, + "peer": true }, "@datadog/browser-core": { "version": "4.21.2", @@ -51721,6 +53240,69 @@ "dev": true, "optional": true }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "dev": true, + "optional": true + }, "@esbuild/linux-loong64": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", @@ -51728,11 +53310,89 @@ "dev": true, "optional": true }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "dev": true, + "optional": true + }, "@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, + "peer": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -51750,6 +53410,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, + "peer": true, "requires": { "type-fest": "^0.20.2" } @@ -51758,13 +53419,15 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "dev": true, + "peer": true }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -52613,6 +54276,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, + "peer": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -52623,7 +54287,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "peer": true }, "@ibm-cloud/openapi-ruleset": { "version": "0.37.3", @@ -54547,6 +56212,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", "dev": true, + "peer": true, "requires": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -54572,6 +56238,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", "dev": true, + "peer": true, "requires": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -54585,7 +56252,8 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -54594,6 +56262,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, + "peer": true, "requires": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -55841,6 +57510,12 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -56169,6 +57844,17 @@ "safe-buffer": "~5.1.0" } }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -56314,12 +58000,6 @@ "integrity": "sha512-j11XSuRuAlft6vLDEX4RvhqC0KxNxx6QIyMXNb0vHHSNPXTPeiy3algESWmOOIzEtiEL0qiowPU3ewW9hHVa7Q==", "dev": true }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, "clean-css": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", @@ -56623,26 +58303,6 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, "terser-webpack-plugin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", @@ -57103,6 +58763,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -57455,6 +59121,17 @@ "has-flag": "^4.0.0" } }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, "terser-webpack-plugin": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", @@ -58125,6 +59802,25 @@ "has-flag": "^4.0.0" } }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, "terser-webpack-plugin": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", @@ -58555,6 +60251,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -58901,6 +60603,17 @@ "has-flag": "^4.0.0" } }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -59039,12 +60752,6 @@ "integrity": "sha512-j11XSuRuAlft6vLDEX4RvhqC0KxNxx6QIyMXNb0vHHSNPXTPeiy3algESWmOOIzEtiEL0qiowPU3ewW9hHVa7Q==", "dev": true }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -59442,26 +61149,6 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, "terser-webpack-plugin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", @@ -60224,6 +61911,7 @@ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, + "peer": true, "requires": { "ejs": "^3.1.6", "json5": "^2.2.0", @@ -60236,6 +61924,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "requires": { "minimist": "^1.2.5" } @@ -60246,7 +61935,8 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "dev": true + "dev": true, + "peer": true }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "5.4.0", @@ -60264,37 +61954,43 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "dev": true + "dev": true, + "peer": true }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "dev": true + "dev": true, + "peer": true }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "dev": true + "dev": true, + "peer": true }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "dev": true + "dev": true, + "peer": true }, "@svgr/babel-plugin-transform-svg-component": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "dev": true + "dev": true, + "peer": true }, "@svgr/babel-preset": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", "dev": true, + "peer": true, "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", @@ -60311,6 +62007,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", "dev": true, + "peer": true, "requires": { "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", @@ -60322,6 +62019,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, + "peer": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -60337,6 +62035,7 @@ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", "dev": true, + "peer": true, "requires": { "@babel/types": "^7.12.6" } @@ -60346,6 +62045,7 @@ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.12.3", "@svgr/babel-preset": "^5.5.0", @@ -60358,6 +62058,7 @@ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", "dev": true, + "peer": true, "requires": { "cosmiconfig": "^7.0.0", "deepmerge": "^4.2.2", @@ -60369,6 +62070,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, + "peer": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -60381,7 +62083,8 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -60390,6 +62093,7 @@ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.12.3", "@babel/plugin-transform-react-constant-elements": "^7.12.1", @@ -60406,6 +62110,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "requires": { "minimist": "^1.2.5" } @@ -60415,6 +62120,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, + "peer": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -60461,12 +62167,6 @@ "color-convert": "^2.0.1" } }, - "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -60535,12 +62235,6 @@ "color-convert": "^2.0.1" } }, - "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true - }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -60653,7 +62347,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true + "dev": true, + "peer": true }, "@tsconfig/node10": { "version": "1.0.8", @@ -60737,6 +62432,7 @@ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, + "peer": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -60747,6 +62443,7 @@ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -60756,6 +62453,7 @@ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -60765,6 +62463,7 @@ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", "dev": true, + "peer": true, "requires": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -60823,6 +62522,7 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", "dev": true, + "peer": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -60835,6 +62535,7 @@ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -60894,6 +62595,7 @@ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -61016,7 +62718,8 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "dev": true, + "peer": true }, "@types/minimatch": { "version": "3.0.3", @@ -61094,7 +62797,8 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true + "dev": true, + "peer": true }, "@types/qs": { "version": "6.9.6", @@ -61115,7 +62819,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "dev": true, + "peer": true }, "@types/react": { "version": "17.0.39", @@ -61234,6 +62939,7 @@ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -61242,7 +62948,8 @@ "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", - "dev": true + "dev": true, + "peer": true }, "@types/sanitize-html": { "version": "2.6.2", @@ -61268,6 +62975,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", "dev": true, + "peer": true, "requires": { "@types/express": "*" } @@ -61277,6 +62985,7 @@ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dev": true, + "peer": true, "requires": { "@types/mime": "^1", "@types/node": "*" @@ -61287,6 +62996,7 @@ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -61339,7 +63049,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", - "dev": true + "dev": true, + "peer": true }, "@types/uglify-js": { "version": "3.12.0", @@ -61431,6 +63142,7 @@ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "dev": true, + "peer": true, "requires": { "@types/node": "*" } @@ -61775,6 +63487,43 @@ } } }, + "@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "requires": {} + }, + "@vitejs/plugin-react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.1.tgz", + "integrity": "sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==", + "dev": true, + "requires": { + "@babel/core": "^7.20.7", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "dependencies": { + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true + } + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -62129,6 +63878,7 @@ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", "dev": true, + "peer": true, "requires": { "acorn": "^7.0.0", "acorn-walk": "^7.0.0", @@ -62152,6 +63902,7 @@ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, + "peer": true, "requires": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -62162,6 +63913,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "requires": { "minimist": "^1.2.5" } @@ -62171,6 +63923,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, + "peer": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -62365,7 +64118,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", - "dev": true + "dev": true, + "peer": true }, "argparse": { "version": "2.0.1", @@ -62373,13 +64127,45 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" + "deep-equal": "^2.0.5" + }, + "dependencies": { + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } } }, "arr-diff": { @@ -62410,18 +64196,19 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "dev": true, + "peer": true }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -62455,14 +64242,15 @@ } }, "array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.map": { @@ -62592,6 +64380,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, + "peer": true, "requires": { "lodash": "^4.17.14" } @@ -62644,17 +64433,59 @@ } } }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.2.tgz", + "integrity": "sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg==", "dev": true }, "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + }, + "dependencies": { + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } }, "babel-jest": { "version": "29.3.1", @@ -62970,6 +64801,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", "dev": true, + "peer": true, "requires": {} }, "babel-plugin-named-exports-order": { @@ -63210,7 +65042,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true + "dev": true, + "peer": true }, "better-opn": { "version": "2.1.1", @@ -63238,6 +65071,7 @@ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", "dev": true, + "peer": true, "requires": { "bluebird": "^3.5.5", "check-types": "^11.1.1", @@ -63337,6 +65171,7 @@ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, + "peer": true, "requires": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", @@ -63490,7 +65325,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true + "dev": true, + "peer": true }, "browserify-aes": { "version": "1.2.0", @@ -63614,7 +65450,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true + "dev": true, + "peer": true }, "buffer-xor": { "version": "1.0.3", @@ -63626,7 +65463,8 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true + "dev": true, + "peer": true }, "builtin-status-codes": { "version": "3.0.0", @@ -63814,22 +65652,33 @@ "dev": true }, "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, - "optional": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" }, "dependencies": { "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", - "dev": true, - "optional": true + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true } } }, @@ -63843,6 +65692,7 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, + "peer": true, "requires": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -63919,7 +65769,8 @@ "version": "11.1.2", "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==", - "dev": true + "dev": true, + "peer": true }, "chokidar": { "version": "3.5.3", @@ -64153,6 +66004,7 @@ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, + "peer": true, "requires": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -64243,7 +66095,8 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true + "dev": true, + "peer": true }, "commondir": { "version": "1.0.1", @@ -64357,7 +66210,8 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true + "dev": true, + "peer": true }, "console-browserify": { "version": "1.2.0", @@ -64498,31 +66352,6 @@ "yaml": "^1.7.2" } }, - "cosmiconfig-typescript-loader": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz", - "integrity": "sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==", - "dev": true, - "requires": { - "cosmiconfig": "^7", - "ts-node": "^10.8.1" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - } - } - }, "cp-file": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", @@ -64855,7 +66684,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true + "dev": true, + "peer": true }, "css-color-keywords": { "version": "1.0.0", @@ -64911,6 +66741,7 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, + "peer": true, "requires": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -64922,7 +66753,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true + "dev": true, + "peer": true }, "css-to-react-native": { "version": "3.0.0", @@ -64939,6 +66771,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, + "peer": true, "requires": { "mdn-data": "2.0.4", "source-map": "^0.6.1" @@ -64948,7 +66781,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -64961,7 +66795,8 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true + "dev": true, + "peer": true }, "css.escape": { "version": "1.5.1", @@ -64973,7 +66808,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", - "dev": true + "dev": true, + "peer": true }, "cssesc": { "version": "3.0.0", @@ -64986,6 +66822,7 @@ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, + "peer": true, "requires": { "css-tree": "^1.1.2" }, @@ -64995,6 +66832,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", "dev": true, + "peer": true, "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -65004,13 +66842,15 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "dev": true, + "peer": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -65241,6 +67081,7 @@ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dev": true, + "peer": true, "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -65271,6 +67112,146 @@ "bplist-parser": "^0.1.0", "meow": "^3.1.0", "untildify": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "optional": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "optional": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "optional": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "optional": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "optional": true + } } }, "defaults": { @@ -65343,7 +67324,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true + "dev": true, + "peer": true }, "degenerator": { "version": "3.0.2", @@ -65449,7 +67431,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "dev": true, + "peer": true }, "dependency-graph": { "version": "0.11.0", @@ -65539,6 +67522,7 @@ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "dev": true, + "peer": true, "requires": { "address": "^1.0.1", "debug": "^2.6.0" @@ -65549,6 +67533,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "requires": { "ms": "2.0.0" } @@ -65557,7 +67542,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "dev": true, + "peer": true } } }, @@ -65566,6 +67552,7 @@ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", "dev": true, + "peer": true, "requires": { "acorn-node": "^1.6.1", "defined": "^1.0.0", @@ -65586,7 +67573,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "dev": true, + "peer": true }, "diff": { "version": "5.1.0", @@ -65631,19 +67619,22 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "dev": true, + "peer": true }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true + "dev": true, + "peer": true }, "dns-packet": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, + "peer": true, "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -65654,6 +67645,7 @@ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, + "peer": true, "requires": { "buffer-indexof": "^1.0.0" } @@ -65695,6 +67687,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, + "peer": true, "requires": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -65704,7 +67697,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true + "dev": true, + "peer": true } } }, @@ -65724,7 +67718,8 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true + "dev": true, + "peer": true }, "domexception": { "version": "4.0.0", @@ -65755,6 +67750,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, + "peer": true, "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -65794,7 +67790,8 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dev": true, + "peer": true }, "duplexify": { "version": "3.7.1", @@ -65851,6 +67848,7 @@ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", "dev": true, + "peer": true, "requires": { "jake": "^10.8.5" } @@ -66099,6 +68097,15 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -66386,6 +68393,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", "dev": true, + "peer": true, "requires": { "@eslint/eslintrc": "^1.0.5", "@humanwhocodes/config-array": "^0.9.2", @@ -66429,6 +68437,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -66438,6 +68447,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -66448,6 +68458,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -66456,19 +68467,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "dev": true, + "peer": true }, "eslint-scope": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, + "peer": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -66478,19 +68492,22 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", - "dev": true + "dev": true, + "peer": true }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "dev": true, + "peer": true }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "peer": true, "requires": { "is-glob": "^4.0.3" } @@ -66500,6 +68517,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, + "peer": true, "requires": { "type-fest": "^0.20.2" } @@ -66508,13 +68526,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -66523,14 +68543,15 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "dev": true, + "peer": true } } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", "dev": true, "requires": {} }, @@ -66735,23 +68756,26 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", "dev": true, "requires": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", "minimatch": "^3.0.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", "semver": "^6.3.0" }, "dependencies": { @@ -66764,9 +68788,9 @@ } }, "eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -66882,6 +68906,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, + "peer": true, "requires": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", @@ -66892,13 +68917,15 @@ "version": "8.7.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true + "dev": true, + "peer": true }, "eslint-visitor-keys": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -66913,6 +68940,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, + "peer": true, "requires": { "estraverse": "^5.1.0" }, @@ -66921,7 +68949,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -67630,6 +69659,7 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", "dev": true, + "peer": true, "requires": { "minimatch": "^3.0.5" }, @@ -67639,6 +69669,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -67647,6 +69678,7 @@ "version": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, + "peer": true, "requires": { "brace-expansion": "^2.0.1" } @@ -67657,7 +69689,8 @@ "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "dev": true + "dev": true, + "peer": true }, "fill-range": { "version": "7.0.1", @@ -67825,7 +69858,17 @@ "version": "1.14.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "dev": true + "dev": true, + "peer": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } }, "for-in": { "version": "1.0.2", @@ -68005,7 +70048,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true + "dev": true, + "peer": true }, "fragment-cache": { "version": "0.2.1", @@ -68288,7 +70332,8 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true + "dev": true, + "peer": true }, "get-package-type": { "version": "0.1.0", @@ -68507,6 +70552,12 @@ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "gonzales-pe": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", @@ -68516,6 +70567,15 @@ "minimist": "^1.2.5" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -68527,6 +70587,7 @@ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, + "peer": true, "requires": { "duplexer": "^0.1.2" } @@ -68535,7 +70596,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "dev": true, + "peer": true }, "handlebars": { "version": "4.7.7", @@ -68568,7 +70630,8 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", - "dev": true + "dev": true, + "peer": true }, "has": { "version": "1.0.3", @@ -68875,7 +70938,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "dev": true + "dev": true, + "peer": true }, "hosted-git-info": { "version": "2.8.9", @@ -68888,6 +70952,7 @@ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, + "peer": true, "requires": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -68900,6 +70965,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, + "peer": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -68915,6 +70981,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "peer": true, "requires": { "safe-buffer": "~5.1.0" } @@ -68956,6 +71023,31 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } } } }, @@ -69042,7 +71134,8 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true + "dev": true, + "peer": true }, "http-errors": { "version": "2.0.0", @@ -69075,13 +71168,15 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", - "dev": true + "dev": true, + "peer": true }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, + "peer": true, "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -69310,6 +71405,7 @@ "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", "dev": true, + "peer": true, "requires": { "harmony-reflect": "^1.4.6" } @@ -69521,12 +71617,24 @@ } }, "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" } }, "is-arrayish": { @@ -69611,10 +71719,13 @@ } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-decimal": { "version": "1.0.4", @@ -69716,7 +71827,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true + "dev": true, + "peer": true }, "is-negative-zero": { "version": "2.0.2", @@ -69742,7 +71854,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true + "dev": true, + "peer": true }, "is-object": { "version": "1.0.2", @@ -69754,13 +71867,15 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true + "dev": true, + "peer": true }, "is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "dev": true, + "peer": true }, "is-plain-object": { "version": "2.0.4", @@ -69800,13 +71915,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true + "dev": true, + "peer": true }, "is-root": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "dev": true + "dev": true, + "peer": true }, "is-set": { "version": "2.0.2", @@ -69847,6 +71964,19 @@ "has-symbols": "^1.0.1" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -69860,6 +71990,12 @@ "dev": true, "optional": true }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -69869,6 +72005,16 @@ "call-bind": "^1.0.2" } }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "is-whitespace-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", @@ -70025,6 +72171,7 @@ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, + "peer": true, "requires": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -70037,6 +72184,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -70045,13 +72193,15 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true + "dev": true, + "peer": true }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -70062,6 +72212,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -70070,19 +72221,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -71286,6 +73440,7 @@ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^27.5.1", "@jest/source-map": "^27.5.1", @@ -71311,6 +73466,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -71325,6 +73481,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, + "peer": true, "requires": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", @@ -71337,6 +73494,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", @@ -71351,6 +73509,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", @@ -71362,6 +73521,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dev": true, + "peer": true, "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", @@ -71373,6 +73533,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dev": true, + "peer": true, "requires": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", @@ -71385,6 +73546,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", @@ -71408,6 +73570,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "peer": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -71421,6 +73584,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, + "peer": true, "requires": { "@sinonjs/commons": "^1.7.0" } @@ -71430,6 +73594,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "peer": true, "requires": { "@types/yargs-parser": "*" } @@ -71439,6 +73604,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -71448,6 +73614,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -71457,13 +73624,15 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true + "dev": true, + "peer": true }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -71472,13 +73641,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "expect": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -71490,13 +73661,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "peer": true }, "jest-each": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -71510,6 +73683,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -71531,6 +73705,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -71548,6 +73723,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/node": "*" @@ -71557,13 +73733,15 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true + "dev": true, + "peer": true }, "jest-runtime": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -71594,6 +73772,7 @@ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -71604,6 +73783,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", @@ -71634,6 +73814,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -71648,6 +73829,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -71659,6 +73841,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -71670,6 +73853,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -71678,13 +73862,15 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -72034,6 +74220,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -72052,6 +74239,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "peer": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -72065,6 +74253,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "peer": true, "requires": { "@types/yargs-parser": "*" } @@ -72074,6 +74263,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -72083,6 +74273,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -72092,13 +74283,15 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true + "dev": true, + "peer": true }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -72107,19 +74300,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "peer": true }, "jest-haste-map": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -72140,13 +74336,15 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true + "dev": true, + "peer": true }, "jest-serializer": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -72157,6 +74355,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -72171,6 +74370,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -72182,6 +74382,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -72193,6 +74394,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -73183,6 +75385,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "camelcase": "^6.2.0", @@ -73197,6 +75400,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "peer": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -73210,6 +75414,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "peer": true, "requires": { "@types/yargs-parser": "*" } @@ -73219,6 +75424,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -73228,6 +75434,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -73238,6 +75445,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -73246,19 +75454,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "peer": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -73547,7 +75758,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "dev": true, + "peer": true }, "json-schema-ref-parser": { "version": "5.1.3", @@ -73601,7 +75813,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "dev": true, + "peer": true }, "json2mq": { "version": "0.2.0", @@ -74078,13 +76291,15 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true + "dev": true, + "peer": true }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "peer": true }, "lodash.omit": { "version": "4.5.0", @@ -74098,11 +76313,18 @@ "integrity": "sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==", "dev": true }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true + "dev": true, + "peer": true }, "lodash.throttle": { "version": "4.1.1", @@ -74769,7 +76991,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true + "dev": true, + "peer": true }, "mdurl": { "version": "1.0.1", @@ -74860,117 +77083,60 @@ } }, "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, - "optional": true, "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "optional": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", - "dev": true, - "optional": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "optional": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "optional": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "optional": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "lru-cache": "^6.0.0" } }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "optional": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, - "optional": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "lru-cache": "^6.0.0" } }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", - "dev": true, - "optional": true, - "requires": { - "get-stdin": "^4.0.1" - } + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true } } }, @@ -75637,6 +77803,7 @@ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dev": true, + "peer": true, "requires": { "schema-utils": "^4.0.0" }, @@ -75646,6 +77813,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -75658,6 +77826,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.3" } @@ -75666,13 +77835,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "peer": true }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "peer": true, "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -75884,6 +78055,7 @@ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, + "peer": true, "requires": { "dns-packet": "^1.3.1", "thunky": "^1.0.2" @@ -75893,7 +78065,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true + "dev": true, + "peer": true }, "nan": { "version": "2.16.0", @@ -76227,7 +78400,8 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true + "dev": true, + "peer": true }, "npm-normalize-package-bin": { "version": "1.0.1", @@ -76261,6 +78435,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, + "peer": true, "requires": { "boolbase": "~1.0.0" } @@ -76412,7 +78587,8 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "dev": true + "dev": true, + "peer": true }, "object-inspect": { "version": "1.12.2", @@ -76421,12 +78597,12 @@ "dev": true }, "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -76458,25 +78634,25 @@ } }, "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.getownpropertydescriptors": { @@ -76535,7 +78711,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "dev": true, + "peer": true }, "on-finished": { "version": "2.4.1", @@ -77131,7 +79308,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "dev": true, + "peer": true }, "picocolors": { "version": "1.0.0", @@ -77158,14 +79336,14 @@ "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "optional": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "optional": true, "requires": { @@ -77192,6 +79370,7 @@ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "dev": true, + "peer": true, "requires": { "find-up": "^3.0.0" }, @@ -77201,6 +79380,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, + "peer": true, "requires": { "locate-path": "^3.0.0" } @@ -77210,6 +79390,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "peer": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -77220,6 +79401,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, + "peer": true, "requires": { "p-limit": "^2.0.0" } @@ -77228,7 +79410,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "dev": true, + "peer": true } } }, @@ -77279,6 +79462,7 @@ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dev": true, + "peer": true, "requires": { "async": "^2.6.2", "debug": "^3.1.1", @@ -77290,6 +79474,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "peer": true, "requires": { "ms": "^2.1.1" } @@ -77340,6 +79525,7 @@ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.1.tgz", "integrity": "sha512-c/9XYboIbSEUZpiD1UQD0IKiUe8n9WHYV7YFe7X7J+ZwCsEKkUJSFWjS9hBU1RR9THR7jMXst8sxiqP0jjo2mg==", "dev": true, + "peer": true, "requires": { "lilconfig": "^2.0.4", "yaml": "^1.10.2" @@ -77503,7 +79689,8 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true + "dev": true, + "peer": true }, "pretty-error": { "version": "2.1.2", @@ -77574,6 +79761,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "dev": true, + "peer": true, "requires": { "asap": "~2.0.6" } @@ -77813,7 +80001,8 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true + "dev": true, + "peer": true }, "qs": { "version": "6.10.3", @@ -77862,13 +80051,15 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true + "dev": true, + "peer": true }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "dev": true, + "peer": true, "requires": { "performance-now": "^2.1.0" } @@ -77978,6 +80169,7 @@ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", "dev": true, + "peer": true, "requires": { "core-js": "^3.19.2", "object-assign": "^4.1.1", @@ -78014,6 +80206,7 @@ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", @@ -78046,6 +80239,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -78055,6 +80249,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -78065,6 +80260,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -78073,19 +80269,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "dev": true, + "peer": true }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -78095,19 +80294,22 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "peer": true }, "loader-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "dev": true + "dev": true, + "peer": true }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -78117,6 +80319,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -78126,6 +80329,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -78135,6 +80339,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -78222,7 +80427,8 @@ "version": "6.0.11", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", - "dev": true + "dev": true, + "peer": true }, "react-fast-compare": { "version": "2.0.4", @@ -78582,6 +80788,7 @@ "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", @@ -78638,6 +80845,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -78652,6 +80860,7 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", "dev": true, + "peer": true, "requires": { "@jest/console": "^27.5.1", "@jest/reporters": "^27.5.1", @@ -78688,6 +80897,7 @@ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, + "peer": true, "requires": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", @@ -78700,6 +80910,7 @@ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", @@ -78714,6 +80925,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", @@ -78725,6 +80937,7 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", "dev": true, + "peer": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.5.1", @@ -78757,7 +80970,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -78766,6 +80980,7 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", "dev": true, + "peer": true, "requires": { "@sinclair/typebox": "^0.24.1" } @@ -78775,6 +80990,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dev": true, + "peer": true, "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", @@ -78785,7 +81001,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -78794,6 +81011,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dev": true, + "peer": true, "requires": { "@jest/console": "^27.5.1", "@jest/types": "^27.5.1", @@ -78806,6 +81024,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", "dev": true, + "peer": true, "requires": { "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", @@ -78818,6 +81037,7 @@ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.1.0", "@jest/types": "^27.5.1", @@ -78840,7 +81060,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -78849,6 +81070,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, + "peer": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -78862,6 +81084,7 @@ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz", "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==", "dev": true, + "peer": true, "requires": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", @@ -78879,6 +81102,7 @@ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, + "peer": true, "requires": { "@sinonjs/commons": "^1.7.0" } @@ -78887,13 +81111,15 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "dev": true, + "peer": true }, "@types/yargs": { "version": "16.0.5", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, + "peer": true, "requires": { "@types/yargs-parser": "*" } @@ -78902,13 +81128,15 @@ "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true + "dev": true, + "peer": true }, "acorn-globals": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, + "peer": true, "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -78918,7 +81146,8 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "dev": true, + "peer": true } } }, @@ -78927,6 +81156,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -78936,6 +81166,7 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", "dev": true, + "peer": true, "requires": { "browserslist": "^4.19.1", "caniuse-lite": "^1.0.30001297", @@ -78950,6 +81181,7 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", "dev": true, + "peer": true, "requires": { "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", @@ -78966,6 +81198,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", "dev": true, + "peer": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -78978,6 +81211,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", "dev": true, + "peer": true, "requires": { "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" @@ -78988,6 +81222,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -78997,13 +81232,15 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true + "dev": true, + "peer": true }, "clean-css": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.3.tgz", "integrity": "sha512-qjywD7LvpZJ5+E16lf00GnMVUX5TEVBcKW1/vtGPgAerHwRwE4JP4p1Y40zbLnup2ZfWsd30P2bHdoAKH93XxA==", "dev": true, + "peer": true, "requires": { "source-map": "~0.6.0" }, @@ -79012,7 +81249,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -79021,6 +81259,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -79029,19 +81268,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true + "dev": true, + "peer": true }, "cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, + "peer": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -79055,6 +81297,7 @@ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.2.tgz", "integrity": "sha512-hOb1LFjRR+8ocA071xUSmg5VslJ8NGo/I2qpUpdeAYyBVCgupS5O8SEVo4SxEMYyFBNodBkzG3T1iqW9HCXxew==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.8" } @@ -79064,6 +81307,7 @@ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz", "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==", "dev": true, + "peer": true, "requires": { "timsort": "^0.3.0" } @@ -79073,6 +81317,7 @@ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.3.tgz", "integrity": "sha512-0gDYWEKaGacwxCqvQ3Ypg6wGdD1AztbMm5h1JsactG2hP2eiflj808QITmuWBpE7sjSEVrAlZhPTVd/nNMj/hQ==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.8" } @@ -79082,6 +81327,7 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dev": true, + "peer": true, "requires": { "icss-utils": "^5.1.0", "postcss": "^8.2.15", @@ -79098,6 +81344,7 @@ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", "dev": true, + "peer": true, "requires": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", @@ -79112,6 +81359,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -79124,6 +81372,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.3" } @@ -79133,6 +81382,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "peer": true, "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -79144,7 +81394,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -79153,6 +81404,7 @@ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", "dev": true, + "peer": true, "requires": {} }, "css-select": { @@ -79160,6 +81412,7 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dev": true, + "peer": true, "requires": { "boolbase": "^1.0.0", "css-what": "^5.1.0", @@ -79173,6 +81426,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, + "peer": true, "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -79182,7 +81436,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -79190,13 +81445,15 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true + "dev": true, + "peer": true }, "cssnano": { "version": "5.0.16", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.16.tgz", "integrity": "sha512-ryhRI9/B9VFCwPbb1z60LLK5/ldoExi7nwdnJzpkLZkm2/r7j2X3jfY+ZvDVJhC/0fPZlrAguYdHNFg0iglPKQ==", "dev": true, + "peer": true, "requires": { "cssnano-preset-default": "^5.1.11", "lilconfig": "^2.0.3", @@ -79208,6 +81465,7 @@ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.11.tgz", "integrity": "sha512-ETet5hqHxmzQq2ynXMOQofKuLm7VOjMiOB7E2zdtm/hSeCKlD9fabzIUV4GoPcRyJRHi+4kGf0vsfGYbQ4nmPw==", "dev": true, + "peer": true, "requires": { "css-declaration-sorter": "^6.0.3", "cssnano-utils": "^3.0.1", @@ -79245,19 +81503,22 @@ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.1.tgz", "integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==", "dev": true, + "peer": true, "requires": {} }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true + "dev": true, + "peer": true }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, + "peer": true, "requires": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -79268,13 +81529,15 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "dev": true, + "peer": true }, "default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, + "peer": true, "requires": { "execa": "^5.0.0" } @@ -79284,6 +81547,7 @@ "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, + "peer": true, "requires": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -79300,6 +81564,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dev": true, + "peer": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -79310,13 +81575,15 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true + "dev": true, + "peer": true }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, + "peer": true, "requires": { "webidl-conversions": "^5.0.0" }, @@ -79325,7 +81592,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true + "dev": true, + "peer": true } } }, @@ -79334,6 +81602,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, + "peer": true, "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -79344,19 +81613,22 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true + "dev": true, + "peer": true }, "emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true + "dev": true, + "peer": true }, "eslint-webpack-plugin": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz", "integrity": "sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==", "dev": true, + "peer": true, "requires": { "@types/eslint": "^7.28.2", "jest-worker": "^27.3.1", @@ -79370,6 +81642,7 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", @@ -79382,6 +81655,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "peer": true, "requires": { "websocket-driver": ">=0.5.1" } @@ -79391,6 +81665,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "peer": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -79401,6 +81676,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "peer": true, "requires": { "is-glob": "^4.0.3" } @@ -79409,13 +81685,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "peer": true }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, + "peer": true, "requires": { "whatwg-encoding": "^1.0.5" } @@ -79424,13 +81702,15 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", - "dev": true + "dev": true, + "peer": true }, "html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, + "peer": true, "requires": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -79446,6 +81726,7 @@ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, + "peer": true, "requires": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -79459,6 +81740,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", "dev": true, + "peer": true, "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -79472,6 +81754,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "peer": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -79481,25 +81764,29 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, + "peer": true, "requires": {} }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true + "dev": true, + "peer": true }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "dev": true, + "peer": true }, "jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, + "peer": true, "requires": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -79511,6 +81798,7 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "execa": "^5.0.0", @@ -79522,6 +81810,7 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -79549,6 +81838,7 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", "dev": true, + "peer": true, "requires": { "@jest/core": "^27.5.1", "@jest/test-result": "^27.5.1", @@ -79569,6 +81859,7 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.8.0", "@jest/test-sequencer": "^27.5.1", @@ -79601,6 +81892,7 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", "dev": true, + "peer": true, "requires": { "detect-newline": "^3.0.0" } @@ -79610,6 +81902,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "chalk": "^4.0.0", @@ -79623,6 +81916,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -79638,6 +81932,7 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -79652,6 +81947,7 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/graceful-fs": "^4.1.2", @@ -79673,6 +81969,7 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", "dev": true, + "peer": true, "requires": { "jest-get-type": "^27.5.1", "pretty-format": "^27.5.1" @@ -79683,6 +81980,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^27.5.1", @@ -79700,6 +81998,7 @@ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/node": "*" @@ -79709,13 +82008,15 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true + "dev": true, + "peer": true }, "jest-resolve-dependencies": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "jest-regex-util": "^27.5.1", @@ -79727,6 +82028,7 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", "dev": true, + "peer": true, "requires": { "@jest/console": "^27.5.1", "@jest/environment": "^27.5.1", @@ -79756,6 +82058,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", "dev": true, + "peer": true, "requires": { "@jest/environment": "^27.5.1", "@jest/fake-timers": "^27.5.1", @@ -79786,6 +82089,7 @@ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "graceful-fs": "^4.2.9" @@ -79796,6 +82100,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dev": true, + "peer": true, "requires": { "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", @@ -79826,6 +82131,7 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^27.5.1", "@types/node": "*", @@ -79840,6 +82146,7 @@ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", "dev": true, + "peer": true, "requires": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", @@ -79855,6 +82162,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", "dev": true, + "peer": true, "requires": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -79868,7 +82176,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "peer": true } } }, @@ -79877,6 +82186,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", "dev": true, + "peer": true, "requires": { "@jest/console": "^28.1.3", "@jest/types": "^28.1.3", @@ -79889,6 +82199,7 @@ "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -79903,6 +82214,7 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.19.tgz", "integrity": "sha512-cAx3qamwaYX9R0fzOIZAlFpo4A+1uBVCxqpKz9D26uTF4srRXaGTTsikQmaotCtNdbhzyUH7ft6p9ktz9s6UNQ==", "dev": true, + "peer": true, "requires": { "@types/yargs-parser": "*" } @@ -79911,19 +82223,22 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true + "dev": true, + "peer": true }, "emittery": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true + "dev": true, + "peer": true }, "jest-message-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^28.1.3", @@ -79940,7 +82255,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "peer": true } } }, @@ -79948,13 +82264,15 @@ "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true + "dev": true, + "peer": true }, "jest-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", "dev": true, + "peer": true, "requires": { "@jest/types": "^28.1.3", "@types/node": "*", @@ -79969,6 +82287,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", "dev": true, + "peer": true, "requires": { "@jest/test-result": "^28.1.3", "@jest/types": "^28.1.3", @@ -79985,6 +82304,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, + "peer": true, "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -79995,6 +82315,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^5.0.1" } @@ -80006,6 +82327,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", "dev": true, + "peer": true, "requires": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", @@ -80017,13 +82339,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true + "dev": true, + "peer": true }, "string-length": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", "dev": true, + "peer": true, "requires": { "char-regex": "^2.0.0", "strip-ansi": "^7.0.1" @@ -80033,7 +82357,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -80042,6 +82367,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^6.0.1" }, @@ -80050,7 +82376,8 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true + "dev": true, + "peer": true } } } @@ -80061,6 +82388,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", "dev": true, + "peer": true, "requires": { "@jest/test-result": "^27.5.1", "@jest/types": "^27.5.1", @@ -80076,6 +82404,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "peer": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -80087,6 +82416,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -80098,6 +82428,7 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, + "peer": true, "requires": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -80133,6 +82464,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, + "peer": true, "requires": {} } } @@ -80141,13 +82473,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "peer": true }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "requires": { "minimist": "^1.2.5" } @@ -80157,6 +82491,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, + "peer": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -80168,6 +82503,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "peer": true, "requires": { "p-locate": "^5.0.0" } @@ -80176,19 +82512,22 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "dev": true, + "peer": true }, "node-forge": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", - "dev": true + "dev": true, + "peer": true }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, + "peer": true, "requires": { "boolbase": "^1.0.0" } @@ -80198,6 +82537,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "peer": true, "requires": { "yocto-queue": "^0.1.0" } @@ -80207,6 +82547,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "peer": true, "requires": { "p-limit": "^3.0.2" } @@ -80216,6 +82557,7 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, + "peer": true, "requires": { "@types/retry": "^0.12.0", "retry": "^0.13.1" @@ -80226,6 +82568,7 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dev": true, + "peer": true, "requires": { "nanoid": "^3.1.30", "picocolors": "^1.0.0", @@ -80237,6 +82580,7 @@ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.2" } @@ -80246,6 +82590,7 @@ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", "dev": true, + "peer": true, "requires": {} }, "postcss-calc": { @@ -80253,6 +82598,7 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.3.tgz", "integrity": "sha512-EGM2EBBWqP57N0E7N7WOLT116PJ39dwHVU01WO4XPPQLJfkL2xVgkMZ+TZvCfapj/uJH07UEfKHQNPHzSw/14Q==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.0.2" @@ -80263,6 +82609,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.1.tgz", "integrity": "sha512-62OBIXCjRXpQZcFOYIXwXBlpAVWrYk8ek1rcjvMING4Q2cf0ipyN9qT+BhHA6HmftGSEnFQu2qgKO3gMscl3Rw==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80272,6 +82619,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.2.tgz", "integrity": "sha512-gyx8RgqSmGVK156NAdKcsfkY3KPGHhKqvHTL3hhveFrBBToguKFzhyiuk3cljH6L4fJ0Kv+JENuPXs1Wij27Zw==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80281,6 +82629,7 @@ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80290,6 +82639,7 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.4.tgz", "integrity": "sha512-rYlC5015aNqVQt/B6Cy156g7sH5tRUJGmT9xeagYthtKehetbKx7jHxhyLpulP4bs4vbp8u/B2rac0J7S7qPQg==", "dev": true, + "peer": true, "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", @@ -80302,6 +82652,7 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.3.tgz", "integrity": "sha512-fVkjHm2T0PSMqXUCIhHNWVGjhB9mHEWX2GboVs7j3iCgr6FpIl9c/IdXy0PHWZSQ9LFTRgmj98amxJE6KOnlsA==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80311,6 +82662,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", "dev": true, + "peer": true, "requires": {} }, "postcss-custom-properties": { @@ -80318,6 +82670,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.3.tgz", "integrity": "sha512-rtu3otIeY532PnEuuBrIIe+N+pcdbX/7JMZfrcL09wc78YayrHw5E8UkDfvnlOhEUrI4ptCuzXQfj+Or6spbGA==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80327,6 +82680,7 @@ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.4" } @@ -80336,6 +82690,7 @@ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.3.tgz", "integrity": "sha512-qiPm+CNAlgXiMf0J5IbBBEXA9l/Q5HGsNGkL3znIwT2ZFRLGY9U2fTUpa4lqCUXQOxaLimpacHeQC80BD2qbDw==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.8" } @@ -80345,6 +82700,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.2.tgz", "integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==", "dev": true, + "peer": true, "requires": {} }, "postcss-discard-duplicates": { @@ -80352,6 +82708,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.2.tgz", "integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==", "dev": true, + "peer": true, "requires": {} }, "postcss-discard-empty": { @@ -80359,6 +82716,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.2.tgz", "integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==", "dev": true, + "peer": true, "requires": {} }, "postcss-discard-overridden": { @@ -80366,6 +82724,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.3.tgz", "integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==", "dev": true, + "peer": true, "requires": {} }, "postcss-double-position-gradients": { @@ -80373,6 +82732,7 @@ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.4.tgz", "integrity": "sha512-qz+s5vhKJlsHw8HjSs+HVk2QGFdRyC68KGRQGX3i+GcnUjhWhXQEmCXW6siOJkZ1giu0ddPwSO6I6JdVVVPoog==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80382,6 +82742,7 @@ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.4.tgz", "integrity": "sha512-0ltahRTPtXSIlEZFv7zIvdEib7HN0ZbUQxrxIKn8KbiRyhALo854I/CggU5lyZe6ZBvSTJ6Al2vkZecI2OhneQ==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80391,6 +82752,7 @@ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", "dev": true, + "peer": true, "requires": {} }, "postcss-focus-visible": { @@ -80398,6 +82760,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.3.tgz", "integrity": "sha512-ozOsg+L1U8S+rxSHnJJiET6dNLyADcPHhEarhhtCI9DBLGOPG/2i4ddVoFch9LzrBgb8uDaaRI4nuid2OM82ZA==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.8" } @@ -80407,6 +82770,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.3.tgz", "integrity": "sha512-fk9y2uFS6/Kpp7/A9Hz9Z4rlFQ8+tzgBcQCXAFSrXFGAbKx+4ZZOmmfHuYjCOMegPWoz0pnC6fNzi8j7Xyqp5Q==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.8" } @@ -80416,6 +82780,7 @@ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "dev": true, + "peer": true, "requires": {} }, "postcss-gap-properties": { @@ -80423,6 +82788,7 @@ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", "dev": true, + "peer": true, "requires": {} }, "postcss-image-set-function": { @@ -80430,6 +82796,7 @@ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.4.tgz", "integrity": "sha512-BlEo9gSTj66lXjRNByvkMK9dEdEGFXRfGjKRi9fo8s0/P3oEk74cAoonl/utiM50E2OPVb/XSu+lWvdW4KtE/Q==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80439,6 +82806,7 @@ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", "dev": true, + "peer": true, "requires": {} }, "postcss-js": { @@ -80446,6 +82814,7 @@ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "dev": true, + "peer": true, "requires": { "camelcase-css": "^2.0.1" } @@ -80455,6 +82824,7 @@ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.3.tgz", "integrity": "sha512-MH4tymWmefdZQ7uVG/4icfLjAQmH6o2NRYyVh2mKoB4RXJp9PjsyhZwhH4ouaCQHvg+qJVj3RzeAR1EQpIlXZA==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80464,6 +82834,7 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, + "peer": true, "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -80475,6 +82846,7 @@ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", "dev": true, + "peer": true, "requires": {} }, "postcss-media-minmax": { @@ -80482,6 +82854,7 @@ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "dev": true, + "peer": true, "requires": {} }, "postcss-merge-longhand": { @@ -80489,6 +82862,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.5.tgz", "integrity": "sha512-R2BCPJJ/U2oh1uTWEYn9CcJ7MMcQ1iIbj9wfr2s/zHu5om5MP/ewKdaunpfJqR1WYzqCsgnXuRoVXPAzxdqy8g==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.0.2" @@ -80499,6 +82873,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.5.tgz", "integrity": "sha512-3Oa26/Pb9VOFVksJjFG45SNoe4nhGvJ2Uc6TlRimqF8uhfOCEhVCaJ3rvEat5UFOn2UZqTY5Da8dFgCh3Iq0Ug==", "dev": true, + "peer": true, "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", @@ -80511,6 +82886,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.3.tgz", "integrity": "sha512-bC45rVzEwsLhv/cL1eCjoo2OOjbSk9I7HKFBYnBvtyuIZlf7uMipMATXtA0Fc3jwPo3wuPIW1jRJWKzflMh1sA==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80520,6 +82896,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.5.tgz", "integrity": "sha512-/YjvXs8PepsoiZAIpjstOO4IHKwFAqYNqbA1yVdqklM84tbUUneh6omJxGlRlF3mi6K5Pa067Mg6IwqEnYC8Zg==", "dev": true, + "peer": true, "requires": { "colord": "^2.9.1", "cssnano-utils": "^3.0.1", @@ -80531,6 +82908,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.4.tgz", "integrity": "sha512-Z0vjod9lRZEmEPfEmA2sCfjbfEEFKefMD3RDIQSUfXK4LpCyWkX1CniUgyNvnjJFLDPSxtgKzozhHhPHKoeGkg==", "dev": true, + "peer": true, "requires": { "browserslist": "^4.16.6", "cssnano-utils": "^3.0.1", @@ -80542,6 +82920,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.2.tgz", "integrity": "sha512-gpn1nJDMCf3g32y/7kl+jsdamhiYT+/zmEt57RoT9GmzlixBNRPohI7k8UIHelLABhdLf3MSZhtM33xuH5eQOQ==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.5" } @@ -80551,6 +82930,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, + "peer": true, "requires": {} }, "postcss-modules-local-by-default": { @@ -80558,6 +82938,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, + "peer": true, "requires": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -80569,6 +82950,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.4" } @@ -80578,6 +82960,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, + "peer": true, "requires": { "icss-utils": "^5.0.0" } @@ -80587,6 +82970,7 @@ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.6" } @@ -80596,6 +82980,7 @@ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.8" } @@ -80605,6 +82990,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", "dev": true, + "peer": true, "requires": { "@csstools/normalize.css": "*", "postcss-browser-comments": "^4", @@ -80616,6 +83002,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.2.tgz", "integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==", "dev": true, + "peer": true, "requires": {} }, "postcss-normalize-display-values": { @@ -80623,6 +83010,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz", "integrity": "sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80632,6 +83020,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.3.tgz", "integrity": "sha512-U+rmhjrNBvIGYqr/1tD4wXPFFMKUbXsYXvlUCzLi0tOCUS6LoeEAnmVXXJY/MEB/1CKZZwBSs2tmzGawcygVBA==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80641,6 +83030,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.3.tgz", "integrity": "sha512-uk1+xYx0AMbA3nLSNhbDrqbf/rx+Iuq5tVad2VNyaxxJzx79oGieJ6D9F6AfOL2GtiIbP7vTYlpYHtG+ERFXTg==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80650,6 +83040,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.3.tgz", "integrity": "sha512-Mf2V4JbIDboNGQhW6xW0YREDiYXoX3WrD3EjKkjvnpAJ6W4qqjLnK/c9aioyVFaWWHVdP5zVRw/9DI5S3oLDFw==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80659,6 +83050,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz", "integrity": "sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80668,6 +83060,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.3.tgz", "integrity": "sha512-uNC7BmS/7h6to2UWa4RFH8sOTzu2O9dVWPE/F9Vm9GdhONiD/c1kNaCLbmsFHlKWcEx7alNUChQ+jH/QAlqsQw==", "dev": true, + "peer": true, "requires": { "browserslist": "^4.16.6", "postcss-value-parser": "^4.2.0" @@ -80678,6 +83071,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz", "integrity": "sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==", "dev": true, + "peer": true, "requires": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" @@ -80688,6 +83082,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.3.tgz", "integrity": "sha512-333JWRnX655fSoUbufJ10HJop3c8mrpKkCCUnEmgz/Cb/QEtW+/TMZwDAUt4lnwqP6tCCk0x0b58jqvDgiQm/A==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80697,6 +83092,7 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.4.tgz", "integrity": "sha512-taKtGDZtyYUMVYkg+MuJeBUiTF6cGHZmo/qcW7ibvW79UlyKuSHbo6dpCIiqI+j9oJsXWzP+ovIxoyLDOeQFdw==", "dev": true, + "peer": true, "requires": { "cssnano-utils": "^3.0.1", "postcss-value-parser": "^4.2.0" @@ -80707,6 +83103,7 @@ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", "dev": true, + "peer": true, "requires": {} }, "postcss-page-break": { @@ -80714,6 +83111,7 @@ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "dev": true, + "peer": true, "requires": {} }, "postcss-place": { @@ -80721,6 +83119,7 @@ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.3.tgz", "integrity": "sha512-tDQ3m+GYoOar+KoQgj+pwPAvGHAp/Sby6vrFiyrELrMKQJ4AejL0NcS0mm296OKKYA2SRg9ism/hlT/OLhBrdQ==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80730,6 +83129,7 @@ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", "dev": true, + "peer": true, "requires": { "autoprefixer": "^10.4.2", "browserslist": "^4.19.1", @@ -80771,6 +83171,7 @@ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.2.tgz", "integrity": "sha512-CG35J1COUH7OOBgpw5O+0koOLUd5N4vUGKUqSAuIe4GiuLHWU96Pqp+UPC8QITTd12zYAFx76pV7qWT/0Aj/TA==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.8" } @@ -80780,6 +83181,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz", "integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==", "dev": true, + "peer": true, "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0" @@ -80790,6 +83192,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.3.tgz", "integrity": "sha512-yDnTUab5i7auHiNwdcL1f+pBnqQFf+7eC4cbC7D8Lc1FkvNZhtpkdad+9U4wDdFb84haupMf0rA/Zc5LcTe/3A==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.2.0" } @@ -80799,6 +83202,7 @@ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "dev": true, + "peer": true, "requires": {} }, "postcss-selector-not": { @@ -80806,6 +83210,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", "dev": true, + "peer": true, "requires": { "balanced-match": "^1.0.0" } @@ -80815,6 +83220,7 @@ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", "dev": true, + "peer": true, "requires": { "postcss-value-parser": "^4.1.0", "svgo": "^2.7.0" @@ -80825,6 +83231,7 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.3.tgz", "integrity": "sha512-V5tX2hadSSn+miVCluuK1IDGy+7jAXSOfRZ2DQ+s/4uQZb/orDYBjH0CHgFrXsRw78p4QTuEFA9kI6C956UnHQ==", "dev": true, + "peer": true, "requires": { "postcss-selector-parser": "^6.0.5" } @@ -80834,6 +83241,7 @@ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, + "peer": true, "requires": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -80843,13 +83251,15 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "dev": true, + "peer": true }, "renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, + "peer": true, "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -80862,13 +83272,15 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true + "dev": true, + "peer": true }, "sass-loader": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", "dev": true, + "peer": true, "requires": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -80879,6 +83291,7 @@ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, + "peer": true, "requires": { "xmlchars": "^2.2.0" } @@ -80888,6 +83301,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, + "peer": true, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -80899,6 +83313,7 @@ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", "dev": true, + "peer": true, "requires": { "node-forge": "^1.2.0" } @@ -80908,6 +83323,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -80917,6 +83333,7 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, + "peer": true, "requires": { "randombytes": "^2.1.0" } @@ -80926,6 +83343,7 @@ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, + "peer": true, "requires": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -80936,13 +83354,15 @@ "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "dev": true, + "peer": true }, "source-map-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", "dev": true, + "peer": true, "requires": { "abab": "^2.0.5", "iconv-lite": "^0.6.3", @@ -80954,6 +83374,7 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "dev": true, + "peer": true, "requires": {} }, "stylehacks": { @@ -80961,6 +83382,7 @@ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.2.tgz", "integrity": "sha512-114zeJdOpTrbQYRD4OU5UWJ99LKUaqCPJTU1HQ/n3q3BwmllFN8kHENaLnOeqVq6AhXrWfxHNZTl33iJ4oy3cQ==", "dev": true, + "peer": true, "requires": { "browserslist": "^4.16.6", "postcss-selector-parser": "^6.0.4" @@ -80971,6 +83393,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -80980,6 +83403,7 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dev": true, + "peer": true, "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -80994,7 +83418,8 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -81003,6 +83428,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.17.tgz", "integrity": "sha512-OiHUsmOKQQEg/ocXaLIjk/kOz8EK2jF6iPuc1bQ4NsmhYl7sk70UDsGV02AJvBAAiJhinPCkDR8egT9qY+ulCw==", "dev": true, + "peer": true, "requires": { "arg": "^5.0.1", "chalk": "^4.1.2", @@ -81030,33 +83456,15 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } + "peer": true }, "terser-webpack-plugin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "dev": true, + "peer": true, "requires": { "jest-worker": "^27.4.1", "schema-utils": "^3.1.1", @@ -81069,7 +83477,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -81078,6 +83487,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, + "peer": true, "requires": { "punycode": "^2.1.1" } @@ -81094,13 +83504,15 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "dev": true, + "peer": true }, "w3c-xmlserializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, + "peer": true, "requires": { "xml-name-validator": "^3.0.0" } @@ -81109,13 +83521,15 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true + "dev": true, + "peer": true }, "webpack-dev-middleware": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", "dev": true, + "peer": true, "requires": { "colorette": "^2.0.10", "memfs": "^3.2.2", @@ -81129,6 +83543,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -81141,6 +83556,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.3" } @@ -81150,6 +83566,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "peer": true, "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -81164,6 +83581,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", "dev": true, + "peer": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -81201,6 +83619,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -81213,6 +83632,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.3" } @@ -81221,13 +83641,15 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true + "dev": true, + "peer": true }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, + "peer": true, "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -81240,6 +83662,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, + "peer": true, "requires": { "ansi-regex": "^6.0.1" } @@ -81251,6 +83674,7 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "peer": true, "requires": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -81262,6 +83686,7 @@ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, + "peer": true, "requires": { "iconv-lite": "0.4.24" }, @@ -81271,6 +83696,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "peer": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -81281,13 +83707,15 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "dev": true, + "peer": true }, "whatwg-url": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, + "peer": true, "requires": { "lodash": "^4.7.0", "tr46": "^2.1.0", @@ -81298,7 +83726,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -81629,6 +84058,7 @@ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "dev": true, + "peer": true, "requires": { "minimatch": "^3.0.5" } @@ -81719,9 +84149,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.1", @@ -81746,7 +84176,8 @@ "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true + "dev": true, + "peer": true }, "regexp.prototype.flags": { "version": "1.4.3", @@ -82679,6 +85110,7 @@ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", "dev": true, + "peer": true, "requires": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", @@ -82692,6 +85124,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, + "peer": true, "requires": { "minimist": "^1.2.5" } @@ -82701,6 +85134,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, + "peer": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -82711,7 +85145,8 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true } } }, @@ -82781,6 +85216,7 @@ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, + "peer": true, "requires": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", @@ -82788,38 +85224,15 @@ "terser": "^5.0.0" }, "dependencies": { - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, + "peer": true, "requires": { "randombytes": "^2.1.0" } - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } } } }, @@ -83188,7 +85601,8 @@ "version": "13.0.0", "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", - "dev": true + "dev": true, + "peer": true }, "sass": { "version": "1.52.3", @@ -83211,7 +85625,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "dev": true, + "peer": true }, "saxes": { "version": "6.0.0", @@ -83251,7 +85666,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true + "dev": true, + "peer": true }, "selenium-webdriver": { "version": "4.1.2", @@ -83373,6 +85789,7 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, + "peer": true, "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -83388,6 +85805,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "peer": true, "requires": { "ms": "2.0.0" } @@ -83397,6 +85815,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, + "peer": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -83408,19 +85827,22 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "dev": true, + "peer": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "dev": true, + "peer": true }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "dev": true, + "peer": true } } }, @@ -83524,7 +85946,8 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true + "dev": true, + "peer": true }, "should": { "version": "13.2.3", @@ -83934,6 +86357,7 @@ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, + "peer": true, "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -83947,6 +86371,7 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, + "peer": true, "requires": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -84098,7 +86523,8 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "dev": true, + "peer": true }, "stdopt": { "version": "2.2.0", @@ -84366,6 +86792,7 @@ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, + "peer": true, "requires": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -84390,7 +86817,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true + "dev": true, + "peer": true }, "strip-eof": { "version": "1.0.0", @@ -84571,23 +86999,6 @@ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, "cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -84607,15 +87018,6 @@ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "import-lazy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", @@ -84628,44 +87030,6 @@ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, "postcss": { "version": "8.4.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", @@ -84684,39 +87048,12 @@ "dev": true, "requires": {} }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, "write-file-atomic": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", @@ -84887,6 +87224,7 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, + "peer": true, "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -84908,6 +87246,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "requires": { "sprintf-js": "~1.0.2" } @@ -84917,6 +87256,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -85131,13 +87471,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true + "dev": true, + "peer": true }, "tempy": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, + "peer": true, "requires": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", @@ -85149,7 +87491,8 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true + "dev": true, + "peer": true } } }, @@ -85158,33 +87501,35 @@ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "peer": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" } }, "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -85205,18 +87550,6 @@ "webpack-sources": "^1.4.3" }, "dependencies": { - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -85242,18 +87575,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } } } }, @@ -85283,7 +87604,8 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "dev": true + "dev": true, + "peer": true }, "throttle-debounce": { "version": "3.0.1", @@ -85336,7 +87658,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "dev": true, + "peer": true }, "timers-browserify": { "version": "2.0.12", @@ -85357,6 +87680,13 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true, + "peer": true + }, + "tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", "dev": true }, "tiny-warning": { @@ -85492,11 +87822,10 @@ "dev": true }, "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true, - "optional": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true }, "trim-trailing-lines": { "version": "1.1.4", @@ -85514,7 +87843,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", - "dev": true + "dev": true, + "peer": true }, "ts-dedent": { "version": "2.1.1", @@ -85821,6 +88151,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "peer": true, "requires": { "crypto-random-string": "^2.0.0" } @@ -85957,7 +88288,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true + "dev": true, + "peer": true }, "unset-value": { "version": "1.0.0", @@ -86159,6 +88491,7 @@ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, + "peer": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", @@ -86312,6 +88645,317 @@ "unist-util-stringify-position": "^2.0.0" } }, + "vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "dev": true, + "requires": { + "esbuild": "^0.16.3", + "fsevents": "~2.3.2", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "rollup": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.0.tgz", + "integrity": "sha512-JmRYz44NjC1MjVF2VKxc0M1a97vn+cDxeqWmnwyAF4FvpjK8YFdHpaqvQB+3IxCvX05vJxKZkoMDU8TShhmJVA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + } + } + }, + "vite-plugin-checker": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.5.3.tgz", + "integrity": "sha512-upPESKsQTypC2S7LPjxu9HknOymNSToAAHTYSFHb0at5GKLcN1QGMAR5Hb+7KqZclGMVniXAj7QdhZv+fTx83Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "lodash.debounce": "^4.0.8", + "lodash.pick": "^4.4.0", + "npm-run-path": "^4.0.1", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "vite-plugin-svgr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz", + "integrity": "sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.2", + "@svgr/core": "^6.5.1" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + } + }, + "@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dev": true, + "requires": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dev": true, + "requires": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + } + }, + "@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dev": true, + "requires": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + } + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + } + } + }, + "vite-tsconfig-paths": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.0.3.tgz", + "integrity": "sha512-gRO2Q/tOkV+9kMht5tz90+IaEKvW2zCnvwJV3tp2ruPNZOTM5rF+yXorJT4ggmAMYEaJ3nyXjx5P5jY5FwiZ+A==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.0.1" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -86342,11 +88986,77 @@ } } }, + "vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true + }, + "vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dev": true, + "requires": { + "minimatch": "^3.0.5", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, + "requires": { + "vscode-languageserver-protocol": "3.16.0" + } + }, + "vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "requires": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "dev": true + }, + "vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + }, + "vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "dev": true + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, + "peer": true, "requires": { "browser-process-hrtime": "^1.0.0" } @@ -86648,6 +89358,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "peer": true, "requires": { "minimalistic-assert": "^1.0.0" } @@ -86724,12 +89435,6 @@ "dev": true, "requires": {} }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -86788,18 +89493,6 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, "terser-webpack-plugin": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", @@ -86883,6 +89576,7 @@ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", "dev": true, + "peer": true, "requires": { "tapable": "^2.0.0", "webpack-sources": "^2.2.0" @@ -86892,19 +89586,22 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "peer": true }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true + "dev": true, + "peer": true }, "webpack-sources": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "dev": true, + "peer": true, "requires": { "source-list-map": "^2.0.1", "source-map": "^0.6.1" @@ -86912,16 +89609,6 @@ } } }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -86997,7 +89684,8 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", - "dev": true + "dev": true, + "peer": true }, "whatwg-mimetype": { "version": "3.0.0", @@ -87037,6 +89725,32 @@ "is-symbol": "^1.0.3" } }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -87055,12 +89769,6 @@ "string-width": "^4.0.0" } }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -87078,6 +89786,7 @@ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.4.2.tgz", "integrity": "sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==", "dev": true, + "peer": true, "requires": { "idb": "^6.1.4", "workbox-core": "6.4.2" @@ -87087,7 +89796,8 @@ "version": "6.1.5", "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -87096,6 +89806,7 @@ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.4.2.tgz", "integrity": "sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==", "dev": true, + "peer": true, "requires": { "workbox-core": "6.4.2" } @@ -87105,6 +89816,7 @@ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.4.2.tgz", "integrity": "sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==", "dev": true, + "peer": true, "requires": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -87151,6 +89863,7 @@ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.2.tgz", "integrity": "sha512-JdEazx7qiVqTBzzBl5rolRwl5cmhihjfIcpqRzIZjtT6b18liVmDn/VlWpqW4C/qP2hrFFMLRV1wlex8ZVBPTg==", "dev": true, + "peer": true, "requires": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", @@ -87162,6 +89875,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", "dev": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -87174,6 +89888,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "peer": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -87185,13 +89900,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "peer": true }, "source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, + "peer": true, "requires": { "whatwg-url": "^7.0.0" } @@ -87201,6 +89918,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, + "peer": true, "requires": { "punycode": "^2.1.0" } @@ -87209,19 +89927,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "dev": true, + "peer": true }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "dev": true, + "peer": true }, "whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, + "peer": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -87235,6 +89956,7 @@ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.4.2.tgz", "integrity": "sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==", "dev": true, + "peer": true, "requires": { "workbox-core": "6.4.2" } @@ -87243,13 +89965,15 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.4.2.tgz", "integrity": "sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw==", - "dev": true + "dev": true, + "peer": true }, "workbox-expiration": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.4.2.tgz", "integrity": "sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==", "dev": true, + "peer": true, "requires": { "idb": "^6.1.4", "workbox-core": "6.4.2" @@ -87259,7 +89983,8 @@ "version": "6.1.5", "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==", - "dev": true + "dev": true, + "peer": true } } }, @@ -87268,6 +89993,7 @@ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.4.2.tgz", "integrity": "sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==", "dev": true, + "peer": true, "requires": { "workbox-background-sync": "6.4.2", "workbox-core": "6.4.2", @@ -87280,6 +90006,7 @@ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.4.2.tgz", "integrity": "sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==", "dev": true, + "peer": true, "requires": { "workbox-core": "6.4.2" } @@ -87289,6 +90016,7 @@ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.4.2.tgz", "integrity": "sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==", "dev": true, + "peer": true, "requires": { "workbox-core": "6.4.2", "workbox-routing": "6.4.2", @@ -87300,6 +90028,7 @@ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.4.2.tgz", "integrity": "sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==", "dev": true, + "peer": true, "requires": { "workbox-core": "6.4.2" } @@ -87309,6 +90038,7 @@ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.4.2.tgz", "integrity": "sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==", "dev": true, + "peer": true, "requires": { "workbox-cacheable-response": "6.4.2", "workbox-core": "6.4.2", @@ -87323,6 +90053,7 @@ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.4.2.tgz", "integrity": "sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==", "dev": true, + "peer": true, "requires": { "workbox-core": "6.4.2" } @@ -87332,6 +90063,7 @@ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.4.2.tgz", "integrity": "sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==", "dev": true, + "peer": true, "requires": { "workbox-core": "6.4.2" } @@ -87341,6 +90073,7 @@ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.4.2.tgz", "integrity": "sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==", "dev": true, + "peer": true, "requires": { "workbox-core": "6.4.2", "workbox-routing": "6.4.2" @@ -87350,13 +90083,15 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.4.2.tgz", "integrity": "sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg==", - "dev": true + "dev": true, + "peer": true }, "workbox-webpack-plugin": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.4.2.tgz", "integrity": "sha512-CiEwM6kaJRkx1cP5xHksn13abTzUqMHiMMlp5Eh/v4wRcedgDTyv6Uo8+Hg9MurRbHDosO5suaPyF9uwVr4/CQ==", "dev": true, + "peer": true, "requires": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", @@ -87371,6 +90106,7 @@ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.4.2.tgz", "integrity": "sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==", "dev": true, + "peer": true, "requires": { "@types/trusted-types": "^2.0.2", "workbox-core": "6.4.2" diff --git a/airbyte-webapp/package.json b/airbyte-webapp/package.json index b5f62ab1726be..9c902627e05d5 100644 --- a/airbyte-webapp/package.json +++ b/airbyte-webapp/package.json @@ -8,11 +8,11 @@ "scripts": { "prepare": "cd .. && husky install airbyte-webapp/.husky", "prestart": "npm run generate-client", - "start": "node -r ./scripts/dev-overwrites.js ./node_modules/.bin/craco start", + "start": "node -r ./scripts/dev-overwrites.js ./node_modules/.bin/vite", "prestart:cloud": "npm run generate-client", - "start:cloud": "AB_ENV=${AB_ENV-frontend-dev} node -r ./scripts/environment.js -r ./scripts/dev-overwrites.js ./node_modules/.bin/craco start", + "start:cloud": "AB_ENV=${AB_ENV-frontend-dev} node -r ./scripts/environment.js -r ./scripts/dev-overwrites.js ./node_modules/.bin/vite", "prebuild": "npm run generate-client", - "build": "BUILD_PATH='./build/app' craco build", + "build": "vite build", "pretest": "npm run generate-client", "test": "jest --watch", "test:ci": "jest --watchAll=false --silent", @@ -21,7 +21,7 @@ "storybook": "start-storybook -p 9009 --quiet", "build:storybook": "build-storybook -o 'build/storybook'", "lint": "eslint --ext js,ts,tsx src", - "stylelint": "stylelint \"**/*.{css,scss}\"", + "stylelint": "stylelint 'src/**/*.{css,scss}'", "stylelint-check": "stylelint-config-prettier-scss-check", "license-check": "node ./scripts/license-check.js", "generate-client": "orval", @@ -93,7 +93,6 @@ "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", - "@craco/craco": "^7.0.0-alpha.7", "@storybook/addon-essentials": "^6.5.7", "@storybook/builder-webpack5": "^6.5.7", "@storybook/manager-webpack5": "^6.5.7", @@ -125,14 +124,16 @@ "@types/unist": "^2.0.5", "@typescript-eslint/eslint-plugin": "^5.27.1", "@typescript-eslint/parser": "^5.27.1", + "@vitejs/plugin-basic-ssl": "^1.0.1", + "@vitejs/plugin-react": "^3.0.1", "babel-jest": "^29.3.1", "dotenv": "^16.0.3", - "eslint-config-prettier": "^8.5.0", + "eslint-config-prettier": "^8.6.0", "eslint-config-react-app": "^7.0.1", "eslint-plugin-css-modules": "^2.11.0", "eslint-plugin-jest": "^26.5.3", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-unused-imports": "^2.0.0", "express": "^4.18.1", "husky": "^8.0.1", @@ -140,11 +141,11 @@ "jest-environment-jsdom": "^29.3.1", "license-checker": "^25.0.1", "lint-staged": "^12.3.7", - "mini-css-extract-plugin": "^2.6.1", + "meow": "^9.0.0", "node-fetch": "^2.6.7", + "optionator": "^0.9.1", "orval": "^6.11.0-alpha.10", "prettier": "^2.6.2", - "react-scripts": "^5.0.1", "react-select-event": "^5.5.0", "storybook-addon-mock": "^2.4.1", "stylelint": "^14.9.1", @@ -156,7 +157,11 @@ "timezone-mock": "^1.3.4", "tmpl": "^1.0.5", "ts-node": "^10.8.1", - "typescript": "^4.7.3" + "typescript": "^4.7.3", + "vite": "^4.0.4", + "vite-plugin-checker": "^0.5.3", + "vite-plugin-svgr": "^2.4.0", + "vite-tsconfig-paths": "^4.0.3" }, "overrides": { "minimatch": "^3.0.5" diff --git a/airbyte-webapp/packages/vite-plugins/doc-middleware.ts b/airbyte-webapp/packages/vite-plugins/doc-middleware.ts new file mode 100644 index 0000000000000..15ea716b37a0e --- /dev/null +++ b/airbyte-webapp/packages/vite-plugins/doc-middleware.ts @@ -0,0 +1,27 @@ +import type { Connect, Plugin } from "vite"; + +import express from "express"; + +export function docMiddleware(): Plugin { + return { + name: "airbyte/doc-middleware", + configureServer(server) { + // Serve the docs used in the sidebar. During building Gradle will copy those into the docker image + // Relavant gradle task :airbyte-webapp:copyDocs + server.middlewares.use( + "/docs/integrations", + express.static(`${__dirname}/../../../docs/integrations`) as Connect.NextHandleFunction + ); + // workaround for adblockers to serve google ads docs in development + server.middlewares.use( + "/docs/integrations/sources/gglad.md", + express.static(`${__dirname}/../../../docs/integrations/sources/google-ads.md`) as Connect.NextHandleFunction + ); + // Server assets that can be used during. Related gradle task: :airbyte-webapp:copyDocAssets + server.middlewares.use( + "/docs/.gitbook", + express.static(`${__dirname}/../../../docs/.gitbook`) as Connect.NextHandleFunction + ); + }, + }; +} diff --git a/airbyte-webapp/packages/vite-plugins/index.ts b/airbyte-webapp/packages/vite-plugins/index.ts new file mode 100644 index 0000000000000..3a37b33207086 --- /dev/null +++ b/airbyte-webapp/packages/vite-plugins/index.ts @@ -0,0 +1,2 @@ +export { patchReactVirtualized } from "./patch-react-virtualized"; +export { docMiddleware } from "./doc-middleware"; diff --git a/airbyte-webapp/packages/vite-plugins/patch-react-virtualized.ts b/airbyte-webapp/packages/vite-plugins/patch-react-virtualized.ts new file mode 100644 index 0000000000000..76d345c2113a5 --- /dev/null +++ b/airbyte-webapp/packages/vite-plugins/patch-react-virtualized.ts @@ -0,0 +1,29 @@ +import type { Plugin } from "vite"; + +import fs from "fs"; +import path from "path"; + +// Patches the react-virtualized library which is pulled in by react-lazylog to remove +// a broken import in it. See https://github.com/bvaughn/react-virtualized/issues/1632 +const WRONG_CODE = `import { bpfrpt_proptype_WindowScroller } from "../WindowScroller.js";`; +export function patchReactVirtualized(): Plugin { + return { + name: "airbyte/patch-react-virtualized", + // Note: we cannot use the `transform` hook here + // because libraries are pre-bundled in vite directly, + // plugins aren't able to hack that step currently. + // so instead we manually edit the file in node_modules. + // all we need is to find the timing before pre-bundling. + configResolved() { + const file = require + .resolve("react-lazylog/node_modules/react-virtualized") + .replace( + path.join("dist", "commonjs", "index.js"), + path.join("dist", "es", "WindowScroller", "utils", "onScroll.js") + ); + const code = fs.readFileSync(file, "utf-8"); + const modified = code.replace(WRONG_CODE, ""); + fs.writeFileSync(file, modified); + }, + }; +} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/BulkEditPanel.test.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/BulkEditPanel.test.tsx index 8fadfbbd9d904..ab9dcc6cd860d 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/BulkEditPanel.test.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/BulkEditPanel.test.tsx @@ -186,7 +186,7 @@ const renderBulkEditPanel = () => describe("", () => { beforeAll(() => { - // @ts-ignore + // @ts-expect-error Okay for test ReactDOM.createPortal = (element) => { return element; }; diff --git a/airbyte-webapp/src/config/defaultConfig.ts b/airbyte-webapp/src/config/defaultConfig.ts index 140c3537cc5ed..d4c08aff96c24 100644 --- a/airbyte-webapp/src/config/defaultConfig.ts +++ b/airbyte-webapp/src/config/defaultConfig.ts @@ -4,8 +4,8 @@ const defaultConfig: Config = { segment: { enabled: true, token: "" }, healthCheckInterval: 20000, version: "dev", - apiUrl: `${window.location.protocol}//${window.location.hostname}:8001/api`, - connectorBuilderApiUrl: `${window.location.protocol}//${window.location.hostname}:8003`, + apiUrl: `http://${window.location.hostname}:8001/api`, + connectorBuilderApiUrl: `http://${window.location.hostname}:8003`, integrationUrl: "/docs", oauthRedirectUrl: `${window.location.protocol}//${window.location.host}`, }; diff --git a/airbyte-webapp/src/config/types.ts b/airbyte-webapp/src/config/types.ts index 0a2b8e3f75b0b..514d4b5ff917e 100644 --- a/airbyte-webapp/src/config/types.ts +++ b/airbyte-webapp/src/config/types.ts @@ -15,7 +15,6 @@ declare global { REACT_APP_INTEGRATION_DOCS_URLS?: string; SEGMENT_TOKEN?: string; LAUNCHDARKLY_KEY?: string; - analytics: SegmentAnalytics.AnalyticsJS; } } diff --git a/airbyte-webapp/src/hooks/services/Feature/FeatureService.tsx b/airbyte-webapp/src/hooks/services/Feature/FeatureService.tsx index 778df64f7e5ba..d34d2e9ba9c13 100644 --- a/airbyte-webapp/src/hooks/services/Feature/FeatureService.tsx +++ b/airbyte-webapp/src/hooks/services/Feature/FeatureService.tsx @@ -46,6 +46,10 @@ export const FeatureService: React.FC + import { useEffect } from "react"; // if token is undefined calls to segment will be a no-op. diff --git a/airbyte-webapp/src/react-app-env.d.ts b/airbyte-webapp/src/react-app-env.d.ts deleted file mode 100644 index 6431bc5fc6b2c..0000000000000 --- a/airbyte-webapp/src/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/airbyte-webapp/src/setupProxy.js b/airbyte-webapp/src/setupProxy.js deleted file mode 100644 index c2ce4122da9f8..0000000000000 --- a/airbyte-webapp/src/setupProxy.js +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ - -/** - * This file is used by create-react-app to configure the express instance used - * to serve files during development. - */ -const express = require("express"); - -module.exports = (app) => { - // Set the CSP header in development to detect potential breakages. - // This should always match the header in airbyte-webapp/nginx/default.conf.template - app.use((req, resp, next) => { - resp.header("Content-Security-Policy", "script-src * 'unsafe-inline'; worker-src self blob:;"); - next(); - }); - // Serve the doc markdowns and assets that are also bundled into the docker image - app.use("/docs/integrations", express.static(`${__dirname}/../../docs/integrations`)); - // workaround for adblockers to serve google ads docs in development - app.use( - "/docs/integrations/sources/gglad.md", - express.static(`${__dirname}/../../docs/integrations/sources/google-ads.md`) - ); - app.use("/docs/.gitbook", express.static(`${__dirname}/../../docs/.gitbook`)); -}; diff --git a/airbyte-webapp/src/types/react-app-env.d.ts b/airbyte-webapp/src/types/react-app-env.d.ts deleted file mode 100644 index 6431bc5fc6b2c..0000000000000 --- a/airbyte-webapp/src/types/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/airbyte-webapp/src/types/rehype-urls.d.ts b/airbyte-webapp/src/types/rehype-urls.d.ts index fdb16590f8b9d..94f2316f72e1e 100644 --- a/airbyte-webapp/src/types/rehype-urls.d.ts +++ b/airbyte-webapp/src/types/rehype-urls.d.ts @@ -1,2 +1 @@ -/// declare module "rehype-urls"; diff --git a/airbyte-webapp/src/views/common/StoreProvider.tsx b/airbyte-webapp/src/views/common/StoreProvider.tsx index 6c1ad6a3e6118..3b228e0ec411f 100644 --- a/airbyte-webapp/src/views/common/StoreProvider.tsx +++ b/airbyte-webapp/src/views/common/StoreProvider.tsx @@ -15,7 +15,11 @@ const queryClient = new QueryClient({ const StoreProvider: React.FC> = ({ children }) => ( - + {children} ); diff --git a/airbyte-webapp/src/vite-env.d.ts b/airbyte-webapp/src/vite-env.d.ts new file mode 100644 index 0000000000000..11f02fe2a0061 --- /dev/null +++ b/airbyte-webapp/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/airbyte-webapp/tsconfig.json b/airbyte-webapp/tsconfig.json index 2648d04312fe5..ec543a1239f2a 100644 --- a/airbyte-webapp/tsconfig.json +++ b/airbyte-webapp/tsconfig.json @@ -1,11 +1,12 @@ { "compilerOptions": { - "target": "es5", + "target": "ESNext", "lib": ["dom", "dom.iterable", "esnext"], + "types": ["vite/client", "vite-plugin-svgr/client"], "baseUrl": "src", "allowJs": false, "skipLibCheck": true, - "esModuleInterop": true, + "esModuleInterop": false, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, diff --git a/airbyte-webapp/vite.config.ts b/airbyte-webapp/vite.config.ts new file mode 100644 index 0000000000000..17bd40e531551 --- /dev/null +++ b/airbyte-webapp/vite.config.ts @@ -0,0 +1,81 @@ +import path from "path"; + +import basicSsl from "@vitejs/plugin-basic-ssl"; +import react from "@vitejs/plugin-react"; +import { loadEnv, UserConfig } from "vite"; +import { defineConfig } from "vite"; +import checker from "vite-plugin-checker"; +import svgrPlugin from "vite-plugin-svgr"; +import viteTsconfigPaths from "vite-tsconfig-paths"; + +import { docMiddleware, patchReactVirtualized } from "./packages/vite-plugins"; + +export default defineConfig(({ mode }) => { + // Load variables from all .env files + process.env = { + ...process.env, + ...loadEnv(mode, __dirname, ""), + }; + + // Environment variables that should be available in the frontend + const frontendEnvVariables = loadEnv(mode, __dirname, ["REACT_APP_"]); + // Create an object of defines that will shim all required process.env variables. + const processEnv = { + "process.env.NODE_ENV": JSON.stringify(mode), + ...Object.fromEntries( + Object.entries(frontendEnvVariables).map(([key, value]) => [`process.env.${key}`, JSON.stringify(value)]) + ), + }; + + const config: UserConfig = { + plugins: [ + basicSsl(), + react(), + viteTsconfigPaths(), + svgrPlugin(), + checker({ + // Enable checks while building the app (not just in dev mode) + enableBuild: true, + overlay: { + initialIsOpen: false, + position: "br", + // Align error popover button with the react-query dev tool button + badgeStyle: "transform: translate(-135px,-11px)", + }, + eslint: { lintCommand: `eslint --max-warnings=0 --ext js,ts,tsx src` }, + stylelint: { + lintCommand: 'stylelint "src/**/*.{css,scss}"', + // We need to overwrite this during development, since otherwise `files` are wrongly + // still containing the quotes around them, which they shouldn't + dev: { overrideConfig: { files: "src/**/*.{css,scss}" } }, + }, + typescript: true, + }), + patchReactVirtualized(), + docMiddleware(), + ], + // Use `REACT_APP_` as a prefix for environment variables that should be accessible from within FE code. + envPrefix: ["REACT_APP_"], + build: { + outDir: "build/app", + }, + server: { + port: Number(process.env.PORT) || 3000, + strictPort: true, + headers: { + "Content-Security-Policy": "script-src * 'unsafe-inline'; worker-src self blob:;", + }, + }, + define: { + ...processEnv, + }, + resolve: { + alias: { + // Allow @use "scss/" imports in SASS + scss: path.resolve(__dirname, "./src/scss"), + }, + }, + }; + + return config; +}); From 1e42895b586101bf6debb2c1ee214d2014f1d24d Mon Sep 17 00:00:00 2001 From: Jonathan Pearlin Date: Mon, 23 Jan 2023 15:10:34 -0500 Subject: [PATCH 040/195] Update to latest Micronaut release (#21742) --- deps.toml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/deps.toml b/deps.toml index 0fa2bd639d690..14c346569df40 100644 --- a/deps.toml +++ b/deps.toml @@ -20,7 +20,10 @@ jooq = "3.13.4" junit-jupiter = "5.9.1" log4j = "2.17.2" lombok = "1.18.24" -micronaut = "3.8.1" +micronaut = "3.8.2" +micronaut-data = "3.9.4" +micronaut-jaxrs = "3.4.0" +micronaut-security = "3.9.2" micronaut-test = "3.8.0" platform-testcontainers = "1.17.3" postgresql = "42.3.5" @@ -103,6 +106,7 @@ platform-testcontainers-postgresql = { module = "org.testcontainers:postgresql", postgresql = { module = "org.postgresql:postgresql", version.ref = "postgresql" } quartz-scheduler = { module = "org.quartz-scheduler:quartz", version = "2.3.2" } reactor-core = { module = "io.projectreactor:reactor-core", version.ref = "reactor" } +reactor-test = { module = "io.projectreactor:reactor-test", version.ref = "reactor" } s3 = { module = "software.amazon.awssdk:s3", version = "2.16.84" } slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } spotbugs-annotations = { module = "com.github.spotbugs:spotbugs-annotations", version = "4.7.3" } @@ -117,21 +121,22 @@ jakarta-inject = { module = "jakarta.annotation:jakarta.annotation-api", version javax-transaction = { module = "javax.transaction:javax.transaction-api", version = "1.3" } micronaut-bom = { module = "io.micronaut:micronaut-bom", version.ref = "micronaut" } micronaut-cache-caffeine = { module = "io.micronaut.cache:micronaut-cache-caffeine", version = "3.5.0"} -micronaut-data-processor = { module = "io.micronaut.data:micronaut-data-processor", version = "3.9.4" } -micronaut-data-tx = { module = "io.micronaut.data:micronaut-data-tx", version = "3.9.4" } +micronaut-data-processor = { module = "io.micronaut.data:micronaut-data-processor", version.ref = "micronaut-data" } +micronaut-data-tx = { module = "io.micronaut.data:micronaut-data-tx", version.ref = "micronaut-data" } micronaut-flyway = { module = "io.micronaut.flyway:micronaut-flyway", version = "5.4.1" } micronaut-inject = { module = "io.micronaut:micronaut-inject" } +micronaut-http = { module = "io.micronaut:micronaut-http", version.ref = "micronaut" } micronaut-http-client = { module = "io.micronaut:micronaut-http-client" } -micronaut-http-server-netty = { module = "io.micronaut:micronaut-http-server-netty" } +micronaut-http-server-netty = { module = "io.micronaut:micronaut-http-server-netty", version.ref = "micronaut" } micronaut-inject-java = { module = "io.micronaut:micronaut-inject-java", version.ref = "micronaut" } -micronaut-jaxrs-processor = { module = "io.micronaut.jaxrs:micronaut-jaxrs-processor", version = "3.4.0" } -micronaut-jaxrs-server = { module = "io.micronaut.jaxrs:micronaut-jaxrs-server", version = "3.4.0" } +micronaut-jaxrs-processor = { module = "io.micronaut.jaxrs:micronaut-jaxrs-processor", version.ref = "micronaut-jaxrs" } +micronaut-jaxrs-server = { module = "io.micronaut.jaxrs:micronaut-jaxrs-server", version.ref = "micronaut-jaxrs" } micronaut-jdbc = { module = "io.micronaut.sql:micronaut-jdbc", version = "4.7.2" } micronaut-jdbc-hikari = { module = "io.micronaut.sql:micronaut-jdbc-hikari" } micronaut-jooq = { module = "io.micronaut.sql:micronaut-jooq" } micronaut-management = { module = "io.micronaut:micronaut-management" } micronaut-runtime = { module = "io.micronaut:micronaut-runtime" } -micronaut-security = { module = "io.micronaut.security:micronaut-security", version = "3.9.0" } +micronaut-security = { module = "io.micronaut.security:micronaut-security", version.ref = "micronaut-security" } micronaut-test-core = { module = "io.micronaut.test:micronaut-test-core", version.ref = "micronaut-test" } micronaut-test-junit5 = { module = "io.micronaut.test:micronaut-test-junit5", version.ref = "micronaut-test" } micronaut-validation = { module = "io.micronaut:micronaut-validation" } From eb2d980d7a0c1afcd982d5e16f78a4b13294f305 Mon Sep 17 00:00:00 2001 From: Catherine Noll Date: Mon, 23 Jan 2023 15:12:16 -0500 Subject: [PATCH 041/195] [Connector Builder Server] add endpoint to resolve $refs and $options (#21565) --- .../generated/apis/default_api_interface.py | 26 +++ .../generated/models/resolve_manifest.py | 24 +++ .../models/resolve_manifest_request_body.py | 24 +++ .../connector_builder/impl/default_api.py | 43 +++- airbyte-connector-builder-server/setup.py | 2 +- .../src/main/openapi/openapi.yaml | 37 ++++ .../impl/test_default_api.py | 193 ++++++++++++++++++ 7 files changed, 340 insertions(+), 9 deletions(-) create mode 100644 airbyte-connector-builder-server/connector_builder/generated/models/resolve_manifest.py create mode 100644 airbyte-connector-builder-server/connector_builder/generated/models/resolve_manifest_request_body.py diff --git a/airbyte-connector-builder-server/connector_builder/generated/apis/default_api_interface.py b/airbyte-connector-builder-server/connector_builder/generated/apis/default_api_interface.py index 70e031d41df93..1af2b51cff7ee 100644 --- a/airbyte-connector-builder-server/connector_builder/generated/apis/default_api_interface.py +++ b/airbyte-connector-builder-server/connector_builder/generated/apis/default_api_interface.py @@ -27,6 +27,8 @@ from connector_builder.generated.models.invalid_input_exception_info import InvalidInputExceptionInfo from connector_builder.generated.models.known_exception_info import KnownExceptionInfo +from connector_builder.generated.models.resolve_manifest import ResolveManifest +from connector_builder.generated.models.resolve_manifest_request_body import ResolveManifestRequestBody from connector_builder.generated.models.stream_read import StreamRead from connector_builder.generated.models.stream_read_request_body import StreamReadRequestBody from connector_builder.generated.models.streams_list_read import StreamsListRead @@ -65,6 +67,15 @@ async def read_stream( Reads a specific stream in the source. TODO in a later phase - only read a single slice of data. """ + @abstractmethod + async def resolve_manifest( + self, + resolve_manifest_request_body: ResolveManifestRequestBody = Body(None, description=""), + ) -> ResolveManifest: + """ + Given a JSON manifest, returns a JSON manifest with all of the $refs and $options resolved and flattened + """ + def _assert_signature_is_set(method: Callable) -> None: """ @@ -143,5 +154,20 @@ def initialize_router(api: DefaultApi) -> APIRouter: response_model_by_alias=True, ) + _assert_signature_is_set(api.resolve_manifest) + router.add_api_route( + "/v1/manifest/resolve", + endpoint=api.resolve_manifest, + methods=["POST"], + responses={ + 200: {"model": ResolveManifest, "description": "Successful operation"}, + 400: {"model": KnownExceptionInfo, "description": "Exception occurred; see message for details."}, + 422: {"model": InvalidInputExceptionInfo, "description": "Input failed validation"}, + }, + tags=["default"], + summary="Given a JSON manifest, returns a JSON manifest with all of the $refs and $options resolved and flattened", + response_model_by_alias=True, + ) + return router diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/resolve_manifest.py b/airbyte-connector-builder-server/connector_builder/generated/models/resolve_manifest.py new file mode 100644 index 0000000000000..81bcc339a5373 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/resolve_manifest.py @@ -0,0 +1,24 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class ResolveManifest(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ResolveManifest - a model defined in OpenAPI + + manifest: The manifest of this ResolveManifest. + """ + + manifest: Dict[str, Any] + +ResolveManifest.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/resolve_manifest_request_body.py b/airbyte-connector-builder-server/connector_builder/generated/models/resolve_manifest_request_body.py new file mode 100644 index 0000000000000..91aded8ec5239 --- /dev/null +++ b/airbyte-connector-builder-server/connector_builder/generated/models/resolve_manifest_request_body.py @@ -0,0 +1,24 @@ +# coding: utf-8 + +from __future__ import annotations +from datetime import date, datetime # noqa: F401 + +import re # noqa: F401 +from typing import Any, Dict, List, Optional # noqa: F401 + +from pydantic import AnyUrl, BaseModel, EmailStr, validator # noqa: F401 + + +class ResolveManifestRequestBody(BaseModel): + """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + + Do not edit the class manually. + + ResolveManifestRequestBody - a model defined in OpenAPI + + manifest: The manifest of this ResolveManifestRequestBody. + """ + + manifest: Dict[str, Any] + +ResolveManifestRequestBody.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/impl/default_api.py b/airbyte-connector-builder-server/connector_builder/impl/default_api.py index ef7ad588c3e7f..973defc09c418 100644 --- a/airbyte-connector-builder-server/connector_builder/impl/default_api.py +++ b/airbyte-connector-builder-server/connector_builder/impl/default_api.py @@ -10,10 +10,13 @@ from urllib.parse import parse_qs, urljoin, urlparse from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, Type +from airbyte_cdk.sources.declarative.manifest_declarative_source import ManifestDeclarativeSource from airbyte_cdk.utils.schema_inferrer import SchemaInferrer from connector_builder.generated.apis.default_api_interface import DefaultApi from connector_builder.generated.models.http_request import HttpRequest from connector_builder.generated.models.http_response import HttpResponse +from connector_builder.generated.models.resolve_manifest import ResolveManifest +from connector_builder.generated.models.resolve_manifest_request_body import ResolveManifestRequestBody from connector_builder.generated.models.stream_read import StreamRead from connector_builder.generated.models.stream_read_pages import StreamReadPages from connector_builder.generated.models.stream_read_request_body import StreamReadRequestBody @@ -104,7 +107,8 @@ async def list_streams(self, streams_list_request_body: StreamsListRequestBody = ) except Exception as error: self.logger.error( - f"Could not list streams with with error: {error.args[0]} - {DefaultApiImpl._get_stacktrace_as_string(error)}") + f"Could not list streams with with error: {error.args[0]} - {DefaultApiImpl._get_stacktrace_as_string(error)}" + ) raise HTTPException(status_code=400, detail=f"Could not list streams with with error: {error.args[0]}") return StreamsListRead(streams=stream_list_read) @@ -128,9 +132,9 @@ async def read_stream(self, stream_read_request_body: StreamReadRequestBody = Bo log_messages = [] try: for message_group in self._get_message_groups( - adapter.read_stream(stream_read_request_body.stream, stream_read_request_body.config), - schema_inferrer, - record_limit, + adapter.read_stream(stream_read_request_body.stream, stream_read_request_body.config), + schema_inferrer, + record_limit, ): if isinstance(message_group, AirbyteLogMessage): log_messages.append({"message": message_group.message}) @@ -144,11 +148,34 @@ async def read_stream(self, stream_read_request_body: StreamReadRequestBody = Bo detail=f"Could not perform read with with error: {error.args[0]}", ) - return StreamRead(logs=log_messages, slices=[single_slice], - inferred_schema=schema_inferrer.get_stream_schema(stream_read_request_body.stream)) + return StreamRead( + logs=log_messages, slices=[single_slice], inferred_schema=schema_inferrer.get_stream_schema(stream_read_request_body.stream) + ) + + async def resolve_manifest( + self, resolve_manifest_request_body: ResolveManifestRequestBody = Body(None, description="") + ) -> ResolveManifest: + """ + Using the provided manifest, resolves $refs and $options and returns the resulting manifest to the client. + :param manifest_resolve_request_body: Input manifest whose $refs and $options will be resolved + :return: Airbyte record messages produced by the sync grouped by slice and page + """ + try: + return ResolveManifest( + manifest=ManifestDeclarativeSource( + resolve_manifest_request_body.manifest, construct_using_pydantic_models=True + ).resolved_manifest + ) + except Exception as error: + self.logger.error(f"Could not resolve manifest with error: {error.args[0]} - {self._get_stacktrace_as_string(error)}") + raise HTTPException( + status_code=400, + detail=f"Could not resolve manifest with error: {error.args[0]}", + ) - def _get_message_groups(self, messages: Iterator[AirbyteMessage], schema_inferrer: SchemaInferrer, limit: int) -> Iterable[ - Union[StreamReadPages, AirbyteLogMessage]]: + def _get_message_groups( + self, messages: Iterator[AirbyteMessage], schema_inferrer: SchemaInferrer, limit: int + ) -> Iterable[Union[StreamReadPages, AirbyteLogMessage]]: """ Message groups are partitioned according to when request log messages are received. Subsequent response log messages and record messages belong to the prior request log message and when we encounter another request, append the latest diff --git a/airbyte-connector-builder-server/setup.py b/airbyte-connector-builder-server/setup.py index e25a3dab72266..d50fed19aee43 100644 --- a/airbyte-connector-builder-server/setup.py +++ b/airbyte-connector-builder-server/setup.py @@ -41,7 +41,7 @@ }, packages=find_packages(exclude=("unit_tests", "integration_tests", "docs")), package_data={}, - install_requires=["airbyte-cdk==0.21.0", "fastapi", "uvicorn"], + install_requires=["airbyte-cdk==0.22", "fastapi", "uvicorn"], python_requires=">=3.9.11", extras_require={ "tests": [ diff --git a/airbyte-connector-builder-server/src/main/openapi/openapi.yaml b/airbyte-connector-builder-server/src/main/openapi/openapi.yaml index 61a828e3fbf0e..a104000d0fcb1 100644 --- a/airbyte-connector-builder-server/src/main/openapi/openapi.yaml +++ b/airbyte-connector-builder-server/src/main/openapi/openapi.yaml @@ -69,6 +69,27 @@ paths: schema: type: string description: Connector manifest template string + /v1/manifest/resolve: + post: + summary: Given a JSON manifest, returns a JSON manifest with all of the $refs and $options resolved and flattened + operationId: resolveManifest + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ResolveManifestRequestBody" + required: true + responses: + "200": + description: Successful operation + content: + application/json: + schema: + $ref: "#/components/schemas/ResolveManifest" + "400": + $ref: "#/components/responses/ExceptionResponse" + "422": + $ref: "#/components/responses/InvalidInputResponse" components: schemas: @@ -237,6 +258,22 @@ components: # description: list of slices that will be retrieved for this stream # items: # type: object + ResolveManifestRequestBody: + type: object + required: + - manifest + properties: + manifest: + type: object + description: The config-based connector manifest contents + ResolveManifest: + type: object + required: + - manifest + properties: + manifest: + type: object + description: The config-based connector manifest contents with $refs and $options resolved # The following exception structs were copied from airbyte-api/src/main/openapi/config.yaml InvalidInputProperty: diff --git a/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py b/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py index d9bbf6a07fa17..4dead48f3dad6 100644 --- a/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py +++ b/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py @@ -11,6 +11,8 @@ from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, AirbyteRecordMessage, Level, Type from connector_builder.generated.models.http_request import HttpRequest from connector_builder.generated.models.http_response import HttpResponse +from connector_builder.generated.models.resolve_manifest import ResolveManifest +from connector_builder.generated.models.resolve_manifest_request_body import ResolveManifestRequestBody from connector_builder.generated.models.stream_read import StreamRead from connector_builder.generated.models.stream_read_pages import StreamReadPages from connector_builder.generated.models.stream_read_request_body import StreamReadRequestBody @@ -623,6 +625,197 @@ def test_create_response_from_log_message(log_message, expected_response): assert actual_response == expected_response +def test_resolve_manifest(): + _stream_name = "stream_with_custom_requester" + _stream_primary_key = "id" + _stream_url_base = "https://api.sendgrid.com" + _stream_options = {"name": _stream_name, "primary_key": _stream_primary_key, "url_base": _stream_url_base} + + manifest = { + "version": "version", + "definitions": { + "schema_loader": {"name": "{{ options.stream_name }}", "file_path": "./source_sendgrid/schemas/{{ options.name }}.yaml"}, + "retriever": { + "paginator": { + "type": "DefaultPaginator", + "page_size": 10, + "page_size_option": {"inject_into": "request_parameter", "field_name": "page_size"}, + "page_token_option": {"inject_into": "path"}, + "pagination_strategy": {"type": "CursorPagination", "cursor_value": "{{ response._metadata.next }}"}, + }, + "requester": { + "path": "/v3/marketing/lists", + "authenticator": {"type": "BearerAuthenticator", "api_token": "{{ config.apikey }}"}, + "request_parameters": {"page_size": 10}, + }, + "record_selector": {"extractor": {"field_pointer": ["result"]}}, + }, + }, + "streams": [ + { + "type": "DeclarativeStream", + "$options": _stream_options, + "schema_loader": {"$ref": "*ref(definitions.schema_loader)"}, + "retriever": "*ref(definitions.retriever)", + }, + ], + "check": {"type": "CheckStream", "stream_names": ["lists"]}, + } + + expected_resolved_manifest = { + "type": "DeclarativeSource", + "version": "version", + "definitions": { + "schema_loader": {"name": "{{ options.stream_name }}", "file_path": "./source_sendgrid/schemas/{{ options.name }}.yaml"}, + "retriever": { + "paginator": { + "type": "DefaultPaginator", + "page_size": 10, + "page_size_option": {"inject_into": "request_parameter", "field_name": "page_size"}, + "page_token_option": {"inject_into": "path"}, + "pagination_strategy": {"type": "CursorPagination", "cursor_value": "{{ response._metadata.next }}"}, + }, + "requester": { + "path": "/v3/marketing/lists", + "authenticator": {"type": "BearerAuthenticator", "api_token": "{{ config.apikey }}"}, + "request_parameters": {"page_size": 10}, + }, + "record_selector": {"extractor": {"field_pointer": ["result"]}}, + }, + }, + "streams": [ + { + "type": "DeclarativeStream", + "schema_loader": { + "type": "JsonFileSchemaLoader", + "name": "{{ options.stream_name }}", + "file_path": "./source_sendgrid/schemas/{{ options.name }}.yaml", + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "retriever": { + "type": "SimpleRetriever", + "paginator": { + "type": "DefaultPaginator", + "page_size": 10, + "page_size_option": { + "type": "RequestOption", + "inject_into": "request_parameter", + "field_name": "page_size", + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "page_token_option": { + "type": "RequestOption", + "inject_into": "path", + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "pagination_strategy": { + "type": "CursorPagination", + "cursor_value": "{{ response._metadata.next }}", + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "requester": { + "type": "HttpRequester", + "path": "/v3/marketing/lists", + "authenticator": { + "type": "BearerAuthenticator", + "api_token": "{{ config.apikey }}", + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "request_parameters": {"page_size": 10}, + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "record_selector": { + "type": "RecordSelector", + "extractor": { + "type": "DpathExtractor", + "field_pointer": ["result"], + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + "name": _stream_name, + "primary_key": _stream_primary_key, + "url_base": _stream_url_base, + "$options": _stream_options, + }, + ], + "check": {"type": "CheckStream", "stream_names": ["lists"]}, + } + + api = DefaultApiImpl(LowCodeSourceAdapter) + + loop = asyncio.get_event_loop() + actual_response: ResolveManifest = loop.run_until_complete(api.resolve_manifest(ResolveManifestRequestBody(manifest=manifest))) + assert actual_response.manifest == expected_resolved_manifest + + +def test_resolve_manifest_unresolvable_references(): + expected_status_code = 400 + + invalid_manifest = { + "version": "version", + "definitions": {}, + "streams": [ + {"type": "DeclarativeStream", "retriever": "*ref(definitions.retriever)"}, + ], + "check": {"type": "CheckStream", "stream_names": ["lists"]}, + } + + api = DefaultApiImpl(LowCodeSourceAdapter) + loop = asyncio.get_event_loop() + with pytest.raises(HTTPException) as actual_exception: + loop.run_until_complete(api.resolve_manifest(ResolveManifestRequestBody(manifest=invalid_manifest))) + + assert "Undefined reference *ref(definitions.retriever)" in actual_exception.value.detail + assert actual_exception.value.status_code == expected_status_code + + +def test_resolve_manifest_invalid(): + expected_status_code = 400 + invalid_manifest = {"version": "version"} + + api = DefaultApiImpl(LowCodeSourceAdapter) + loop = asyncio.get_event_loop() + with pytest.raises(HTTPException) as actual_exception: + loop.run_until_complete(api.resolve_manifest(ResolveManifestRequestBody(manifest=invalid_manifest))) + + assert "Could not resolve manifest with error" in actual_exception.value.detail + assert actual_exception.value.status_code == expected_status_code + + def make_mock_adapter_cls(return_value: Iterator) -> MagicMock: mock_source_adapter_cls = MagicMock() mock_source_adapter = MagicMock() From 7b57968cc110cd8d9294dcd39c437a20d4b61f8d Mon Sep 17 00:00:00 2001 From: Michael Siega <109092231+mfsiega-airbyte@users.noreply.github.com> Date: Mon, 23 Jan 2023 21:18:58 +0100 Subject: [PATCH 042/195] fix query to get most recent actor catalog fetch event for some sources (#21726) * fix query to get most recent actor catalog fetch event for some sources * fix format * fix pmd * handle case where we fetch sources for an empty list --- .../config/persistence/ConfigRepository.java | 15 ++++--- .../ConfigRepositoryE2EReadWriteTest.java | 41 +++++++++++++++++++ .../airbyte/config/persistence/MockData.java | 23 +++++++---- 3 files changed, 66 insertions(+), 13 deletions(-) diff --git a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigRepository.java b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigRepository.java index 6865993a0126f..19f810f6d6cd2 100644 --- a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigRepository.java +++ b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigRepository.java @@ -1348,19 +1348,22 @@ public Optional getMostRecentActorCatalogFetchEventForSo return records.stream().findFirst().map(DbConverter::buildActorCatalogFetchEvent); } - // todo (cgardens) - following up on why this arg is not used in this comment: - // https://github.com/airbytehq/airbyte/pull/18125/files#r1027377700 @SuppressWarnings({"unused", "SqlNoDataSourceInspection"}) public Map getMostRecentActorCatalogFetchEventForSources(final List sourceIds) throws IOException { // noinspection SqlResolve + if (sourceIds.isEmpty()) { + return Collections.emptyMap(); + } return database.query(ctx -> ctx.fetch( """ - select actor_catalog_id, actor_id, created_at from - (select actor_catalog_id, actor_id, created_at, rank() over (partition by actor_id order by created_at desc) as creation_order_rank + select distinct actor_catalog_id, actor_id, created_at from + (select actor_catalog_id, actor_id, created_at, row_number() over (partition by actor_id order by created_at desc) as creation_order_row_number from public.actor_catalog_fetch_event + where actor_id in ({0}) ) table_with_rank - where creation_order_rank = 1; - """)) + where creation_order_row_number = 1; + """, + DSL.list(sourceIds.stream().map(DSL::value).collect(Collectors.toList())))) .stream().map(DbConverter::buildActorCatalogFetchEvent) .collect(Collectors.toMap(ActorCatalogFetchEvent::getActorId, record -> record)); } diff --git a/airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/ConfigRepositoryE2EReadWriteTest.java b/airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/ConfigRepositoryE2EReadWriteTest.java index d7cbf6f56c456..ba3d6be057e8b 100644 --- a/airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/ConfigRepositoryE2EReadWriteTest.java +++ b/airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/ConfigRepositoryE2EReadWriteTest.java @@ -564,6 +564,13 @@ void testGetMostRecentActorCatalogFetchEventForSource() throws SQLException, IOE fetchEvent2.getActorId(), fetchEvent2.getActorCatalogId(), now); + // Insert a second identical copy to verify that the query can handle duplicates since the records + // are not guaranteed to be unique. + insertCatalogFetchEvent( + ctx, + fetchEvent2.getActorId(), + fetchEvent2.getActorCatalogId(), + now); return null; }); @@ -590,6 +597,40 @@ void testGetMostRecentActorCatalogFetchEventForSources() throws SQLException, IO return null; }); + final Map result = + configRepository.getMostRecentActorCatalogFetchEventForSources(List.of(MockData.SOURCE_ID_1, + MockData.SOURCE_ID_2)); + + assertEquals(MockData.ACTOR_CATALOG_ID_1, result.get(MockData.SOURCE_ID_1).getActorCatalogId()); + assertEquals(MockData.ACTOR_CATALOG_ID_3, result.get(MockData.SOURCE_ID_2).getActorCatalogId()); + assertEquals(0, configRepository.getMostRecentActorCatalogFetchEventForSources(Collections.emptyList()).size()); + } + + @Test + void testGetMostRecentActorCatalogFetchEventWithDuplicates() throws SQLException, IOException { + // Tests that we can handle two fetch events in the db with the same actor id, actor catalog id, and + // timestamp e.g., from duplicate discoveries. + for (final ActorCatalog actorCatalog : MockData.actorCatalogs()) { + writeActorCatalog(database, Collections.singletonList(actorCatalog)); + } + + database.transaction(ctx -> { + // Insert the fetch events twice. + MockData.actorCatalogFetchEventsForAggregationTest().forEach(actorCatalogFetchEvent -> { + insertCatalogFetchEvent( + ctx, + actorCatalogFetchEvent.getActorCatalogFetchEvent().getActorId(), + actorCatalogFetchEvent.getActorCatalogFetchEvent().getActorCatalogId(), + actorCatalogFetchEvent.getCreatedAt()); + insertCatalogFetchEvent( + ctx, + actorCatalogFetchEvent.getActorCatalogFetchEvent().getActorId(), + actorCatalogFetchEvent.getActorCatalogFetchEvent().getActorCatalogId(), + actorCatalogFetchEvent.getCreatedAt()); + }); + return null; + }); + final Map result = configRepository.getMostRecentActorCatalogFetchEventForSources(List.of(MockData.SOURCE_ID_1, MockData.SOURCE_ID_2)); diff --git a/airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/MockData.java b/airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/MockData.java index a6117a08af06e..80d2be2d1a4a4 100644 --- a/airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/MockData.java +++ b/airbyte-config/config-persistence/src/test/java/io/airbyte/config/persistence/MockData.java @@ -140,6 +140,8 @@ public class MockData { private static final UUID WEBHOOK_CONFIG_ID = UUID.randomUUID(); private static final String WEBHOOK_OPERATION_EXECUTION_URL = "test-webhook-url"; private static final String WEBHOOK_OPERATION_EXECUTION_BODY = "test-webhook-body"; + public static final String CONFIG_HASH = "1394"; + public static final String CONNECTOR_VERSION = "1.2.0"; public static List standardWorkspaces() { final Notification notification = new Notification() @@ -656,8 +658,8 @@ public static List actorCatalogFetchEventsSameSource() { .withId(ACTOR_CATALOG_FETCH_EVENT_ID_2) .withActorCatalogId(ACTOR_CATALOG_ID_2) .withActorId(SOURCE_ID_1) - .withConfigHash("1394") - .withConnectorVersion("1.2.0"); + .withConfigHash(CONFIG_HASH) + .withConnectorVersion(CONNECTOR_VERSION); return Arrays.asList(actorCatalogFetchEvent1, actorCatalogFetchEvent2); } @@ -683,18 +685,25 @@ public static List actorCatalogFetchEven .withId(ACTOR_CATALOG_FETCH_EVENT_ID_2) .withActorCatalogId(ACTOR_CATALOG_ID_2) .withActorId(SOURCE_ID_2) - .withConfigHash("1394") - .withConnectorVersion("1.2.0"); + .withConfigHash(CONFIG_HASH) + .withConnectorVersion(CONNECTOR_VERSION); final ActorCatalogFetchEvent actorCatalogFetchEvent3 = new ActorCatalogFetchEvent() .withId(ACTOR_CATALOG_FETCH_EVENT_ID_3) .withActorCatalogId(ACTOR_CATALOG_ID_3) .withActorId(SOURCE_ID_2) - .withConfigHash("1394") - .withConnectorVersion("1.2.0"); + .withConfigHash(CONFIG_HASH) + .withConnectorVersion(CONNECTOR_VERSION); + final ActorCatalogFetchEvent actorCatalogFetchEvent4 = new ActorCatalogFetchEvent() + .withId(ACTOR_CATALOG_FETCH_EVENT_ID_3) + .withActorCatalogId(ACTOR_CATALOG_ID_3) + .withActorId(SOURCE_ID_3) + .withConfigHash(CONFIG_HASH) + .withConnectorVersion(CONNECTOR_VERSION); return Arrays.asList( new ActorCatalogFetchEventWithCreationDate(actorCatalogFetchEvent1, now), new ActorCatalogFetchEventWithCreationDate(actorCatalogFetchEvent2, yesterday), - new ActorCatalogFetchEventWithCreationDate(actorCatalogFetchEvent3, now)); + new ActorCatalogFetchEventWithCreationDate(actorCatalogFetchEvent3, now), + new ActorCatalogFetchEventWithCreationDate(actorCatalogFetchEvent4, now)); } public static List workspaceServiceAccounts() { From b7685a7cd6d28813f9579edb78609916eca803a3 Mon Sep 17 00:00:00 2001 From: Conor Date: Mon, 23 Jan 2023 14:30:00 -0600 Subject: [PATCH 043/195] authenticate when calling setup-python (#21741) --- .github/workflows/gradle.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 64e581499f49b..31a52a2adfbf9 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -124,6 +124,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.9" + token: ${{ env.PAT }} - name: Set up CI Gradle Properties run: | @@ -229,6 +230,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.9" + token: ${{ env.PAT }} - name: Install Pyenv run: python3 -m pip install virtualenv==16.7.9 --user @@ -412,6 +414,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.9" + token: ${{ env.PAT }} - name: Set up CI Gradle Properties run: | @@ -535,6 +538,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.9" + token: ${{ env.PAT }} - name: Delete default old docker and replace it with a new one shell: bash @@ -666,6 +670,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.9" + token: ${{ env.PAT }} - uses: actions/setup-node@v3 with: @@ -800,6 +805,7 @@ jobs: if: always() with: python-version: "3.9" + token: ${{ env.PAT }} - name: Publish Platform Test Results uses: EnricoMi/publish-unit-test-result-action@v2 @@ -945,6 +951,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.9" + token: ${{ env.PAT }} - name: Install unzip shell: bash @@ -1021,6 +1028,7 @@ jobs: if: always() with: python-version: "3.9" + token: ${{ env.PAT }} - name: Publish Kube Test Results id: kube-results @@ -1191,6 +1199,7 @@ jobs: - uses: actions/setup-python@v4 with: python-version: "3.9" + token: ${{ env.PAT }} - uses: actions/setup-java@v1 with: From 3b1864f288b5a7a2834ff36ab9d47c77188dadd4 Mon Sep 17 00:00:00 2001 From: "Krishna (kc) Glick" Date: Mon, 23 Jan 2023 16:06:12 -0500 Subject: [PATCH 044/195] Checkboxes in dropdowns now correctly visually update when clicked (#21725) * preventDefault was necessary to make the checkboxes work * e -> event to reduce file diff --- airbyte-webapp/src/components/ui/DropDown/components/Option.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/airbyte-webapp/src/components/ui/DropDown/components/Option.tsx b/airbyte-webapp/src/components/ui/DropDown/components/Option.tsx index 49fcd9c812998..41ee0a538c749 100644 --- a/airbyte-webapp/src/components/ui/DropDown/components/Option.tsx +++ b/airbyte-webapp/src/components/ui/DropDown/components/Option.tsx @@ -65,6 +65,8 @@ export const DropDownOption: React.FC = (props) => { // for cases where the Dropdown is a child of a clickable parent such as a table row. props.selectOption(props.data); event.stopPropagation(); + // The checkbox does not work properly without this + event.preventDefault(); }} > From 2a714648e5839b13e153993a7ccff6a8a819d5b3 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi <53845333+lazebnyi@users.noreply.github.com> Date: Mon, 23 Jan 2023 23:11:59 +0100 Subject: [PATCH 045/195] Enable high strictness level (#21618) --- .../connectors/source-zendesk-talk/README.md | 6 +- .../acceptance-test-config.yml | 66 +++++++++------ .../integration_tests/abnormal_state.json | 24 ++++-- .../integration_tests/expected_records.jsonl | 81 +++++++++++++++++++ 4 files changed, 145 insertions(+), 32 deletions(-) create mode 100644 airbyte-integrations/connectors/source-zendesk-talk/integration_tests/expected_records.jsonl diff --git a/airbyte-integrations/connectors/source-zendesk-talk/README.md b/airbyte-integrations/connectors/source-zendesk-talk/README.md index a414b1323f5ec..45f10e19d37a5 100644 --- a/airbyte-integrations/connectors/source-zendesk-talk/README.md +++ b/airbyte-integrations/connectors/source-zendesk-talk/README.md @@ -49,7 +49,7 @@ and place them into `secrets/config.json`. python main.py spec python main.py check --config secrets/config.json python main.py discover --config secrets/config.json -python main.py read --config secrets/config.json --catalog sample_files/configured_catalog.json +python main.py read --config secrets/config.json --catalog integration_tests/configured_catalog.json ``` ### Locally running the connector docker image @@ -57,7 +57,7 @@ python main.py read --config secrets/config.json --catalog sample_files/configur #### Build First, make sure you build the latest Docker image: ``` -docker build . -t airbyte/zendesk-talk:dev +docker build . -t airbyte/source-zendesk-talk:dev ``` You can also build the connector image via Gradle: @@ -79,7 +79,7 @@ docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/sample_files:/sample_files Make sure to familiarize yourself with [pytest test discovery](https://docs.pytest.org/en/latest/goodpractices.html#test-discovery) to know how your test files and methods should be named. First install test dependencies into your virtual environment: ``` -pip install .[tests] +pip install .'[tests]' ``` ### Unit Tests To run unit tests locally, from the connector directory run: diff --git a/airbyte-integrations/connectors/source-zendesk-talk/acceptance-test-config.yml b/airbyte-integrations/connectors/source-zendesk-talk/acceptance-test-config.yml index a4cb208d9cd7d..56e2156d43c62 100644 --- a/airbyte-integrations/connectors/source-zendesk-talk/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-zendesk-talk/acceptance-test-config.yml @@ -2,32 +2,52 @@ # for more information about how to configure these tests # intentionally left out explicit configured_catalog.json to test all streams from discovery connector_image: airbyte/source-zendesk-talk:dev -tests: +test_strictness_level: "high" +acceptance_tests: spec: - - spec_path: "source_zendesk_talk/spec.json" + tests: + - spec_path: "source_zendesk_talk/spec.json" connection: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" - - config_path: "secrets/config_old.json" - status: "succeed" + tests: + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" + - config_path: "secrets/config_old.json" + status: "succeed" discovery: - - config_path: "secrets/config.json" - backward_compatibility_tests_config: - disable_for_version: "0.1.3" - - config_path: "secrets/config_old.json" - backward_compatibility_tests_config: - disable_for_version: "0.1.3" + tests: + - config_path: "secrets/config.json" + backward_compatibility_tests_config: + disable_for_version: "0.1.3" + - config_path: "secrets/config_old.json" + backward_compatibility_tests_config: + disable_for_version: "0.1.3" basic_read: - - config_path: "secrets/config.json" + tests: + - config_path: "secrets/config.json" + expect_records: + path: "integration_tests/expected_records.jsonl" + extra_fields: no + exact_order: no + extra_records: yes + empty_streams: + - name: "account_overview" + bypass_reason: "The objects can mutate quite often." + - name: "agents_overview" + bypass_reason: "The objects can mutate quite often." + - name: "current_queue_activity" + bypass_reason: "The objects can mutate quite often." incremental: - - config_path: "secrets/config.json" - future_state_path: "integration_tests/abnormal_state.json" + tests: + - config_path: "secrets/config.json" + future_state: + future_state_path: "integration_tests/abnormal_state.json" full_refresh: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - ignored_fields: - account_overview: ["current_timestamp"] - agents_overview: ["current_timestamp"] - current_queue_activity: ["current_timestamp"] + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + ignored_fields: + account_overview: ["current_timestamp"] + agents_overview: ["current_timestamp"] + current_queue_activity: ["current_timestamp"] diff --git a/airbyte-integrations/connectors/source-zendesk-talk/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-zendesk-talk/integration_tests/abnormal_state.json index 6c8e657de0642..26862a32c0efe 100644 --- a/airbyte-integrations/connectors/source-zendesk-talk/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-zendesk-talk/integration_tests/abnormal_state.json @@ -1,8 +1,20 @@ -{ - "calls": { - "updated_at": "2121-01-01T00:00:00Z" +[ + { + "type": "STREAM", + "stream": { + "stream_state": { + "updated_at": "2121-01-01T00:00:00Z" + }, + "stream_descriptor": { "name": "calls" } + } }, - "call_legs": { - "updated_at": "2121-01-01T00:00:00Z" + { + "type": "STREAM", + "stream": { + "stream_state": { + "updated_at": "2121-01-01T00:00:00Z" + }, + "stream_descriptor": { "name": "call_legs" } + } } -} +] diff --git a/airbyte-integrations/connectors/source-zendesk-talk/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-zendesk-talk/integration_tests/expected_records.jsonl new file mode 100644 index 0000000000000..5e1deb1cca938 --- /dev/null +++ b/airbyte-integrations/connectors/source-zendesk-talk/integration_tests/expected_records.jsonl @@ -0,0 +1,81 @@ +{"stream": "addresses", "data": {"id": 360000047935, "name": "Fake Zendesk 1001", "street": "1019 Market Street", "zip": "94103", "city": "San Francisco", "state": null, "province": "California", "country_code": "US", "provider_reference": "AD89734a096af9bab5eb8d364a00e03859"}, "emitted_at": 1674159463524} +{"stream": "addresses", "data": {"id": 360000049316, "name": "Fake Zendesk 1000", "street": "1019 Market Street", "zip": "94103", "city": "San Francisco", "state": null, "province": "California", "country_code": "US", "provider_reference": "AD15e4b6ac73c4e727e2b00c29963d8e06"}, "emitted_at": 1674159463524} +{"stream": "addresses", "data": {"id": 360000049296, "name": "Fake Zendesk 999", "street": "1019 Market Street", "zip": "94103", "city": "San Francisco", "state": null, "province": "California", "country_code": "US", "provider_reference": "ADad90fc569206d6cbe5f5a6f160c01516"}, "emitted_at": 1674159463525} +{"stream": "addresses", "data": {"id": 360000047915, "name": "Fake Zendesk 998", "street": "1019 Market Street", "zip": "94103", "city": "San Francisco", "state": null, "province": "California", "country_code": "US", "provider_reference": "ADa89d87601b4f38b45ca172ba36bc4c36"}, "emitted_at": 1674159463525} +{"stream": "addresses", "data": {"id": 360000049276, "name": "Fake Zendesk 997", "street": "1019 Market Street", "zip": "94103", "city": "San Francisco", "state": null, "province": "California", "country_code": "US", "provider_reference": "AD1b03f6250ae793c562f9290a47404e5b"}, "emitted_at": 1674159463525} +{"stream": "agents_activity", "data": {"name": "Team Airbyte", "agent_id": 360786799676, "via": "client", "avatar_url": "https://d3v-airbyte.zendesk.com/images/2016/default-avatar-80.png", "forwarding_number": null, "average_talk_time": 0, "calls_accepted": 0, "calls_denied": 0, "calls_missed": 0, "online_time": 0, "available_time": 0, "total_call_duration": 0, "total_talk_time": 0, "total_wrap_up_time": 0, "away_time": 0, "call_status": null, "agent_state": "offline", "transfers_only_time": 0, "average_wrap_up_time": 0, "accepted_transfers": 0, "started_transfers": 0, "calls_put_on_hold": 0, "average_hold_time": 0, "total_hold_time": 0, "started_third_party_conferences": 0, "accepted_third_party_conferences": 0}, "emitted_at": 1674159464163} +{"stream": "calls", "data": {"id": 360088814475, "created_at": "2021-04-01T13:42:47Z", "updated_at": "2021-04-01T14:23:15Z", "agent_id": null, "call_charge": "0.003", "consultation_time": 0, "completion_status": "failed", "customer_id": null, "customer_requested_voicemail": false, "direction": "outbound", "duration": 18, "exceeded_queue_wait_time": null, "hold_time": 0, "minutes_billed": 1, "outside_business_hours": null, "phone_number_id": 360000121575, "phone_number": "+12059531462", "ticket_id": null, "time_to_answer": null, "voicemail": false, "wait_time": 0, "wrap_up_time": 0, "ivr_time_spent": null, "ivr_hops": null, "ivr_destination_group_name": null, "talk_time": null, "ivr_routed_to": null, "callback": null, "callback_source": null, "default_group": false, "ivr_action": null, "overflowed": false, "overflowed_to": null, "recording_control_interactions": 0, "recording_time": 0, "not_recording_time": 0, "call_recording_consent": "always", "call_recording_consent_action": null, "call_recording_consent_keypress": null, "call_group_id": null, "call_channel": null, "quality_issues": ["silence"], "line": "+12059531462", "line_id": 360000121575, "line_type": "phone"}, "emitted_at": 1674159472100} +{"stream": "calls", "data": {"id": 360120314196, "created_at": "2021-10-20T15:16:31Z", "updated_at": "2021-10-20T15:56:54Z", "agent_id": null, "call_charge": "0.003", "consultation_time": 0, "completion_status": "completed", "customer_id": null, "customer_requested_voicemail": false, "direction": "outbound", "duration": 8, "exceeded_queue_wait_time": false, "hold_time": 0, "minutes_billed": 1, "outside_business_hours": false, "phone_number_id": 360000121575, "phone_number": "+12059531462", "ticket_id": null, "time_to_answer": null, "voicemail": false, "wait_time": 0, "wrap_up_time": 0, "ivr_time_spent": null, "ivr_hops": null, "ivr_destination_group_name": null, "talk_time": 0, "ivr_routed_to": null, "callback": false, "callback_source": null, "default_group": false, "ivr_action": null, "overflowed": false, "overflowed_to": null, "recording_control_interactions": 0, "recording_time": 0, "not_recording_time": 0, "call_recording_consent": "always", "call_recording_consent_action": null, "call_recording_consent_keypress": null, "call_group_id": null, "call_channel": null, "quality_issues": ["none"], "line": "+12059531462", "line_id": 360000121575, "line_type": "phone"}, "emitted_at": 1674159472101} +{"stream": "calls", "data": {"id": 360121169675, "created_at": "2021-10-20T15:16:42Z", "updated_at": "2021-10-20T15:57:03Z", "agent_id": null, "call_charge": "0.003", "consultation_time": 0, "completion_status": "completed", "customer_id": null, "customer_requested_voicemail": false, "direction": "outbound", "duration": 7, "exceeded_queue_wait_time": false, "hold_time": 0, "minutes_billed": 1, "outside_business_hours": false, "phone_number_id": 360000121575, "phone_number": "+12059531462", "ticket_id": null, "time_to_answer": null, "voicemail": false, "wait_time": 0, "wrap_up_time": 0, "ivr_time_spent": null, "ivr_hops": null, "ivr_destination_group_name": null, "talk_time": 0, "ivr_routed_to": null, "callback": false, "callback_source": null, "default_group": false, "ivr_action": null, "overflowed": false, "overflowed_to": null, "recording_control_interactions": 0, "recording_time": 0, "not_recording_time": 0, "call_recording_consent": "always", "call_recording_consent_action": null, "call_recording_consent_keypress": null, "call_group_id": null, "call_channel": null, "quality_issues": ["none"], "line": "+12059531462", "line_id": 360000121575, "line_type": "phone"}, "emitted_at": 1674159472101} +{"stream": "calls", "data": {"id": 360121166995, "created_at": "2021-10-20T13:22:25Z", "updated_at": "2021-10-20T16:22:34Z", "agent_id": null, "call_charge": "0.003", "consultation_time": 0, "completion_status": "completed", "customer_id": null, "customer_requested_voicemail": false, "direction": "outbound", "duration": 6, "exceeded_queue_wait_time": false, "hold_time": 0, "minutes_billed": 1, "outside_business_hours": false, "phone_number_id": 360000121575, "phone_number": "+12059531462", "ticket_id": null, "time_to_answer": null, "voicemail": false, "wait_time": 0, "wrap_up_time": 0, "ivr_time_spent": null, "ivr_hops": null, "ivr_destination_group_name": null, "talk_time": 0, "ivr_routed_to": null, "callback": false, "callback_source": null, "default_group": false, "ivr_action": null, "overflowed": false, "overflowed_to": null, "recording_control_interactions": 0, "recording_time": 0, "not_recording_time": 0, "call_recording_consent": "always", "call_recording_consent_action": null, "call_recording_consent_keypress": null, "call_group_id": null, "call_channel": null, "quality_issues": ["none"], "line": "+12059531462", "line_id": 360000121575, "line_type": "phone"}, "emitted_at": 1674159472102} +{"stream": "calls", "data": {"id": 360120313416, "created_at": "2021-10-20T14:34:26Z", "updated_at": "2021-10-20T17:34:36Z", "agent_id": null, "call_charge": "0.003", "consultation_time": 0, "completion_status": "completed", "customer_id": null, "customer_requested_voicemail": false, "direction": "outbound", "duration": 349, "exceeded_queue_wait_time": false, "hold_time": 0, "minutes_billed": 6, "outside_business_hours": false, "phone_number_id": 360000121575, "phone_number": "+12059531462", "ticket_id": null, "time_to_answer": null, "voicemail": false, "wait_time": 0, "wrap_up_time": 0, "ivr_time_spent": null, "ivr_hops": null, "ivr_destination_group_name": null, "talk_time": 0, "ivr_routed_to": null, "callback": false, "callback_source": null, "default_group": false, "ivr_action": null, "overflowed": false, "overflowed_to": null, "recording_control_interactions": 0, "recording_time": 0, "not_recording_time": 0, "call_recording_consent": "always", "call_recording_consent_action": null, "call_recording_consent_keypress": null, "call_group_id": null, "call_channel": null, "quality_issues": ["none"], "line": "+12059531462", "line_id": 360000121575, "line_type": "phone"}, "emitted_at": 1674159472102} +{"stream": "calls", "data": {"id": 360121168815, "created_at": "2021-10-20T14:40:05Z", "updated_at": "2021-10-20T17:40:25Z", "agent_id": null, "call_charge": "0.003", "consultation_time": 0, "completion_status": "completed", "customer_id": null, "customer_requested_voicemail": false, "direction": "outbound", "duration": 17, "exceeded_queue_wait_time": false, "hold_time": 0, "minutes_billed": 1, "outside_business_hours": false, "phone_number_id": 360000121575, "phone_number": "+12059531462", "ticket_id": null, "time_to_answer": null, "voicemail": false, "wait_time": 0, "wrap_up_time": 0, "ivr_time_spent": null, "ivr_hops": null, "ivr_destination_group_name": null, "talk_time": 0, "ivr_routed_to": null, "callback": false, "callback_source": null, "default_group": false, "ivr_action": null, "overflowed": false, "overflowed_to": null, "recording_control_interactions": 0, "recording_time": 0, "not_recording_time": 0, "call_recording_consent": "always", "call_recording_consent_action": null, "call_recording_consent_keypress": null, "call_group_id": null, "call_channel": null, "quality_issues": ["none"], "line": "+12059531462", "line_id": 360000121575, "line_type": "phone"}, "emitted_at": 1674159472102} +{"stream": "calls", "data": {"id": 360120313656, "created_at": "2021-10-20T14:49:50Z", "updated_at": "2021-10-20T17:50:02Z", "agent_id": null, "call_charge": "0.003", "consultation_time": 0, "completion_status": "completed", "customer_id": null, "customer_requested_voicemail": false, "direction": "outbound", "duration": 5, "exceeded_queue_wait_time": false, "hold_time": 0, "minutes_billed": 1, "outside_business_hours": false, "phone_number_id": 360000121575, "phone_number": "+12059531462", "ticket_id": null, "time_to_answer": null, "voicemail": false, "wait_time": 0, "wrap_up_time": 0, "ivr_time_spent": null, "ivr_hops": null, "ivr_destination_group_name": null, "talk_time": 0, "ivr_routed_to": null, "callback": false, "callback_source": null, "default_group": false, "ivr_action": null, "overflowed": false, "overflowed_to": null, "recording_control_interactions": 0, "recording_time": 0, "not_recording_time": 0, "call_recording_consent": "always", "call_recording_consent_action": null, "call_recording_consent_keypress": null, "call_group_id": null, "call_channel": null, "quality_issues": ["none"], "line": "+12059531462", "line_id": 360000121575, "line_type": "phone"}, "emitted_at": 1674159472103} +{"stream": "calls", "data": {"id": 360120313676, "created_at": "2021-10-20T14:50:08Z", "updated_at": "2021-10-20T17:50:16Z", "agent_id": null, "call_charge": "0.003", "consultation_time": 0, "completion_status": "completed", "customer_id": null, "customer_requested_voicemail": false, "direction": "outbound", "duration": 6, "exceeded_queue_wait_time": false, "hold_time": 0, "minutes_billed": 1, "outside_business_hours": false, "phone_number_id": 360000121575, "phone_number": "+12059531462", "ticket_id": null, "time_to_answer": null, "voicemail": false, "wait_time": 0, "wrap_up_time": 0, "ivr_time_spent": null, "ivr_hops": null, "ivr_destination_group_name": null, "talk_time": 0, "ivr_routed_to": null, "callback": false, "callback_source": null, "default_group": false, "ivr_action": null, "overflowed": false, "overflowed_to": null, "recording_control_interactions": 0, "recording_time": 0, "not_recording_time": 0, "call_recording_consent": "always", "call_recording_consent_action": null, "call_recording_consent_keypress": null, "call_group_id": null, "call_channel": null, "quality_issues": ["none"], "line": "+12059531462", "line_id": 360000121575, "line_type": "phone"}, "emitted_at": 1674159472103} +{"stream": "call_legs", "data": {"id": 360167085115, "created_at": "2021-04-01T13:42:47Z", "updated_at": "2021-04-01T14:23:14Z", "agent_id": 360786799676, "user_id": 0, "duration": 18, "hold_time": 0, "wrap_up_time": 0, "available_via": "browser", "forwarded_to": null, "consultation_from": null, "transferred_from": null, "transferred_to": null, "minutes_billed": 1, "call_charge": "0.003", "completion_status": "completed", "consultation_time": null, "talk_time": 0, "consultation_to": null, "conference_time": null, "conference_from": null, "conference_to": null, "quality_issues": ["silence"], "call_id": 360088814475, "type": "agent"}, "emitted_at": 1674159475493} +{"stream": "call_legs", "data": {"id": 360222253536, "created_at": "2021-10-20T13:22:27Z", "updated_at": "2021-10-20T14:02:47Z", "agent_id": 0, "user_id": null, "duration": 4, "hold_time": 0, "wrap_up_time": null, "available_via": null, "forwarded_to": null, "consultation_from": null, "transferred_from": null, "transferred_to": null, "minutes_billed": null, "call_charge": "0.0", "completion_status": "completed", "consultation_time": null, "talk_time": 0, "consultation_to": null, "conference_time": null, "conference_from": null, "conference_to": null, "quality_issues": ["none"], "call_id": 360121166995, "type": "customer"}, "emitted_at": 1674159475493} +{"stream": "call_legs", "data": {"id": 360223248835, "created_at": "2021-10-20T14:34:28Z", "updated_at": "2021-10-20T14:40:20Z", "agent_id": 0, "user_id": null, "duration": 347, "hold_time": 0, "wrap_up_time": null, "available_via": null, "forwarded_to": null, "consultation_from": null, "transferred_from": null, "transferred_to": null, "minutes_billed": null, "call_charge": "0.0", "completion_status": "completed", "consultation_time": null, "talk_time": 0, "consultation_to": null, "conference_time": null, "conference_from": null, "conference_to": null, "quality_issues": ["information_not_available"], "call_id": 360120313416, "type": "customer"}, "emitted_at": 1674159475494} +{"stream": "call_legs", "data": {"id": 360222256556, "created_at": "2021-10-20T14:50:30Z", "updated_at": "2021-10-20T14:55:21Z", "agent_id": 0, "user_id": null, "duration": 286, "hold_time": 0, "wrap_up_time": null, "available_via": null, "forwarded_to": null, "consultation_from": null, "transferred_from": null, "transferred_to": null, "minutes_billed": null, "call_charge": "0.0", "completion_status": "completed", "consultation_time": null, "talk_time": 0, "consultation_to": null, "conference_time": null, "conference_from": null, "conference_to": null, "quality_issues": ["information_not_available"], "call_id": 360120313696, "type": "customer"}, "emitted_at": 1674159475494} +{"stream": "call_legs", "data": {"id": 360223248815, "created_at": "2021-10-20T14:34:12Z", "updated_at": "2021-10-20T15:14:34Z", "agent_id": 0, "user_id": null, "duration": 9, "hold_time": 0, "wrap_up_time": null, "available_via": null, "forwarded_to": null, "consultation_from": null, "transferred_from": null, "transferred_to": null, "minutes_billed": null, "call_charge": "0.0", "completion_status": "completed", "consultation_time": null, "talk_time": 0, "consultation_to": null, "conference_time": null, "conference_from": null, "conference_to": null, "quality_issues": ["none"], "call_id": 360120313376, "type": "customer"}, "emitted_at": 1674159475495} +{"stream": "call_legs", "data": {"id": 360222257236, "created_at": "2021-10-20T15:16:08Z", "updated_at": "2021-10-20T15:20:17Z", "agent_id": 0, "user_id": null, "duration": 247, "hold_time": 0, "wrap_up_time": null, "available_via": null, "forwarded_to": null, "consultation_from": null, "transferred_from": null, "transferred_to": null, "minutes_billed": null, "call_charge": "0.0", "completion_status": "completed", "consultation_time": null, "talk_time": 0, "consultation_to": null, "conference_time": null, "conference_from": null, "conference_to": null, "quality_issues": ["information_not_available"], "call_id": 360121169655, "type": "customer"}, "emitted_at": 1674159475495} +{"stream": "call_legs", "data": {"id": 360222256136, "created_at": "2021-10-20T14:40:08Z", "updated_at": "2021-10-20T15:20:35Z", "agent_id": 0, "user_id": null, "duration": 14, "hold_time": 0, "wrap_up_time": null, "available_via": null, "forwarded_to": null, "consultation_from": null, "transferred_from": null, "transferred_to": null, "minutes_billed": null, "call_charge": "0.0", "completion_status": "completed", "consultation_time": null, "talk_time": 0, "consultation_to": null, "conference_time": null, "conference_from": null, "conference_to": null, "quality_issues": ["none"], "call_id": 360121168815, "type": "customer"}, "emitted_at": 1674159475495} +{"stream": "call_legs", "data": {"id": 360223249615, "created_at": "2021-10-20T14:49:52Z", "updated_at": "2021-10-20T15:30:06Z", "agent_id": 0, "user_id": null, "duration": 3, "hold_time": 0, "wrap_up_time": null, "available_via": null, "forwarded_to": null, "consultation_from": null, "transferred_from": null, "transferred_to": null, "minutes_billed": null, "call_charge": "0.0", "completion_status": "completed", "consultation_time": null, "talk_time": 0, "consultation_to": null, "conference_time": null, "conference_from": null, "conference_to": null, "quality_issues": ["none"], "call_id": 360120313656, "type": "customer"}, "emitted_at": 1674159475496} +{"stream": "greetings", "data": {"id": "voicemail_en", "name": "Default (voicemail on)", "category_id": 1, "default": true, "default_lang": true, "active": true, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_voicemail_greeting-2f8e559817bdaf572b7399ba19bd077943a99102eb79421fb37c45c6c209dc42.mp3", "audio_name": "voicemail_en.mp3", "upload_id": null, "phone_number_ids": [360000121575], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479082} +{"stream": "greetings", "data": {"id": "voicemail_jp", "name": "Default (Japanese)", "category_id": 1, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_jp_voicemail_greeting-877bed4a67aa833401f1e6dd9e26cc18aeee83f39a88cf60aa939a5987292286.mp3", "audio_name": "voicemail_jp.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479082} +{"stream": "greetings", "data": {"id": "voicemail_none", "name": "None", "category_id": 1, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": null, "audio_name": "voicemail_none.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479082} +{"stream": "greetings", "data": {"id": "available_en", "name": "Default", "category_id": 2, "default": true, "default_lang": true, "active": true, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_available_greeting-4fc2c1e71ea75b4bf5b7dd32a7104e10e4e8bf24000201429d7c11a845784dc5.mp3", "audio_name": "available_en.mp3", "upload_id": null, "phone_number_ids": [360000121575], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479083} +{"stream": "greetings", "data": {"id": "available_jp", "name": "Default (Japanese)", "category_id": 2, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_jp_available_greeting-046a59a7baffe238eb7370e7cf5fe7305371540474c93e0f30c731328b342174.mp3", "audio_name": "available_jp.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479084} +{"stream": "greetings", "data": {"id": "available_none", "name": "None", "category_id": 2, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": null, "audio_name": "available_none.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479084} +{"stream": "greetings", "data": {"id": "wait_en", "name": "Default", "category_id": 3, "default": true, "default_lang": true, "active": true, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_wait_greeting-9af4ed352eb6d50cf3f85aa7c41492be6ff1bab5228cc3cf0fbb8957738dbe40.mp3", "audio_name": "wait_en.mp3", "upload_id": null, "phone_number_ids": [360000121575], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479085} +{"stream": "greetings", "data": {"id": "hold_en", "name": "Default", "category_id": 4, "default": true, "default_lang": true, "active": true, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_hold_greeting-9af4ed352eb6d50cf3f85aa7c41492be6ff1bab5228cc3cf0fbb8957738dbe40.mp3", "audio_name": "hold_en.mp3", "upload_id": null, "phone_number_ids": [360000121575], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479086} +{"stream": "greetings", "data": {"id": "ivr_none", "name": "None", "category_id": 5, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": null, "audio_name": "ivr_none.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479086} +{"stream": "greetings", "data": {"id": "available_en_call_monitoring", "name": "Default (call monitoring)", "category_id": 2, "default": true, "default_lang": true, "active": false, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_available_greeting_with_call_monitoring-efc19b939e4c5ceb8455db8e9754335806beb7bb9a28ce3571071a5a96871d76.mp3", "audio_name": "available_en_call_monitoring.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479087} +{"stream": "greetings", "data": {"id": "available_jp_call_monitoring", "name": "Default (Japanese call monitoring)", "category_id": 2, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_jp_available_greeting_with_call_monitoring-7268e49ae9cc8f2fc675c96dfed1af98c9d0e9ae77f90d773d3cd96aed5b9e58.mp3", "audio_name": "available_jp_call_monitoring.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479087} +{"stream": "greetings", "data": {"id": "callback_en", "name": "Default", "category_id": 6, "default": true, "default_lang": true, "active": true, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_callback_greeting_V2-bf2424b358a4faeaa828ccb69c967ad4074445229bbb0c73dd120700319de68a.mp3", "audio_name": "callback_en.mp3", "upload_id": null, "phone_number_ids": [360000121575], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479088} +{"stream": "greetings", "data": {"id": "callback-confirmation_en", "name": "Default", "category_id": 7, "default": true, "default_lang": true, "active": true, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_callback_confirmation_greeting_V2-bf7b6a1645341aab989b52a1eb3425d51e41f906396e8b13d669256917697c79.mp3", "audio_name": "callback-confirmation_en.mp3", "upload_id": null, "phone_number_ids": [360000121575], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479088} +{"stream": "greetings", "data": {"id": "callback_none", "name": "None", "category_id": 6, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": null, "audio_name": "callback_none.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479089} +{"stream": "greetings", "data": {"id": "callback-confirmation_none", "name": "None", "category_id": 7, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": null, "audio_name": "callback-confirmation_none.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479089} +{"stream": "greetings", "data": {"id": "available_en_voicemail_config", "name": "Default (voicemail off)", "category_id": 2, "default": true, "default_lang": true, "active": false, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_available_greeting_no_voicemail-1b9769a85defcc80aac0ab62cbc99b8ecc72f8d0fbfd7165fead98dd49c21c4e.mp3", "audio_name": "available_en_voicemail_config.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479090} +{"stream": "greetings", "data": {"id": "available_jp_voicemail_config", "name": "Default (Japanese voicemail off)", "category_id": 2, "default": true, "default_lang": false, "active": false, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_jp_available_greeting_no_voicemail-350a937a599dc9b3314d270602cb9e152ce2adeee1cb5b31b31f1995c8cc7882.mp3", "audio_name": "available_jp_voicemail_config.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479090} +{"stream": "greetings", "data": {"id": "voicemail_en_voicemail_config", "name": "Default (voicemail off)", "category_id": 1, "default": true, "default_lang": true, "active": false, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_voicemail_off_greeting-37c1fef28743683024b42c5577e6eb1bce42aa3aabe1dd01c875c65fb0ec4b05.mp3", "audio_name": "voicemail_en_voicemail_config.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479091} +{"stream": "greetings", "data": {"id": "call-recording-opt-out_en", "name": "Opt-out consent greeting (default)", "category_id": 8, "default": true, "default_lang": true, "active": true, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_call_recording_opt_out-4ccf97e7c00fa861dc2905d23931fd94b6293416c7f1dc0db3b6d3fe1c2fcf33.mp3", "audio_name": "call-recording-opt-out_en.mp3", "upload_id": null, "phone_number_ids": [360000121575], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479091} +{"stream": "greetings", "data": {"id": "call-recording-opt-in_en", "name": "Opt-in consent greeting (default)", "category_id": 9, "default": true, "default_lang": true, "active": true, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_call_recording_opt_in-e1054755d6c6b90661bdd8f5e8cff1beb73b1841ef515544f386b96e6ed4bad1.mp3", "audio_name": "call-recording-opt-in_en.mp3", "upload_id": null, "phone_number_ids": [360000121575], "ivr_ids": [], "has_sub_settings": false}, "emitted_at": 1674159479092} +{"stream": "greetings", "data": {"id": "available_en_digital_lines", "name": "Default (digital line)", "category_id": 2, "default": true, "default_lang": true, "active": false, "pending": false, "audio_url": "https://static.zdassets.com/voice/ef9da20555606d86a6f57f86f07ad1bfb0de132c/voice/assets/default_en_available_digital_line_greeting_2-1b9769a85defcc80aac0ab62cbc99b8ecc72f8d0fbfd7165fead98dd49c21c4e.mp3", "audio_name": "available_en_digital_lines.mp3", "upload_id": null, "phone_number_ids": [], "ivr_ids": [], "has_sub_settings": true}, "emitted_at": 1674159479093} +{"stream": "greeting_categories", "data": {"id": 1, "name": "voicemail"}, "emitted_at": 1674159479490} +{"stream": "greeting_categories", "data": {"id": 2, "name": "available"}, "emitted_at": 1674159479491} +{"stream": "greeting_categories", "data": {"id": 3, "name": "wait"}, "emitted_at": 1674159479491} +{"stream": "greeting_categories", "data": {"id": 4, "name": "hold"}, "emitted_at": 1674159479491} +{"stream": "greeting_categories", "data": {"id": 5, "name": "ivr"}, "emitted_at": 1674159479491} +{"stream": "greeting_categories", "data": {"id": 6, "name": "callback"}, "emitted_at": 1674159479491} +{"stream": "greeting_categories", "data": {"id": 7, "name": "callback_confirmation"}, "emitted_at": 1674159479491} +{"stream": "greeting_categories", "data": {"id": 8, "name": "call_recording_opt_out"}, "emitted_at": 1674159479492} +{"stream": "greeting_categories", "data": {"id": 9, "name": "call_recording_opt_in"}, "emitted_at": 1674159479492} +{"stream": "ivr_menus", "data": {"ivr_id": 360000011856, "id": 360000018476, "name": "Main menu", "default": true, "greeting_id": null, "routes": [{"id": 360000016516, "keypress": "5", "greeting": null, "action": "menu", "options": {"menu_id": 360000018476}, "option_text": "Main menu", "overflow_options": []}]}, "emitted_at": 1674159480308} +{"stream": "ivr_menus", "data": {"ivr_id": 360000011876, "id": 360000018496, "name": "Main menu", "default": true, "greeting_id": null, "routes": [{"id": 360000015935, "keypress": "0", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015955, "keypress": "2", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015975, "keypress": "3", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015995, "keypress": "4", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016015, "keypress": "6", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016035, "keypress": "8", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016436, "keypress": "1", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016456, "keypress": "5", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016476, "keypress": "7", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016496, "keypress": "9", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}]}, "emitted_at": 1674159480308} +{"stream": "ivr_menus", "data": {"ivr_id": 360000011896, "id": 360000018516, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480309} +{"stream": "ivr_menus", "data": {"ivr_id": 360000011916, "id": 360000018536, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480310} +{"stream": "ivr_menus", "data": {"ivr_id": 360000011936, "id": 360000018556, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480310} +{"stream": "ivr_menus", "data": {"ivr_id": 360000011956, "id": 360000018576, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480310} +{"stream": "ivr_menus", "data": {"ivr_id": 360000011976, "id": 360000018596, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480310} +{"stream": "ivr_menus", "data": {"ivr_id": 360000011996, "id": 360000018616, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480311} +{"stream": "ivr_menus", "data": {"ivr_id": 360000012016, "id": 360000018636, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480311} +{"stream": "ivr_routes", "data": {"ivr_id": 360000011856, "ivr_menu_id": 360000018476, "id": 360000018476, "name": "Main menu", "default": true, "greeting_id": null, "routes": [{"id": 360000016516, "keypress": "5", "greeting": null, "action": "menu", "options": {"menu_id": 360000018476}, "option_text": "Main menu", "overflow_options": []}]}, "emitted_at": 1674159480341} +{"stream": "ivr_routes", "data": {"ivr_id": 360000011876, "ivr_menu_id": 360000018496, "id": 360000018496, "name": "Main menu", "default": true, "greeting_id": null, "routes": [{"id": 360000015935, "keypress": "0", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015955, "keypress": "2", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015975, "keypress": "3", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015995, "keypress": "4", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016015, "keypress": "6", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016035, "keypress": "8", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016436, "keypress": "1", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016456, "keypress": "5", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016476, "keypress": "7", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016496, "keypress": "9", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}]}, "emitted_at": 1674159480342} +{"stream": "ivr_routes", "data": {"ivr_id": 360000011896, "ivr_menu_id": 360000018516, "id": 360000018516, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480343} +{"stream": "ivr_routes", "data": {"ivr_id": 360000011916, "ivr_menu_id": 360000018536, "id": 360000018536, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480343} +{"stream": "ivr_routes", "data": {"ivr_id": 360000011936, "ivr_menu_id": 360000018556, "id": 360000018556, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480345} +{"stream": "ivr_routes", "data": {"ivr_id": 360000011956, "ivr_menu_id": 360000018576, "id": 360000018576, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480345} +{"stream": "ivr_routes", "data": {"ivr_id": 360000011976, "ivr_menu_id": 360000018596, "id": 360000018596, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480346} +{"stream": "ivr_routes", "data": {"ivr_id": 360000011996, "ivr_menu_id": 360000018616, "id": 360000018616, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480347} +{"stream": "ivr_routes", "data": {"ivr_id": 360000012016, "ivr_menu_id": 360000018636, "id": 360000018636, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}, "emitted_at": 1674159480348} +{"stream": "ivrs", "data": {"id": 360000011856, "name": "Fake IVR Menu 3", "menus": [{"id": 360000018476, "name": "Main menu", "default": true, "greeting_id": null, "routes": [{"id": 360000016516, "keypress": "5", "greeting": null, "action": "menu", "options": {"menu_id": 360000018476}, "option_text": "Main menu", "overflow_options": []}]}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480404} +{"stream": "ivrs", "data": {"id": 360000011876, "name": "Fake IVR Menu 5", "menus": [{"id": 360000018496, "name": "Main menu", "default": true, "greeting_id": null, "routes": [{"id": 360000015935, "keypress": "0", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015955, "keypress": "2", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015975, "keypress": "3", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000015995, "keypress": "4", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016015, "keypress": "6", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016035, "keypress": "8", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016436, "keypress": "1", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016456, "keypress": "5", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016476, "keypress": "7", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}, {"id": 360000016496, "keypress": "9", "greeting": null, "action": "group", "options": {"group_ids": [10001]}, "option_text": null, "overflow_options": []}]}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480405} +{"stream": "ivrs", "data": {"id": 360000011896, "name": "Fake IVR Menu 6", "menus": [{"id": 360000018516, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480406} +{"stream": "ivrs", "data": {"id": 360000011916, "name": "Fake IVR Menu 7", "menus": [{"id": 360000018536, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480406} +{"stream": "ivrs", "data": {"id": 360000011936, "name": "Fake IVR Menu 9", "menus": [{"id": 360000018556, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480407} +{"stream": "ivrs", "data": {"id": 360000011956, "name": "Fake IVR Menu 10", "menus": [{"id": 360000018576, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480407} +{"stream": "ivrs", "data": {"id": 360000011976, "name": "Fake IVR Menu 17", "menus": [{"id": 360000018596, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480407} +{"stream": "ivrs", "data": {"id": 360000011996, "name": "Fake IVR Menu 19", "menus": [{"id": 360000018616, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480408} +{"stream": "ivrs", "data": {"id": 360000012016, "name": "Fake IVR Menu 20", "menus": [{"id": 360000018636, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480408} +{"stream": "ivrs", "data": {"id": 360000012036, "name": "Fake IVR Menu 21", "menus": [{"id": 360000018656, "name": "Main menu", "default": true, "greeting_id": null, "routes": []}], "phone_number_ids": [], "phone_number_names": []}, "emitted_at": 1674159480408} +{"stream": "phone_numbers", "data": {"id": 360000121575, "country_code": "US", "created_at": "2020-12-14T18:44:31Z", "external": false, "number": "+12059531462", "name": "+1 (205) 953-1462", "nickname": null, "display_number": "+1 (205) 953-1462", "location": "AL", "toll_free": false, "transcription": true, "recorded": true, "call_recording_consent": "always", "group_ids": [], "default_group_id": null, "greeting_ids": [], "default_greeting_ids": ["voicemail_en", "available_en", "wait_en", "hold_en", "callback_en", "callback-confirmation_en", "call-recording-opt-out_en", "call-recording-opt-in_en"], "categorised_greetings": {"1": "voicemail_en", "2": "available_en", "3": "wait_en", "4": "hold_en", "6": "callback_en", "7": "callback-confirmation_en", "8": "call-recording-opt-out_en", "9": "call-recording-opt-in_en"}, "categorised_greetings_with_sub_settings": {"1": {"voicemail_on_outside_business_hours": "voicemail_en", "voicemail_on_inside_business_hours": "voicemail_en", "voicemail_off_inside_business_hours": "voicemail_en_voicemail_config", "voicemail_off_outside_business_hours": "voicemail_en_voicemail_config"}, "2": {"voicemail_on": "available_en", "voicemail_off": "available_en_voicemail_config"}, "3": "wait_en", "4": "hold_en", "6": "callback_en", "7": "callback-confirmation_en", "8": "call-recording-opt-out_en", "9": "call-recording-opt-in_en"}, "sms_group_id": null, "capabilities": {"sms": true, "mms": true, "voice": true, "emergency_address": true}, "sms_enabled": false, "voice_enabled": true, "priority": 0, "outbound_enabled": true, "line_type": "phone", "ivr_id": null, "schedule_id": null, "failover_number": null}, "emitted_at": 1674159481130} From 72134ac30089f408a7c8ec88b68a36768c502d36 Mon Sep 17 00:00:00 2001 From: midavadim Date: Tue, 24 Jan 2023 00:28:18 +0200 Subject: [PATCH 046/195] added test_strictness_level: high (#21615) --- .../acceptance-test-config.yml | 4 +- .../integration_tests/abnormal_state.json | 28 +- .../integration_tests/expected_records.txt | 427 ++++++++++++++++++ 3 files changed, 444 insertions(+), 15 deletions(-) create mode 100644 airbyte-integrations/connectors/source-surveymonkey/integration_tests/expected_records.txt diff --git a/airbyte-integrations/connectors/source-surveymonkey/acceptance-test-config.yml b/airbyte-integrations/connectors/source-surveymonkey/acceptance-test-config.yml index 91335962bc087..b3cdc21cc4455 100644 --- a/airbyte-integrations/connectors/source-surveymonkey/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-surveymonkey/acceptance-test-config.yml @@ -1,4 +1,5 @@ connector_image: airbyte/source-surveymonkey:dev +test_strictness_level: high acceptance_tests: spec: tests: @@ -15,7 +16,8 @@ acceptance_tests: basic_read: tests: - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" + expect_records: + path: "integration_tests/expected_records.txt" incremental: tests: - config_path: "secrets/config.json" diff --git a/airbyte-integrations/connectors/source-surveymonkey/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-surveymonkey/integration_tests/abnormal_state.json index 93204c4f0c708..30c1a1bd3ea9c 100644 --- a/airbyte-integrations/connectors/source-surveymonkey/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-surveymonkey/integration_tests/abnormal_state.json @@ -2,7 +2,7 @@ { "type": "STREAM", "stream": { - "stream_state": { "date_modified": "2050-06-10T11:02:01" }, + "stream_state": { "date_modified": "2023-01-19T10:02:01" }, "stream_descriptor": { "name": "surveys" } } }, @@ -10,19 +10,19 @@ "type": "STREAM", "stream": { "stream_state": { - "306079584": { "date_modified": "2050-06-08T18:17:18+00:00" }, - "307785429": { "date_modified": "2050-06-10T10:59:43+00:00" }, - "307785444": { "date_modified": "2050-06-10T11:00:19+00:00" }, - "307785394": { "date_modified": "2050-06-10T11:00:59+00:00" }, - "307785402": { "date_modified": "2050-06-10T11:01:31+00:00" }, - "307785408": { "date_modified": "2050-06-10T11:02:08+00:00" }, - "307785448": { "date_modified": "2050-06-10T11:02:49+00:00" }, - "307784834": { "date_modified": "2050-06-10T11:03:45+00:00" }, - "307784863": { "date_modified": "2050-06-10T11:04:29+00:00" }, - "307784846": { "date_modified": "2050-06-10T11:05:05+00:00" }, - "307784856": { "date_modified": "2050-06-10T11:05:44+00:00" }, - "307785388": { "date_modified": "2050-06-10T11:06:20+00:00" }, - "307785415": { "date_modified": "2050-06-10T11:06:43+00:00" } + "306079584": { "date_modified": "2023-01-19T10:17:18+00:00" }, + "307785429": { "date_modified": "2023-01-19T10:59:43+00:00" }, + "307785444": { "date_modified": "2023-01-19T10:00:19+00:00" }, + "307785394": { "date_modified": "2023-01-19T10:00:59+00:00" }, + "307785402": { "date_modified": "2023-01-19T10:01:31+00:00" }, + "307785408": { "date_modified": "2023-01-19T10:02:08+00:00" }, + "307785448": { "date_modified": "2023-01-19T10:02:49+00:00" }, + "307784834": { "date_modified": "2023-01-19T10:03:45+00:00" }, + "307784863": { "date_modified": "2023-01-19T10:04:29+00:00" }, + "307784846": { "date_modified": "2023-01-19T10:05:05+00:00" }, + "307784856": { "date_modified": "2023-01-19T10:05:44+00:00" }, + "307785388": { "date_modified": "2023-01-19T10:06:20+00:00" }, + "307785415": { "date_modified": "2023-01-19T10:06:43+00:00" } }, "stream_descriptor": { "name": "survey_responses" } } diff --git a/airbyte-integrations/connectors/source-surveymonkey/integration_tests/expected_records.txt b/airbyte-integrations/connectors/source-surveymonkey/integration_tests/expected_records.txt new file mode 100644 index 0000000000000..b62dd05555155 --- /dev/null +++ b/airbyte-integrations/connectors/source-surveymonkey/integration_tests/expected_records.txt @@ -0,0 +1,427 @@ +{"stream":"surveys","data":{"title":"Market Research - Product Testing Template","nickname":"","language":"en","folder_id":"0","category":"market_research","question_count":13,"page_count":1,"response_count":13,"date_created":"2021-05-07T06:18:00","date_modified":"2021-06-08T18:09:00","id":"306079584","buttons_text":{"next_button":"Next >>","prev_button":"<< Prev","done_button":"Done","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/306079584","analyze_url":"https://www.surveymonkey.com/analyze/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D","edit_url":"https://www.surveymonkey.com/create/?sm=5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D","summary_url":"https://www.surveymonkey.com/summary/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=8T1PwDGoJHE1lbkxjUnaGitKu8jxWzyoclw9fNsShflPlk6MYIzwJ2NgjlBw_2B7iV"},"emitted_at":1674149644633} +{"stream":"surveys","data":{"title":"yswa8kobijei1mkwaqxgy","nickname":"7b4p9vssf810mslcd0eqpcg9s7p0h","language":"it","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":18,"date_created":"2021-06-09T21:20:00","date_modified":"2021-06-10T10:59:00","id":"307785429","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307785429","analyze_url":"https://www.surveymonkey.com/analyze/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D","edit_url":"https://www.surveymonkey.com/create/?sm=BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D","summary_url":"https://www.surveymonkey.com/summary/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=YRpP3kxXMi2aJkgYoeyZrvuErii13mQ5DRN67Vm4WJ5avIMZ6YvzI_2Bc3FpERJDqx"},"emitted_at":1674149645341} +{"stream":"surveys","data":{"title":"wsfqk1di34d","nickname":"3pax9qjasev22ofir5dm4x45s","language":"ru","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":18,"date_created":"2021-06-09T21:20:00","date_modified":"2021-06-10T11:00:00","id":"307785444","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307785444","analyze_url":"https://www.surveymonkey.com/analyze/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D","edit_url":"https://www.surveymonkey.com/create/?sm=BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D","summary_url":"https://www.surveymonkey.com/summary/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=8fhTDITxRdeFQ_2BLWzVWxsJSU0nfgGgIbcvuAJ6C8LCdfivLn4FPj6xZP2o8_2FINMc"},"emitted_at":1674149646672} +{"stream":"surveys","data":{"title":"vpoha5euc66vp","nickname":"etv0tds1e45","language":"en","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":18,"date_created":"2021-06-09T21:19:00","date_modified":"2021-06-10T11:01:00","id":"307785394","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307785394","analyze_url":"https://www.surveymonkey.com/analyze/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D","edit_url":"https://www.surveymonkey.com/create/?sm=5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D","summary_url":"https://www.surveymonkey.com/summary/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=RPtFlMc_2B10dLjP_2BMbJ9eseMZkg_2FE5of5WUErPhwmC57Ij1xz0JOW7uC8i49BGEl8"},"emitted_at":1674149647495} +{"stream":"surveys","data":{"title":"s2d9px7cdril0v7789ab4f","nickname":"wnhin1ctnss8ebdgjef","language":"ru","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":18,"date_created":"2021-06-09T21:20:00","date_modified":"2021-06-10T11:02:00","id":"307785402","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307785402","analyze_url":"https://www.surveymonkey.com/analyze/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D","edit_url":"https://www.surveymonkey.com/create/?sm=BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D","summary_url":"https://www.surveymonkey.com/summary/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=RId_2BH4A8CUUX6zNvnFnfsb3wKFGuv8kLhz_2BApiG6Mbvu_2BLypJpz_2BM9EfoUuRXBcL"},"emitted_at":1674149648694} +{"stream":"surveys","data":{"title":"muxx41av9mp","nickname":"hfs5uo9cw1ce3j7rn7n8ncu88myc","language":"de","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":18,"date_created":"2021-06-09T21:20:00","date_modified":"2021-06-10T11:02:00","id":"307785408","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307785408","analyze_url":"https://www.surveymonkey.com/analyze/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D","edit_url":"https://www.surveymonkey.com/create/?sm=BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D","summary_url":"https://www.surveymonkey.com/summary/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=aPPwgAP8stOxnud8WXi8VHKMrUtKIqvd7JhVnp1f0Ucqjb7cbMATzGizMgcLO_2BzA"},"emitted_at":1674149650050} +{"stream":"surveys","data":{"title":"2iokp4jvp9ru5","nickname":"j2a0kxhq8lmawfqjkg0hx","language":"ru","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":21,"date_created":"2021-06-09T21:07:00","date_modified":"2021-06-10T11:03:00","id":"307784834","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307784834","analyze_url":"https://www.surveymonkey.com/analyze/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D","edit_url":"https://www.surveymonkey.com/create/?sm=moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D","summary_url":"https://www.surveymonkey.com/summary/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=5ovW9LrIPsdAlqAloFxtr_2BhNVquSJyqeGOsrEnkZn56chkdLSKQISgfvIUejUonU"},"emitted_at":1674149651284} +{"stream":"surveys","data":{"title":"9cnwcmdn39ox","nickname":"vih7eeixclb","language":"ru","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":18,"date_created":"2021-06-09T21:20:00","date_modified":"2021-06-10T11:03:00","id":"307785448","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307785448","analyze_url":"https://www.surveymonkey.com/analyze/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D","edit_url":"https://www.surveymonkey.com/create/?sm=BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D","summary_url":"https://www.surveymonkey.com/summary/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=CJF1TcWP7MthjVWkHhiX8ggWVFe484BBhGYkoi2XqDCTB9FcR1nlBSJ_2FeL47hNDV"},"emitted_at":1674149652147} +{"stream":"surveys","data":{"title":"i2bm4lqt5hxv614n4jcl0guxt5ehgf","nickname":"ti241ke4qo1i8iyqgpo0u6b2","language":"de","folder_id":"0","category":"","question_count":2,"page_count":3,"response_count":20,"date_created":"2021-06-09T21:07:00","date_modified":"2021-06-10T11:04:00","id":"307784863","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307784863","analyze_url":"https://www.surveymonkey.com/analyze/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D","edit_url":"https://www.surveymonkey.com/create/?sm=moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D","summary_url":"https://www.surveymonkey.com/summary/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=kSWrVa29zWxvAB20ibAMkgPUDRBw_2B_2BTV0eX3oRPIEDNdxc2vxtOGJkQUGITIEart"},"emitted_at":1674149653219} +{"stream":"surveys","data":{"title":"j057iyqgxlotswo070","nickname":"wxuyqq4cgmfo69ik778r","language":"ru","folder_id":"0","category":"","question_count":6,"page_count":3,"response_count":20,"date_created":"2021-06-09T21:07:00","date_modified":"2021-06-10T11:05:00","id":"307784846","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307784846","analyze_url":"https://www.surveymonkey.com/analyze/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D","edit_url":"https://www.surveymonkey.com/create/?sm=moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D","summary_url":"https://www.surveymonkey.com/summary/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=c5YOr2YH8sSXNlr7K0Tsuhs54aXml2seWFuXS8MIqk7n5MinBfQ7OjzW_2BtjWV1Cv"},"emitted_at":1674149653897} +{"stream":"surveys","data":{"title":"u7r02s47jr","nickname":"ye7fubxhua91ce0fxm","language":"ru","folder_id":"0","category":"","question_count":3,"page_count":3,"response_count":20,"date_created":"2021-06-09T21:07:00","date_modified":"2021-06-10T11:05:00","id":"307784856","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307784856","analyze_url":"https://www.surveymonkey.com/analyze/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D","edit_url":"https://www.surveymonkey.com/create/?sm=moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D","summary_url":"https://www.surveymonkey.com/summary/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=hW7YBNPL4euOVIMWVdvchE0xWtfXGoQrT7wUyFAtDel65HbgmAwoV7JJRkkkFmhn"},"emitted_at":1674149655178} +{"stream":"surveys","data":{"title":"igpfp2yfsw90df6nxbsb49v","nickname":"h23gl22ulmfsyt4q7xt","language":"ru","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":20,"date_created":"2021-06-09T21:19:00","date_modified":"2021-06-10T11:06:00","id":"307785388","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307785388","analyze_url":"https://www.surveymonkey.com/analyze/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D","edit_url":"https://www.surveymonkey.com/create/?sm=5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D","summary_url":"https://www.surveymonkey.com/summary/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=khUJQv9z4_2FXXzGUox57WEUPwppIr8YqRqVru77WpakX1HW8hHMmGXZiDGslFZym6"},"emitted_at":1674149655888} +{"stream":"surveys","data":{"title":"b9jo5h23l7pa","nickname":"qhs5vg2qi0o4arsjiwy2ay00n82n","language":"ru","folder_id":"0","category":"","question_count":10,"page_count":3,"response_count":20,"date_created":"2021-06-09T21:20:00","date_modified":"2021-06-10T11:07:00","id":"307785415","buttons_text":{"next_button":"Nex >>>>>","prev_button":"Nix <<<<<","done_button":"Nax_Don_Gon!","exit_button":""},"is_owner":true,"footer":true,"theme_id":"4510354","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/307785415","analyze_url":"https://www.surveymonkey.com/analyze/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D","edit_url":"https://www.surveymonkey.com/create/?sm=BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D","summary_url":"https://www.surveymonkey.com/summary/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=YVdtL_2BP5oiGTrfksyofvENkBr7v87Xfh8hbcJr8rbqgesWvwJjz5N1F7pCSRcDoy"},"emitted_at":1674149657223} +{"stream":"surveys","data":{"title":"jjj","nickname":"","language":"en","folder_id":"0","category":"","question_count":0,"page_count":1,"response_count":0,"date_created":"2023-01-17T09:17:00","date_modified":"2023-01-17T09:17:00","id":"510388524","buttons_text":{"next_button":"Next","prev_button":"Prev","done_button":"Done","exit_button":""},"is_owner":true,"footer":true,"theme_id":"10292568","custom_variables":{},"href":"https://api.surveymonkey.com/v3/surveys/510388524","analyze_url":"https://www.surveymonkey.com/analyze/VXMmVNBbmOp9KTSvXdhjIr3FHnqleAX32lr9MLBIOE0_3D","edit_url":"https://www.surveymonkey.com/create/?sm=VXMmVNBbmOp9KTSvXdhjIr3FHnqleAX32lr9MLBIOE0_3D","collect_url":"https://www.surveymonkey.com/collect/list?sm=VXMmVNBbmOp9KTSvXdhjIr3FHnqleAX32lr9MLBIOE0_3D","summary_url":"https://www.surveymonkey.com/summary/VXMmVNBbmOp9KTSvXdhjIr3FHnqleAX32lr9MLBIOE0_3D","preview":"https://www.surveymonkey.com/r/Preview/?sm=TPlNncbuCs17cvxwjuS74VC03_2FOcqpP_2F03m2gerTSI_2FQvLWoY2yn_2FWxLDmxYOp5L"},"emitted_at":1674149658247} +{"stream":"survey_responses","data":{"id":"12706126725","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"124.123.178.184","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=hNu3QJYf07WiUPOwxCYcARURFGB3ruOrs9slcTHVhmhgDhoNJ0k7w3jCvo0nLM40","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706126725","total_time":62,"date_modified":"2021-06-01T17:40:54+00:00","date_created":"2021-06-01T17:39:51+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706126725","pages":[{"id":"165250506","questions":[{"id":"652286715","answers":[{"choice_id":"4285525064"}]},{"id":"652286721","answers":[{"choice_id":"4285525084"}]},{"id":"652286716","answers":[{"choice_id":"4285525070"}]},{"id":"652286718","answers":[{"choice_id":"4285525079"}]},{"id":"652286722","answers":[{"choice_id":"4285525089"}]},{"id":"652286717","answers":[{"choice_id":"4285525074"}]},{"id":"652286723","answers":[{"choice_id":"4285525095"}]},{"id":"652286714","answers":[{"choice_id":"4285525058","row_id":"4285525061","choice_metadata":{"weight":"0"}}]}]}]},"emitted_at":1674149660097} +{"stream":"survey_responses","data":{"id":"12706152767","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"37.229.17.15","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=YIZz5DiXEDES47ARxTbRPzAA9ZOwCjcN_2FDSFTYGWgCVPQCo_2B3EeLirGlON5_2BjrX5","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706152767","total_time":55,"date_modified":"2021-06-01T17:50:03+00:00","date_created":"2021-06-01T17:49:08+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706152767","pages":[{"id":"165250506","questions":[{"id":"652286726","answers":[{"tag_data":[],"text":"fuck this"}]},{"id":"652286715","answers":[{"choice_id":"4285525067"}]},{"id":"652286721","answers":[{"choice_id":"4285525087"}]},{"id":"652286716","answers":[{"choice_id":"4285525072"}]},{"id":"652286718","answers":[{"choice_id":"4285525081"}]},{"id":"652286722","answers":[{"choice_id":"4285525091"}]},{"id":"652286717","answers":[{"choice_id":"4285525077"}]},{"id":"652286723","answers":[{"choice_id":"4285525097"}]},{"id":"652286714","answers":[{"choice_id":"4285525052","row_id":"4285525061","choice_metadata":{"weight":"-100"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"waste of time"}]}]}]},"emitted_at":1674149660099} +{"stream":"survey_responses","data":{"id":"12706159691","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"157.48.231.67","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=P4z1eeLex6p2OQEYYXRJKBxPyHk6ljkOskXPds2olEToYrU_2FwTZWAyllEtgJRyQL","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706159691","total_time":104,"date_modified":"2021-06-01T17:52:27+00:00","date_created":"2021-06-01T17:50:43+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706159691","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286715","answers":[{"choice_id":"4285525065"}]},{"id":"652286721","answers":[{"choice_id":"4285525086"}]},{"id":"652286716","answers":[{"choice_id":"4285525071"}]},{"id":"652286718","answers":[{"choice_id":"4285525079"}]},{"id":"652286722","answers":[{"choice_id":"4285525090"}]},{"id":"652286717","answers":[{"choice_id":"4285525076"}]},{"id":"652286723","answers":[{"choice_id":"4285525095"}]},{"id":"652286714","answers":[{"choice_id":"4285525055","row_id":"4285525061","choice_metadata":{"weight":"-100"}}]}]}]},"emitted_at":1674149660100} +{"stream":"survey_responses","data":{"id":"12706182356","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"76.14.176.236","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=oRBufZrmuNVZW5ou_2B4ZICuFqW6p3uYPmpjTb5IJ5Zf_2BH4FPoHKfnz_2BSC_2FR_2FpxWNq","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706182356","total_time":36,"date_modified":"2021-06-01T18:00:12+00:00","date_created":"2021-06-01T17:59:35+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706182356","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286715","answers":[{"choice_id":"4285525063"}]},{"id":"652286721","answers":[{"choice_id":"4285525085"}]},{"id":"652286716","answers":[{"choice_id":"4285525072"}]},{"id":"652286718","answers":[{"choice_id":"4285525082"}]},{"id":"652286722","answers":[{"choice_id":"4285525092"}]},{"id":"652286717","answers":[{"choice_id":"4285525077"}]},{"id":"652286723","answers":[{"choice_id":"4285525097"}]},{"id":"652286714","answers":[{"choice_id":"4285525060","row_id":"4285525061","choice_metadata":{"weight":"100"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"gekkiadsuigasdf;oij sefhello 🍐🍐🍐🍐🍐"}]},{"id":"652286720","answers":[{"tag_data":[],"text":"good"}]}]}]},"emitted_at":1674149660102} +{"stream":"survey_responses","data":{"id":"12706201784","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"49.37.158.6","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=MD0lXMX2bJm93XLiSKWuW2p52_2BwlWpayf88naadbuO5wITz0TijA3kwSis907xu1","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706201784","total_time":183,"date_modified":"2021-06-01T18:06:11+00:00","date_created":"2021-06-01T18:03:07+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706201784","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286726","answers":[{"tag_data":[],"text":"Colour"}]},{"id":"652286715","answers":[{"choice_id":"4285525064"}]},{"id":"652286721","answers":[{"choice_id":"4285525085"}]},{"id":"652286716","answers":[{"choice_id":"4285525070"}]},{"id":"652286718","answers":[{"choice_id":"4285525079"}]},{"id":"652286722","answers":[{"choice_id":"4285525090"}]},{"id":"652286717","answers":[{"choice_id":"4285525076"}]},{"id":"652286723","answers":[{"choice_id":"4285525097"}]},{"id":"652286714","answers":[{"choice_id":"4285525055","row_id":"4285525061","choice_metadata":{"weight":"-100"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"Nothing"}]},{"id":"652286720","answers":[{"tag_data":[],"text":"I don't know"}]}]}]},"emitted_at":1674149660104} +{"stream":"survey_responses","data":{"id":"12706203862","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"49.205.239.133","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=sNkTdEY_2FEibixIxcUhotq6hQ3muFVlLkg0cE531VDB5Ya2U21pwazZRwwSXFqqtK","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706203862","total_time":114,"date_modified":"2021-06-01T18:06:49+00:00","date_created":"2021-06-01T18:04:54+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706203862","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286726","answers":[{"tag_data":[],"text":"because pets should not be tied,they should have their own freedom to move"}]},{"id":"652286715","answers":[{"choice_id":"4285525065"}]},{"id":"652286721","answers":[{"choice_id":"4285525085"}]},{"id":"652286716","answers":[{"choice_id":"4285525071"}]},{"id":"652286718","answers":[{"choice_id":"4285525080"}]},{"id":"652286722","answers":[{"choice_id":"4285525090"}]},{"id":"652286717","answers":[{"choice_id":"4285525076"}]},{"id":"652286723","answers":[{"choice_id":"4285525096"}]},{"id":"652286714","answers":[{"choice_id":"4285525055","row_id":"4285525061","choice_metadata":{"weight":"-100"}}]}]}]},"emitted_at":1674149660106} +{"stream":"survey_responses","data":{"id":"12706264166","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"27.6.69.132","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=OboVhBA1nCZ4ejfYCmJ6WDu5SxhIUnnNn2dCz_2BTqxksFnjOSpy88MtS4B5Wbpk_2BW","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706264166","total_time":309,"date_modified":"2021-06-01T18:27:03+00:00","date_created":"2021-06-01T18:21:54+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706264166","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286726","answers":[{"tag_data":[],"text":"🤔"}]},{"id":"652286715","answers":[{"choice_id":"4285525065"}]},{"id":"652286721","answers":[{"choice_id":"4285525085"}]},{"id":"652286716","answers":[{"choice_id":"4285525070"}]},{"id":"652286718","answers":[{"choice_id":"4285525081"}]},{"id":"652286722","answers":[{"choice_id":"4285525091"}]},{"id":"652286717","answers":[{"choice_id":"4285525076"}]},{"id":"652286723","answers":[{"choice_id":"4285525096"}]},{"id":"652286714","answers":[{"choice_id":"4285525058","row_id":"4285525061","choice_metadata":{"weight":"0"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"🦴"}]},{"id":"652286720","answers":[{"tag_data":[],"text":"💪"}]}]}]},"emitted_at":1674149660108} +{"stream":"survey_responses","data":{"id":"12706274940","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"49.205.116.166","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=D1IcNXq6BKOBmkySTfHcUfHuH3_2Fa0aniMPQEG23UrQ16iSsyx8ye2hPRQt3C61Jd","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706274940","total_time":105,"date_modified":"2021-06-01T18:30:56+00:00","date_created":"2021-06-01T18:29:10+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706274940","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286726","answers":[{"tag_data":[],"text":"Didn't like the product"}]},{"id":"652286715","answers":[{"choice_id":"4285525067"}]},{"id":"652286721","answers":[{"choice_id":"4285525087"}]},{"id":"652286716","answers":[{"choice_id":"4285525072"}]},{"id":"652286718","answers":[{"choice_id":"4285525081"}]},{"id":"652286722","answers":[{"choice_id":"4285525092"}]},{"id":"652286717","answers":[{"choice_id":"4285525077"}]},{"id":"652286723","answers":[{"choice_id":"4285525097"}]},{"id":"652286714","answers":[{"choice_id":"4285525050","row_id":"4285525061","choice_metadata":{"weight":"-100"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"Nothing"}]},{"id":"652286720","answers":[{"tag_data":[],"text":"Better don't try to work on it"}]}]}]},"emitted_at":1674149660110} +{"stream":"survey_responses","data":{"id":"12706353147","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"176.37.67.33","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=qwY5AKZSqBd7DfoZDGr4x_2FJr28RhtoeaQ7_2F6VBS1G3yK_2FPH86sPCcFs1zACVlbMO","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706353147","total_time":162,"date_modified":"2021-06-01T18:58:44+00:00","date_created":"2021-06-01T18:56:02+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706353147","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286726","answers":[{"tag_data":[],"text":"I like logo."}]},{"id":"652286715","answers":[{"choice_id":"4285525065"}]},{"id":"652286721","answers":[{"choice_id":"4285525085"}]},{"id":"652286716","answers":[{"choice_id":"4285525071"}]},{"id":"652286718","answers":[{"choice_id":"4285525081"}]},{"id":"652286722","answers":[{"choice_id":"4285525090"}]},{"id":"652286717","answers":[{"choice_id":"4285525076"}]},{"id":"652286723","answers":[{"choice_id":"4285525096"}]},{"id":"652286714","answers":[{"choice_id":"4285525056","row_id":"4285525061","choice_metadata":{"weight":"-100"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"Logo."}]},{"id":"652286720","answers":[{"tag_data":[],"text":"Nothing."}]}]}]},"emitted_at":1674149660111} +{"stream":"survey_responses","data":{"id":"12707255568","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"157.48.145.117","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=3XYG_2F55lVJgeQ0_2FWG3xyRxOF5gCKFR0p1HPkdv1iiMZ1h5MIYxNR12enFBgK9TCS","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12707255568","total_time":263,"date_modified":"2021-06-02T01:13:33+00:00","date_created":"2021-06-02T01:09:10+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12707255568","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286726","answers":[{"tag_data":[],"text":"I love puppies but hate heart symbol"}]},{"id":"652286715","answers":[{"choice_id":"4285525063"}]},{"id":"652286721","answers":[{"choice_id":"4285525084"}]},{"id":"652286716","answers":[{"choice_id":"4285525070"}]},{"id":"652286718","answers":[{"choice_id":"4285525080"}]},{"id":"652286722","answers":[{"choice_id":"4285525089"}]},{"id":"652286717","answers":[{"choice_id":"4285525075"}]},{"id":"652286723","answers":[{"choice_id":"4285525095"}]},{"id":"652286714","answers":[{"choice_id":"4285525056","row_id":"4285525061","choice_metadata":{"weight":"-100"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"It's for animals"}]},{"id":"652286720","answers":[{"tag_data":[],"text":"Approach to customer"}]}]}]},"emitted_at":1674149660112} +{"stream":"survey_responses","data":{"id":"12707566461","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"106.195.73.137","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=FskCSEofrdcabC7MVfRNtzeiZ4C4kiwx_2FpBdpRfIsd5SgVGi4N9znXMS9exRXf27","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12707566461","total_time":233,"date_modified":"2021-06-02T04:06:48+00:00","date_created":"2021-06-02T04:02:54+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12707566461","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286715","answers":[{"choice_id":"4285525065"}]},{"id":"652286721","answers":[{"choice_id":"4285525084"}]},{"id":"652286716","answers":[{"choice_id":"4285525069"}]},{"id":"652286718","answers":[{"choice_id":"4285525080"}]},{"id":"652286722","answers":[{"choice_id":"4285525090"}]},{"id":"652286717","answers":[{"choice_id":"4285525075"}]},{"id":"652286723","answers":[{"choice_id":"4285525096"}]},{"id":"652286714","answers":[{"choice_id":"4285525058","row_id":"4285525061","choice_metadata":{"weight":"0"}}]}]}]},"emitted_at":1674149660113} +{"stream":"survey_responses","data":{"id":"12709748835","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.196.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=x5BdjfYWF_2B2dRs9qPRcHJ_2BqMN8Dpfn_2FfhKhtD7G8W4_2BX9ECDWh9wAXjYd4mxXk_2F_2B","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12709748835","total_time":127,"date_modified":"2021-06-02T18:14:19+00:00","date_created":"2021-06-02T18:12:12+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12709748835","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286726","answers":[{"tag_data":[],"text":"because"}]},{"id":"652286715","answers":[{"choice_id":"4285525063"}]},{"id":"652286721","answers":[{"choice_id":"4285525084"}]},{"id":"652286716","answers":[{"choice_id":"4285525069"}]},{"id":"652286718","answers":[{"choice_id":"4285525079"}]},{"id":"652286722","answers":[{"choice_id":"4285525089"}]},{"id":"652286717","answers":[{"choice_id":"4285525074"}]},{"id":"652286723","answers":[{"choice_id":"4285525095"}]},{"id":"652286714","answers":[{"choice_id":"4285525060","row_id":"4285525061","choice_metadata":{"weight":"100"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"u"}]},{"id":"652286720","answers":[{"tag_data":[],"text":"f"}]}]}]},"emitted_at":1674149660114} +{"stream":"survey_responses","data":{"id":"12706107193","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"49.37.150.53","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405437100","survey_id":"306079584","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=7vMzRy38ln3J_2FJiU8YD1uve9yI6cAQIQ_2FuVxRipS_2FyB57w9vo9xpgShOuFWVcoI2","analyze_url":"https://www.surveymonkey.com/analyze/browse/5jPPwKLnlqevaUQom_2BgYAWJWlrKNA2ZFTOYrMBrqW2c_3D?respondent_id=12706107193","total_time":607550,"date_modified":"2021-06-08T18:17:17+00:00","date_created":"2021-06-01T17:31:26+00:00","href":"https://api.surveymonkey.com/v3/surveys/306079584/responses/12706107193","pages":[{"id":"165250506","questions":[{"id":"652286724","answers":[{"row_id":"4285525098"}]},{"id":"652286725","answers":[{"row_id":"4285525102"}]},{"id":"652286726","answers":[{"tag_data":[],"text":"It seems in that way"}]},{"id":"652286715","answers":[{"choice_id":"4285525065"}]},{"id":"652286721","answers":[{"choice_id":"4285525085"}]},{"id":"652286716","answers":[{"choice_id":"4285525071"}]},{"id":"652286718","answers":[{"choice_id":"4285525081"}]},{"id":"652286722","answers":[{"choice_id":"4285525090"}]},{"id":"652286717","answers":[{"choice_id":"4285525075"}]},{"id":"652286723","answers":[{"choice_id":"4285525096"}]},{"id":"652286714","answers":[{"choice_id":"4285525050","row_id":"4285525061","choice_metadata":{"weight":"-100"}}]},{"id":"652286719","answers":[{"tag_data":[],"text":"Nothing much"}]},{"id":"652286720","answers":[{"tag_data":[],"text":"Will include Tagline"}]}]}]},"emitted_at":1674149660116} +{"stream":"survey_responses","data":{"id":"12731040927","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=YORvkBiLvNm2647vGYxs1GGGoUjDrz_2FRfIWw1i07UtykH_2BBJHDTB3ujkOPfyAxqP","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731040927","total_time":31,"date_modified":"2021-06-10T08:46:53+00:00","date_created":"2021-06-10T08:46:22+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731040927","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175368"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175448"}]},{"id":"667461897","answers":[{"choice_id":"4385175533"}]},{"id":"667461902","answers":[{"choice_id":"4385175563"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175735"}]},{"id":"667461934","answers":[{"choice_id":"4385175737"}]},{"id":"667461936","answers":[{"choice_id":"4385175742"}]},{"id":"667461937","answers":[{"choice_id":"4385175749"}]},{"id":"667461986","answers":[{"choice_id":"4385175881"}]}]}]},"emitted_at":1674149661798} +{"stream":"survey_responses","data":{"id":"12731055204","recipient_id":"","collection_mode":"default","response_status":"partial","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":["168831413","168831415","168831437"],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=tcbSSptg67E5MmPiY_2BCTC0GEk5rcm_2FHHcASKwxBGLOX_2BBByesO_2Fh848B_2FqaaVF8d","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731055204","total_time":15,"date_modified":"2021-06-10T08:54:22+00:00","date_created":"2021-06-10T08:54:07+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731055204","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175369"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175447"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175563"}]}]},{"id":"168831437","questions":[]}]},"emitted_at":1674149661798} +{"stream":"survey_responses","data":{"id":"12731069666","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=tHWbA6E0Q6UEylVBreS0XaGKh3GcjDQu_2FBytp_2F_2FcCSkYTgRKkVt3jyyhUFoh6T_2Bs","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731069666","total_time":33,"date_modified":"2021-06-10T09:02:19+00:00","date_created":"2021-06-10T09:01:46+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731069666","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175366"}]},{"id":"667461861","answers":[{"choice_id":"4385175380"}]},{"id":"667461876","answers":[{"choice_id":"4385175448"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175559"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175733"}]},{"id":"667461934","answers":[{"choice_id":"4385175736"}]},{"id":"667461936","answers":[{"choice_id":"4385175741"}]},{"id":"667461937","answers":[{"choice_id":"4385175752"}]},{"id":"667461986","answers":[{"choice_id":"4385175878"}]}]}]},"emitted_at":1674149661799} +{"stream":"survey_responses","data":{"id":"12731085951","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=c_2B3Xk1rn3Lhz9GqaPNSRmjd03YiGx88BQu_2BtAvHiMmp5a0BR68kWLCOfALzBwKH4","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731085951","total_time":31,"date_modified":"2021-06-10T09:10:05+00:00","date_created":"2021-06-10T09:09:34+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731085951","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175368"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175448"}]},{"id":"667461897","answers":[{"choice_id":"4385175533"}]},{"id":"667461902","answers":[{"choice_id":"4385175564"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175732"}]},{"id":"667461934","answers":[{"choice_id":"4385175737"}]},{"id":"667461936","answers":[{"choice_id":"4385175741"}]},{"id":"667461937","answers":[{"choice_id":"4385175745"}]},{"id":"667461986","answers":[{"choice_id":"4385175880"}]}]}]},"emitted_at":1674149661799} +{"stream":"survey_responses","data":{"id":"12731102076","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=s_2BQLUH6Nb049vqmxYdKTQlIV_2FCXzxmRR5F_2B_2Fe9FaqXRh3H_2FZAFF51mqyI3e8s666","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731102076","total_time":32,"date_modified":"2021-06-10T09:17:44+00:00","date_created":"2021-06-10T09:17:12+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731102076","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175369"}]},{"id":"667461861","answers":[{"choice_id":"4385175381"}]},{"id":"667461876","answers":[{"choice_id":"4385175447"}]},{"id":"667461897","answers":[{"choice_id":"4385175535"}]},{"id":"667461902","answers":[{"choice_id":"4385175561"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175735"}]},{"id":"667461934","answers":[{"choice_id":"4385175739"}]},{"id":"667461936","answers":[{"choice_id":"4385175740"}]},{"id":"667461937","answers":[{"choice_id":"4385175745"}]},{"id":"667461986","answers":[{"choice_id":"4385175880"}]}]}]},"emitted_at":1674149661799} +{"stream":"survey_responses","data":{"id":"12731118899","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=hRALwRgDjAOTNk8Hpt0wWWn9X3xurqWW9vynXjPkvIvI4Xofu_2FJSgEVwtWK23vLd","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731118899","total_time":31,"date_modified":"2021-06-10T09:25:25+00:00","date_created":"2021-06-10T09:24:53+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731118899","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175369"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175447"}]},{"id":"667461897","answers":[{"choice_id":"4385175533"}]},{"id":"667461902","answers":[{"choice_id":"4385175559"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175734"}]},{"id":"667461934","answers":[{"choice_id":"4385175737"}]},{"id":"667461936","answers":[{"choice_id":"4385175742"}]},{"id":"667461937","answers":[{"choice_id":"4385175745"}]},{"id":"667461986","answers":[{"choice_id":"4385175878"}]}]}]},"emitted_at":1674149661800} +{"stream":"survey_responses","data":{"id":"12731135865","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=OEPuy4AY_2B47LLaYrOMe90r_2BJdHiKxv12FpoQr0N94GGA0TFN7l7tk5QH14HD_2FaBy","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731135865","total_time":31,"date_modified":"2021-06-10T09:33:08+00:00","date_created":"2021-06-10T09:32:37+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731135865","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175368"}]},{"id":"667461861","answers":[{"choice_id":"4385175381"}]},{"id":"667461876","answers":[{"choice_id":"4385175449"}]},{"id":"667461897","answers":[{"choice_id":"4385175535"}]},{"id":"667461902","answers":[{"choice_id":"4385175563"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175735"}]},{"id":"667461934","answers":[{"choice_id":"4385175737"}]},{"id":"667461936","answers":[{"choice_id":"4385175742"}]},{"id":"667461937","answers":[{"choice_id":"4385175748"}]},{"id":"667461986","answers":[{"choice_id":"4385175880"}]}]}]},"emitted_at":1674149661800} +{"stream":"survey_responses","data":{"id":"12731153599","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=KPgqZwkF7GLrzwtQWhwpZBCuPbq_2F_2BuXfuUXpCBXX1y_2BwKBvvXi7s1ob9AMVJymCk","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731153599","total_time":31,"date_modified":"2021-06-10T09:40:49+00:00","date_created":"2021-06-10T09:40:18+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731153599","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175366"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175448"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175561"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175732"}]},{"id":"667461934","answers":[{"choice_id":"4385175737"}]},{"id":"667461936","answers":[{"choice_id":"4385175740"}]},{"id":"667461937","answers":[{"choice_id":"4385175751"}]},{"id":"667461986","answers":[{"choice_id":"4385175880"}]}]}]},"emitted_at":1674149661800} +{"stream":"survey_responses","data":{"id":"12731170943","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=e6QtiM7XZfbHB3Ln1ifDr6Ct8PD0j6Nikh_2BTvBikLVfpeCSzS5WYkg2D_2BDVygAee","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731170943","total_time":31,"date_modified":"2021-06-10T09:48:36+00:00","date_created":"2021-06-10T09:48:04+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731170943","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175366"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175447"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175563"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175733"}]},{"id":"667461934","answers":[{"choice_id":"4385175736"}]},{"id":"667461936","answers":[{"choice_id":"4385175740"}]},{"id":"667461937","answers":[{"choice_id":"4385175748"}]},{"id":"667461986","answers":[{"choice_id":"4385175879"}]}]}]},"emitted_at":1674149661801} +{"stream":"survey_responses","data":{"id":"12731188992","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=VATG0VEAVLLh8CTsnDoMZ_2FR3ida2C_2FIqVwt3FHGuc0GRu_2BA6Qa9E4Ewd3iEHt5YQ","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731188992","total_time":35,"date_modified":"2021-06-10T09:56:51+00:00","date_created":"2021-06-10T09:56:15+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731188992","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175366"}]},{"id":"667461861","answers":[{"choice_id":"4385175381"}]},{"id":"667461876","answers":[{"choice_id":"4385175447"}]},{"id":"667461897","answers":[{"choice_id":"4385175533"}]},{"id":"667461902","answers":[{"choice_id":"4385175559"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175735"}]},{"id":"667461934","answers":[{"choice_id":"4385175738"}]},{"id":"667461936","answers":[{"choice_id":"4385175741"}]},{"id":"667461937","answers":[{"choice_id":"4385175749"}]},{"id":"667461986","answers":[{"choice_id":"4385175881"}]}]}]},"emitted_at":1674149661801} +{"stream":"survey_responses","data":{"id":"12731208790","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=KH_2Bhsc8oIpTdaX60RIwFQ1SDyudOf2_2B61W7cPCZGGXEKsY5_2FN_2BA_2B_2FXh0DeOOdA7F","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731208790","total_time":32,"date_modified":"2021-06-10T10:05:01+00:00","date_created":"2021-06-10T10:04:28+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731208790","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175368"}]},{"id":"667461861","answers":[{"choice_id":"4385175380"}]},{"id":"667461876","answers":[{"choice_id":"4385175449"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175559"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175735"}]},{"id":"667461934","answers":[{"choice_id":"4385175737"}]},{"id":"667461936","answers":[{"choice_id":"4385175741"}]},{"id":"667461937","answers":[{"choice_id":"4385175752"}]},{"id":"667461986","answers":[{"choice_id":"4385175880"}]}]}]},"emitted_at":1674149661801} +{"stream":"survey_responses","data":{"id":"12731228560","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=vbsxUKDxxVbnJW7Gng6Y5VblTyjW_2F29grieRYQImUaIVF77GuhY3KDlqPsNfIlx6","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731228560","total_time":31,"date_modified":"2021-06-10T10:12:51+00:00","date_created":"2021-06-10T10:12:19+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731228560","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175369"}]},{"id":"667461861","answers":[{"choice_id":"4385175380"}]},{"id":"667461876","answers":[{"choice_id":"4385175449"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175561"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175735"}]},{"id":"667461934","answers":[{"choice_id":"4385175737"}]},{"id":"667461936","answers":[{"choice_id":"4385175741"}]},{"id":"667461937","answers":[{"choice_id":"4385175749"}]},{"id":"667461986","answers":[{"choice_id":"4385175882"}]}]}]},"emitted_at":1674149661801} +{"stream":"survey_responses","data":{"id":"12731247619","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=8lyrgf9sVRbhXAHse5glKYEJoYMvqlR2TNQIhI8Ycw716W_2FHlQeX6Ru4SKObInXR","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731247619","total_time":31,"date_modified":"2021-06-10T10:20:41+00:00","date_created":"2021-06-10T10:20:09+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731247619","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175366"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175448"}]},{"id":"667461897","answers":[{"choice_id":"4385175535"}]},{"id":"667461902","answers":[{"choice_id":"4385175563"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175734"}]},{"id":"667461934","answers":[{"choice_id":"4385175736"}]},{"id":"667461936","answers":[{"choice_id":"4385175740"}]},{"id":"667461937","answers":[{"choice_id":"4385175747"}]},{"id":"667461986","answers":[{"choice_id":"4385175881"}]}]}]},"emitted_at":1674149661802} +{"stream":"survey_responses","data":{"id":"12731266056","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=tkqgGP2ApNTakGiA0JrfYbKgIZElTj6_2FPaJ_2FDj0QNjpJDKCexid0Z_2Bq8vZoam1vK","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731266056","total_time":31,"date_modified":"2021-06-10T10:28:20+00:00","date_created":"2021-06-10T10:27:49+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731266056","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175369"}]},{"id":"667461861","answers":[{"choice_id":"4385175381"}]},{"id":"667461876","answers":[{"choice_id":"4385175449"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175563"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175732"}]},{"id":"667461934","answers":[{"choice_id":"4385175738"}]},{"id":"667461936","answers":[{"choice_id":"4385175740"}]},{"id":"667461937","answers":[{"choice_id":"4385175747"}]},{"id":"667461986","answers":[{"choice_id":"4385175882"}]}]}]},"emitted_at":1674149661802} +{"stream":"survey_responses","data":{"id":"12731286200","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=nYsBr3IsP19O_2BhTeV_2BWGnAdXc_2FFsnqMT6maJ0BS3QD9FqjkWLrNYzzEqKsT7c191","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731286200","total_time":35,"date_modified":"2021-06-10T10:36:27+00:00","date_created":"2021-06-10T10:35:52+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731286200","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175367"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175447"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175564"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175735"}]},{"id":"667461934","answers":[{"choice_id":"4385175738"}]},{"id":"667461936","answers":[{"choice_id":"4385175741"}]},{"id":"667461937","answers":[{"choice_id":"4385175752"}]},{"id":"667461986","answers":[{"choice_id":"4385175878"}]}]}]},"emitted_at":1674149661802} +{"stream":"survey_responses","data":{"id":"12731305366","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=iIxE7kshwG8vR6T6c2D0swVsNTfDLqcBVkfrnf_2FGZBTuoHjMm9ksd3LbOIXuF6lp","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731305366","total_time":34,"date_modified":"2021-06-10T10:44:10+00:00","date_created":"2021-06-10T10:43:36+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731305366","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175366"}]},{"id":"667461861","answers":[{"choice_id":"4385175380"}]},{"id":"667461876","answers":[{"choice_id":"4385175447"}]},{"id":"667461897","answers":[{"choice_id":"4385175533"}]},{"id":"667461902","answers":[{"choice_id":"4385175559"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175732"}]},{"id":"667461934","answers":[{"choice_id":"4385175736"}]},{"id":"667461936","answers":[{"choice_id":"4385175741"}]},{"id":"667461937","answers":[{"choice_id":"4385175749"}]},{"id":"667461986","answers":[{"choice_id":"4385175879"}]}]}]},"emitted_at":1674149661803} +{"stream":"survey_responses","data":{"id":"12731325134","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=cUq2_2BSagT6pk152_2BsGjjMAAQ2Qq0R0cxleIxEdHEEVKwV5oPCvktmmnTV82pa5S_2F","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731325134","total_time":31,"date_modified":"2021-06-10T10:52:02+00:00","date_created":"2021-06-10T10:51:30+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731325134","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175369"}]},{"id":"667461861","answers":[{"choice_id":"4385175382"}]},{"id":"667461876","answers":[{"choice_id":"4385175447"}]},{"id":"667461897","answers":[{"choice_id":"4385175535"}]},{"id":"667461902","answers":[{"choice_id":"4385175559"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175735"}]},{"id":"667461934","answers":[{"choice_id":"4385175739"}]},{"id":"667461936","answers":[{"choice_id":"4385175742"}]},{"id":"667461937","answers":[{"choice_id":"4385175751"}]},{"id":"667461986","answers":[{"choice_id":"4385175878"}]}]}]},"emitted_at":1674149661803} +{"stream":"survey_responses","data":{"id":"12731344038","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843657","survey_id":"307785429","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=F_2BuWfRunQKdf1g0xuu4mTzXMCAlXia21_2BnF47p_2FbjU4QII1hLaE3Xo6tWdfbzKqr","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxoENnL6uEj_2FlAo5YSBwashU_3D?respondent_id=12731344038","total_time":31,"date_modified":"2021-06-10T10:59:42+00:00","date_created":"2021-06-10T10:59:10+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785429/responses/12731344038","pages":[{"id":"168831413","questions":[]},{"id":"168831415","questions":[{"id":"667461858","answers":[{"choice_id":"4385175368"}]},{"id":"667461861","answers":[{"choice_id":"4385175381"}]},{"id":"667461876","answers":[{"choice_id":"4385175448"}]},{"id":"667461897","answers":[{"choice_id":"4385175534"}]},{"id":"667461902","answers":[{"choice_id":"4385175563"}]}]},{"id":"168831437","questions":[{"id":"667461933","answers":[{"choice_id":"4385175733"}]},{"id":"667461934","answers":[{"choice_id":"4385175739"}]},{"id":"667461936","answers":[{"choice_id":"4385175740"}]},{"id":"667461937","answers":[{"choice_id":"4385175750"}]},{"id":"667461986","answers":[{"choice_id":"4385175880"}]}]}]},"emitted_at":1674149661803} +{"stream":"survey_responses","data":{"id":"12731042086","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=SvCebsqkF1mO3kCZX7XsmQ4ABz0LFCf_2FyW5N2JOLuGh5ixjzbj2i04SarOUiUgPa","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731042086","total_time":31,"date_modified":"2021-06-10T08:47:30+00:00","date_created":"2021-06-10T08:46:58+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731042086","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176724"}]},{"id":"667462079","answers":[{"choice_id":"4385176728"}]},{"id":"667462082","answers":[{"choice_id":"4385176739"}]},{"id":"667462084","answers":[{"choice_id":"4385176764"}]},{"id":"667462086","answers":[{"choice_id":"4385176919"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176960"}]},{"id":"667462096","answers":[{"choice_id":"4385176970"}]},{"id":"667462099","answers":[{"choice_id":"4385176977"}]},{"id":"667462100","answers":[{"choice_id":"4385176987"}]},{"id":"667462102","answers":[{"choice_id":"4385177005"}]}]}]},"emitted_at":1674149663364} +{"stream":"survey_responses","data":{"id":"12731056238","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=r7v44AE_2Bx_2Fam5dgCBnlUkUkL0aSWyzhJkIPWmmYa5VnqMtd4X2DBzf9U9erpnCvI","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731056238","total_time":31,"date_modified":"2021-06-10T08:55:13+00:00","date_created":"2021-06-10T08:54:41+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731056238","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176723"}]},{"id":"667462079","answers":[{"choice_id":"4385176729"}]},{"id":"667462082","answers":[{"choice_id":"4385176738"}]},{"id":"667462084","answers":[{"choice_id":"4385176763"}]},{"id":"667462086","answers":[{"choice_id":"4385176919"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176962"}]},{"id":"667462096","answers":[{"choice_id":"4385176970"}]},{"id":"667462099","answers":[{"choice_id":"4385176979"}]},{"id":"667462100","answers":[{"choice_id":"4385176986"}]},{"id":"667462102","answers":[{"choice_id":"4385177005"}]}]}]},"emitted_at":1674149663365} +{"stream":"survey_responses","data":{"id":"12731070937","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=_2FuS4ZECIFCnV4LLPEe6gryzUPrf_2FMB8MB51Cv5cU6IQGsWb_2FRIb0BOaRXRodLTAq","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731070937","total_time":32,"date_modified":"2021-06-10T09:02:57+00:00","date_created":"2021-06-10T09:02:25+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731070937","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176724"}]},{"id":"667462079","answers":[{"choice_id":"4385176728"}]},{"id":"667462082","answers":[{"choice_id":"4385176735"}]},{"id":"667462084","answers":[{"choice_id":"4385176767"}]},{"id":"667462086","answers":[{"choice_id":"4385176920"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176961"}]},{"id":"667462096","answers":[{"choice_id":"4385176975"}]},{"id":"667462099","answers":[{"choice_id":"4385176978"}]},{"id":"667462100","answers":[{"choice_id":"4385176990"}]},{"id":"667462102","answers":[{"choice_id":"4385177007"}]}]}]},"emitted_at":1674149663366} +{"stream":"survey_responses","data":{"id":"12731087215","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=eSF0qBZZ3aR1SHBtkTZz83mgEBvJuBfou_2BJGBoFPbxv5bluXZuIMKDaGn5x5xba5","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731087215","total_time":31,"date_modified":"2021-06-10T09:10:42+00:00","date_created":"2021-06-10T09:10:10+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731087215","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176721"}]},{"id":"667462079","answers":[{"choice_id":"4385176727"}]},{"id":"667462082","answers":[{"choice_id":"4385176736"}]},{"id":"667462084","answers":[{"choice_id":"4385176763"}]},{"id":"667462086","answers":[{"choice_id":"4385176918"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176962"}]},{"id":"667462096","answers":[{"choice_id":"4385176972"}]},{"id":"667462099","answers":[{"choice_id":"4385176983"}]},{"id":"667462100","answers":[{"choice_id":"4385176988"}]},{"id":"667462102","answers":[{"choice_id":"4385177007"}]}]}]},"emitted_at":1674149663367} +{"stream":"survey_responses","data":{"id":"12731103402","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=QOikOvuCCRFkDsJoRozKO9_2BNPZmp7mliotl5xt4QnStPgBKgrvz6GZ7vdHXf3eMG","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731103402","total_time":31,"date_modified":"2021-06-10T09:18:22+00:00","date_created":"2021-06-10T09:17:50+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731103402","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176721"}]},{"id":"667462079","answers":[{"choice_id":"4385176729"}]},{"id":"667462082","answers":[{"choice_id":"4385176736"}]},{"id":"667462084","answers":[{"choice_id":"4385176764"}]},{"id":"667462086","answers":[{"choice_id":"4385176921"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176962"}]},{"id":"667462096","answers":[{"choice_id":"4385176974"}]},{"id":"667462099","answers":[{"choice_id":"4385176978"}]},{"id":"667462100","answers":[{"choice_id":"4385176987"}]},{"id":"667462102","answers":[{"choice_id":"4385177002"}]}]}]},"emitted_at":1674149663368} +{"stream":"survey_responses","data":{"id":"12731120214","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=sV4Oq2KXvMuxWQpflbd5L_2FyoB6ImaDnm9BFwJGk9W_2BwE7YWlvW6MsxaqaeWWY_2Fzh","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731120214","total_time":31,"date_modified":"2021-06-10T09:26:01+00:00","date_created":"2021-06-10T09:25:29+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731120214","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176723"}]},{"id":"667462079","answers":[{"choice_id":"4385176728"}]},{"id":"667462082","answers":[{"choice_id":"4385176734"}]},{"id":"667462084","answers":[{"choice_id":"4385176765"}]},{"id":"667462086","answers":[{"choice_id":"4385176920"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176960"}]},{"id":"667462096","answers":[{"choice_id":"4385176968"}]},{"id":"667462099","answers":[{"choice_id":"4385176976"}]},{"id":"667462100","answers":[{"choice_id":"4385176987"}]},{"id":"667462102","answers":[{"choice_id":"4385177009"}]}]}]},"emitted_at":1674149663368} +{"stream":"survey_responses","data":{"id":"12731137499","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Hy3W8rkVoiYFKw_2BdJM6cChYRJWAXaGTQTol4ykCh_2FxYDhPmBpC753rbLshVSZjNE","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731137499","total_time":31,"date_modified":"2021-06-10T09:33:45+00:00","date_created":"2021-06-10T09:33:13+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731137499","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176721"}]},{"id":"667462079","answers":[{"choice_id":"4385176729"}]},{"id":"667462082","answers":[{"choice_id":"4385176738"}]},{"id":"667462084","answers":[{"choice_id":"4385176766"}]},{"id":"667462086","answers":[{"choice_id":"4385176920"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176961"}]},{"id":"667462096","answers":[{"choice_id":"4385176970"}]},{"id":"667462099","answers":[{"choice_id":"4385176982"}]},{"id":"667462100","answers":[{"choice_id":"4385176988"}]},{"id":"667462102","answers":[{"choice_id":"4385177008"}]}]}]},"emitted_at":1674149663369} +{"stream":"survey_responses","data":{"id":"12731154912","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=BLjiuDSDI39GvYDURd_2FmEfCd9jRrZ5nLwAgWG65zJj2dA1DskdMkMBHVZjzLHkk6","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731154912","total_time":31,"date_modified":"2021-06-10T09:41:24+00:00","date_created":"2021-06-10T09:40:52+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731154912","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176723"}]},{"id":"667462079","answers":[{"choice_id":"4385176728"}]},{"id":"667462082","answers":[{"choice_id":"4385176738"}]},{"id":"667462084","answers":[{"choice_id":"4385176764"}]},{"id":"667462086","answers":[{"choice_id":"4385176921"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176963"}]},{"id":"667462096","answers":[{"choice_id":"4385176970"}]},{"id":"667462099","answers":[{"choice_id":"4385176977"}]},{"id":"667462100","answers":[{"choice_id":"4385176988"}]},{"id":"667462102","answers":[{"choice_id":"4385177006"}]}]}]},"emitted_at":1674149663370} +{"stream":"survey_responses","data":{"id":"12731172230","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=jiMm_2FJVQj8fPN6i2HlASqxeTd4rx_2FcPoCLMAznqiCWgY_2B98x39SfA1kKHTo8CgEC","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731172230","total_time":31,"date_modified":"2021-06-10T09:49:12+00:00","date_created":"2021-06-10T09:48:40+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731172230","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176723"}]},{"id":"667462079","answers":[{"choice_id":"4385176728"}]},{"id":"667462082","answers":[{"choice_id":"4385176737"}]},{"id":"667462084","answers":[{"choice_id":"4385176767"}]},{"id":"667462086","answers":[{"choice_id":"4385176921"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176963"}]},{"id":"667462096","answers":[{"choice_id":"4385176972"}]},{"id":"667462099","answers":[{"choice_id":"4385176977"}]},{"id":"667462100","answers":[{"choice_id":"4385176990"}]},{"id":"667462102","answers":[{"choice_id":"4385177006"}]}]}]},"emitted_at":1674149663370} +{"stream":"survey_responses","data":{"id":"12731190528","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=VrEu2qgFZYPclcWCzyV5DO0WUUCjOIMFC77k1XLOofwOqYD5vHAej03viembeuF8","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731190528","total_time":35,"date_modified":"2021-06-10T09:57:32+00:00","date_created":"2021-06-10T09:56:57+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731190528","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176725"}]},{"id":"667462079","answers":[{"choice_id":"4385176729"}]},{"id":"667462082","answers":[{"choice_id":"4385176739"}]},{"id":"667462084","answers":[{"choice_id":"4385176763"}]},{"id":"667462086","answers":[{"choice_id":"4385176920"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176959"}]},{"id":"667462096","answers":[{"choice_id":"4385176972"}]},{"id":"667462099","answers":[{"choice_id":"4385176978"}]},{"id":"667462100","answers":[{"choice_id":"4385176987"}]},{"id":"667462102","answers":[{"choice_id":"4385177004"}]}]}]},"emitted_at":1674149663371} +{"stream":"survey_responses","data":{"id":"12731210366","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=xOrc7mbcYE0NFiqzEpenJPpJJ1OHiCt_2FUDSohMb9nmqttp0v1il2MNjb_2BRGE177T","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731210366","total_time":33,"date_modified":"2021-06-10T10:05:40+00:00","date_created":"2021-06-10T10:05:06+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731210366","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176722"}]},{"id":"667462079","answers":[{"choice_id":"4385176728"}]},{"id":"667462082","answers":[{"choice_id":"4385176739"}]},{"id":"667462084","answers":[{"choice_id":"4385176763"}]},{"id":"667462086","answers":[{"choice_id":"4385176919"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176961"}]},{"id":"667462096","answers":[{"choice_id":"4385176971"}]},{"id":"667462099","answers":[{"choice_id":"4385176977"}]},{"id":"667462100","answers":[{"choice_id":"4385176986"}]},{"id":"667462102","answers":[{"choice_id":"4385177003"}]}]}]},"emitted_at":1674149663371} +{"stream":"survey_responses","data":{"id":"12731230116","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=xmmEsbDmCA6Nvi6PKgkHAZR5hqRDTYPELB_2BIyMCUzF63brYH0R2ZrSJb9f_2BXtWRa","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731230116","total_time":32,"date_modified":"2021-06-10T10:13:28+00:00","date_created":"2021-06-10T10:12:55+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731230116","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176724"}]},{"id":"667462079","answers":[{"choice_id":"4385176727"}]},{"id":"667462082","answers":[{"choice_id":"4385176735"}]},{"id":"667462084","answers":[{"choice_id":"4385176765"}]},{"id":"667462086","answers":[{"choice_id":"4385176920"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176959"}]},{"id":"667462096","answers":[{"choice_id":"4385176973"}]},{"id":"667462099","answers":[{"choice_id":"4385176977"}]},{"id":"667462100","answers":[{"choice_id":"4385176988"}]},{"id":"667462102","answers":[{"choice_id":"4385177007"}]}]}]},"emitted_at":1674149663372} +{"stream":"survey_responses","data":{"id":"12731249077","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=1cQksQ2IA1zuU8mpR9JawSnSqr2zaPV1juVQ7ZEPrEqxr231kL_2F2eIW48UokyJBm","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731249077","total_time":31,"date_modified":"2021-06-10T10:21:17+00:00","date_created":"2021-06-10T10:20:46+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731249077","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176724"}]},{"id":"667462079","answers":[{"choice_id":"4385176729"}]},{"id":"667462082","answers":[{"choice_id":"4385176735"}]},{"id":"667462084","answers":[{"choice_id":"4385176764"}]},{"id":"667462086","answers":[{"choice_id":"4385176921"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176963"}]},{"id":"667462096","answers":[{"choice_id":"4385176968"}]},{"id":"667462099","answers":[{"choice_id":"4385176982"}]},{"id":"667462100","answers":[{"choice_id":"4385176989"}]},{"id":"667462102","answers":[{"choice_id":"4385177008"}]}]}]},"emitted_at":1674149663373} +{"stream":"survey_responses","data":{"id":"12731267503","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=zOrptpJoo7QbXn1DoS0HIo4GcoAK8cIZ83MYidVo_2FuK_2FDvnnrsXK2SDzhyjssMdI","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731267503","total_time":31,"date_modified":"2021-06-10T10:28:56+00:00","date_created":"2021-06-10T10:28:25+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731267503","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176721"}]},{"id":"667462079","answers":[{"choice_id":"4385176727"}]},{"id":"667462082","answers":[{"choice_id":"4385176736"}]},{"id":"667462084","answers":[{"choice_id":"4385176765"}]},{"id":"667462086","answers":[{"choice_id":"4385176921"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176961"}]},{"id":"667462096","answers":[{"choice_id":"4385176970"}]},{"id":"667462099","answers":[{"choice_id":"4385176983"}]},{"id":"667462100","answers":[{"choice_id":"4385176986"}]},{"id":"667462102","answers":[{"choice_id":"4385177003"}]}]}]},"emitted_at":1674149663373} +{"stream":"survey_responses","data":{"id":"12731287789","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=zXARfqNZgptvNWp9PboSVlElugTboBiAj_2FSG_2BkbD8e8OUJGsJ8FMRpMFap0qzcYY","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731287789","total_time":31,"date_modified":"2021-06-10T10:37:03+00:00","date_created":"2021-06-10T10:36:32+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731287789","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176726"}]},{"id":"667462079","answers":[{"choice_id":"4385176728"}]},{"id":"667462082","answers":[{"choice_id":"4385176735"}]},{"id":"667462084","answers":[{"choice_id":"4385176763"}]},{"id":"667462086","answers":[{"choice_id":"4385176918"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176965"}]},{"id":"667462096","answers":[{"choice_id":"4385176971"}]},{"id":"667462099","answers":[{"choice_id":"4385176981"}]},{"id":"667462100","answers":[{"choice_id":"4385176989"}]},{"id":"667462102","answers":[{"choice_id":"4385177004"}]}]}]},"emitted_at":1674149663374} +{"stream":"survey_responses","data":{"id":"12731307187","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=d07mxUJIp3BjkeFrp8gTQvz67vJrBUQWNX2tzrHPvkrZ0piZOPTQDKl_2BrNNjOvJO","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731307187","total_time":35,"date_modified":"2021-06-10T10:44:49+00:00","date_created":"2021-06-10T10:44:14+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731307187","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176724"}]},{"id":"667462079","answers":[{"choice_id":"4385176727"}]},{"id":"667462082","answers":[{"choice_id":"4385176734"}]},{"id":"667462084","answers":[{"choice_id":"4385176765"}]},{"id":"667462086","answers":[{"choice_id":"4385176921"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176964"}]},{"id":"667462096","answers":[{"choice_id":"4385176975"}]},{"id":"667462099","answers":[{"choice_id":"4385176982"}]},{"id":"667462100","answers":[{"choice_id":"4385176986"}]},{"id":"667462102","answers":[{"choice_id":"4385177004"}]}]}]},"emitted_at":1674149663374} +{"stream":"survey_responses","data":{"id":"12731326595","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=BCy4vPYrkiObJMS9B6GjZD2jwLTDr1luSZYtqGxH8zxGvmteSPixhqGNTTdp_2BRwb","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731326595","total_time":32,"date_modified":"2021-06-10T10:52:38+00:00","date_created":"2021-06-10T10:52:05+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731326595","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176722"}]},{"id":"667462079","answers":[{"choice_id":"4385176728"}]},{"id":"667462082","answers":[{"choice_id":"4385176739"}]},{"id":"667462084","answers":[{"choice_id":"4385176767"}]},{"id":"667462086","answers":[{"choice_id":"4385176918"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176959"}]},{"id":"667462096","answers":[{"choice_id":"4385176974"}]},{"id":"667462099","answers":[{"choice_id":"4385176981"}]},{"id":"667462100","answers":[{"choice_id":"4385176990"}]},{"id":"667462102","answers":[{"choice_id":"4385177003"}]}]}]},"emitted_at":1674149663375} +{"stream":"survey_responses","data":{"id":"12731345509","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843665","survey_id":"307785444","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=KmG9rTOuf2GcFWGtNhaBIfC5S80jehYrziix2nmuPzJw9_2FzLpaENGb_2F8j4NkPfTJ","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxrQYdYnKpzayiBZVWsmE3jE_3D?respondent_id=12731345509","total_time":31,"date_modified":"2021-06-10T11:00:18+00:00","date_created":"2021-06-10T10:59:46+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785444/responses/12731345509","pages":[{"id":"168831459","questions":[]},{"id":"168831461","questions":[{"id":"667462078","answers":[{"choice_id":"4385176725"}]},{"id":"667462079","answers":[{"choice_id":"4385176729"}]},{"id":"667462082","answers":[{"choice_id":"4385176734"}]},{"id":"667462084","answers":[{"choice_id":"4385176766"}]},{"id":"667462086","answers":[{"choice_id":"4385176919"}]}]},{"id":"168831467","questions":[{"id":"667462094","answers":[{"choice_id":"4385176964"}]},{"id":"667462096","answers":[{"choice_id":"4385176968"}]},{"id":"667462099","answers":[{"choice_id":"4385176983"}]},{"id":"667462100","answers":[{"choice_id":"4385176991"}]},{"id":"667462102","answers":[{"choice_id":"4385177005"}]}]}]},"emitted_at":1674149663375} +{"stream":"survey_responses","data":{"id":"12731043150","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=LKTTnPMSZ1aoM4WL0f1Ja7_2FdIZyTQ0DexNwU_2FFgEeZeT6B9T2m2HJuQjxPHn2OpZ","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731043150","total_time":36,"date_modified":"2021-06-10T08:48:12+00:00","date_created":"2021-06-10T08:47:35+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731043150","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173227"}]},{"id":"667461471","answers":[{"choice_id":"4385173238"}]},{"id":"667461473","answers":[{"choice_id":"4385173258"}]},{"id":"667461476","answers":[{"choice_id":"4385173269"}]},{"id":"667461498","answers":[{"choice_id":"4385173412"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173457"}]},{"id":"667461516","answers":[{"choice_id":"4385173477"}]},{"id":"667461517","answers":[{"choice_id":"4385173482"}]},{"id":"667461521","answers":[{"choice_id":"4385173493"}]},{"id":"667461526","answers":[{"choice_id":"4385173525"}]}]}]},"emitted_at":1674149664904} +{"stream":"survey_responses","data":{"id":"12731057303","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Tj5vPzxUmWLsaqGk6A3N4tXy8F1lrXDh3cgduiFC1tcjk3fKqd5Jc_2FYl9kqbrtXl","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731057303","total_time":35,"date_modified":"2021-06-10T08:55:53+00:00","date_created":"2021-06-10T08:55:17+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731057303","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173227"}]},{"id":"667461471","answers":[{"choice_id":"4385173237"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173270"}]},{"id":"667461498","answers":[{"choice_id":"4385173414"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173457"}]},{"id":"667461516","answers":[{"choice_id":"4385173478"}]},{"id":"667461517","answers":[{"choice_id":"4385173481"}]},{"id":"667461521","answers":[{"choice_id":"4385173494"}]},{"id":"667461526","answers":[{"choice_id":"4385173523"}]}]}]},"emitted_at":1674149664906} +{"stream":"survey_responses","data":{"id":"12731072147","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=bAFsDUmEPpCdobkl_2BIl_2F6rdICCatPVmCxnojDaOR9ZJwGzYj7h29WMvC195fRe31","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731072147","total_time":35,"date_modified":"2021-06-10T09:03:38+00:00","date_created":"2021-06-10T09:03:02+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731072147","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173229"}]},{"id":"667461471","answers":[{"choice_id":"4385173240"}]},{"id":"667461473","answers":[{"choice_id":"4385173257"}]},{"id":"667461476","answers":[{"choice_id":"4385173268"}]},{"id":"667461498","answers":[{"choice_id":"4385173413"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173452"}]},{"id":"667461516","answers":[{"choice_id":"4385173476"}]},{"id":"667461517","answers":[{"choice_id":"4385173483"}]},{"id":"667461521","answers":[{"choice_id":"4385173492"}]},{"id":"667461526","answers":[{"choice_id":"4385173523"}]}]}]},"emitted_at":1674149664908} +{"stream":"survey_responses","data":{"id":"12731088506","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=MrquTcpA82ItgrSQWG_2BswTK4ClFm9rTuG5GWb85hiLDvaK2dr6F7vrYvOlwqkkC6","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731088506","total_time":35,"date_modified":"2021-06-10T09:11:22+00:00","date_created":"2021-06-10T09:10:46+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731088506","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173227"}]},{"id":"667461471","answers":[{"choice_id":"4385173236"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173269"}]},{"id":"667461498","answers":[{"choice_id":"4385173413"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173458"}]},{"id":"667461516","answers":[{"choice_id":"4385173475"}]},{"id":"667461517","answers":[{"choice_id":"4385173484"}]},{"id":"667461521","answers":[{"choice_id":"4385173492"}]},{"id":"667461526","answers":[{"choice_id":"4385173525"}]}]}]},"emitted_at":1674149664909} +{"stream":"survey_responses","data":{"id":"12731104696","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=RO8uULIefm7fQ9VJXKzxtKBfRj4g0rYOE0LRuSA8OT2GVPEFDFQFmSOII7UlshDk","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731104696","total_time":36,"date_modified":"2021-06-10T09:19:03+00:00","date_created":"2021-06-10T09:18:26+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731104696","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173229"}]},{"id":"667461471","answers":[{"choice_id":"4385173240"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173271"}]},{"id":"667461498","answers":[{"choice_id":"4385173414"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173457"}]},{"id":"667461516","answers":[{"choice_id":"4385173474"}]},{"id":"667461517","answers":[{"choice_id":"4385173481"}]},{"id":"667461521","answers":[{"choice_id":"4385173493"}]},{"id":"667461526","answers":[{"choice_id":"4385173526"}]}]}]},"emitted_at":1674149664911} +{"stream":"survey_responses","data":{"id":"12731121617","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Z_2BP_2BwLxa1Cmlcetqz6B1oaPvJSUU_2F5d018eOau5jIs8q4IlOyw7MT9YtxrlZnZHx","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731121617","total_time":37,"date_modified":"2021-06-10T09:26:44+00:00","date_created":"2021-06-10T09:26:07+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731121617","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173228"}]},{"id":"667461471","answers":[{"choice_id":"4385173237"}]},{"id":"667461473","answers":[{"choice_id":"4385173258"}]},{"id":"667461476","answers":[{"choice_id":"4385173268"}]},{"id":"667461498","answers":[{"choice_id":"4385173414"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173458"}]},{"id":"667461516","answers":[{"choice_id":"4385173477"}]},{"id":"667461517","answers":[{"choice_id":"4385173481"}]},{"id":"667461521","answers":[{"choice_id":"4385173493"}]},{"id":"667461526","answers":[{"choice_id":"4385173523"}]}]}]},"emitted_at":1674149664913} +{"stream":"survey_responses","data":{"id":"12731139029","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=R0ZtH7VCYs_2FMuOE8hZBLqJdLMcu2RDqvrV04C34ivpIzGYhRzaVoAG0LDF83Ln_2B2","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731139029","total_time":37,"date_modified":"2021-06-10T09:34:27+00:00","date_created":"2021-06-10T09:33:50+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731139029","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173229"}]},{"id":"667461471","answers":[{"choice_id":"4385173239"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173269"}]},{"id":"667461498","answers":[{"choice_id":"4385173415"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173459"}]},{"id":"667461516","answers":[{"choice_id":"4385173477"}]},{"id":"667461517","answers":[{"choice_id":"4385173482"}]},{"id":"667461521","answers":[{"choice_id":"4385173492"}]},{"id":"667461526","answers":[{"choice_id":"4385173523"}]}]}]},"emitted_at":1674149664914} +{"stream":"survey_responses","data":{"id":"12731156353","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=t_2BeAHBUtkTES9TALR_2F4aDfYgtWlbqJv08b_2B6EYbplYKefvn8GrYTkoGugKOevrCn","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731156353","total_time":35,"date_modified":"2021-06-10T09:42:06+00:00","date_created":"2021-06-10T09:41:30+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731156353","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173229"}]},{"id":"667461471","answers":[{"choice_id":"4385173237"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173271"}]},{"id":"667461498","answers":[{"choice_id":"4385173416"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173455"}]},{"id":"667461516","answers":[{"choice_id":"4385173474"}]},{"id":"667461517","answers":[{"choice_id":"4385173481"}]},{"id":"667461521","answers":[{"choice_id":"4385173493"}]},{"id":"667461526","answers":[{"choice_id":"4385173523"}]}]}]},"emitted_at":1674149664916} +{"stream":"survey_responses","data":{"id":"12731173574","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=mVe08d8mokL6AWRdTdpFz7jaz6dJhmAV4ZlfpEH6B8OQwQXlC2RxAxy2Z_2BtSrLXG","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731173574","total_time":36,"date_modified":"2021-06-10T09:49:53+00:00","date_created":"2021-06-10T09:49:16+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731173574","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173227"}]},{"id":"667461471","answers":[{"choice_id":"4385173241"}]},{"id":"667461473","answers":[{"choice_id":"4385173258"}]},{"id":"667461476","answers":[{"choice_id":"4385173270"}]},{"id":"667461498","answers":[{"choice_id":"4385173414"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173458"}]},{"id":"667461516","answers":[{"choice_id":"4385173475"}]},{"id":"667461517","answers":[{"choice_id":"4385173486"}]},{"id":"667461521","answers":[{"choice_id":"4385173492"}]},{"id":"667461526","answers":[{"choice_id":"4385173526"}]}]}]},"emitted_at":1674149664917} +{"stream":"survey_responses","data":{"id":"12731192021","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=XFNknH0sj9IIdSvzYR75kcMldl4TuTz7kma3E7SGri2Rq_2FvcCRLj4ug5HOCnqMQz","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731192021","total_time":39,"date_modified":"2021-06-10T09:58:16+00:00","date_created":"2021-06-10T09:57:36+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731192021","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173227"}]},{"id":"667461471","answers":[{"choice_id":"4385173239"}]},{"id":"667461473","answers":[{"choice_id":"4385173258"}]},{"id":"667461476","answers":[{"choice_id":"4385173270"}]},{"id":"667461498","answers":[{"choice_id":"4385173416"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173456"}]},{"id":"667461516","answers":[{"choice_id":"4385173475"}]},{"id":"667461517","answers":[{"choice_id":"4385173481"}]},{"id":"667461521","answers":[{"choice_id":"4385173494"}]},{"id":"667461526","answers":[{"choice_id":"4385173523"}]}]}]},"emitted_at":1674149664919} +{"stream":"survey_responses","data":{"id":"12731211903","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=V3KUOw0NUFH27PiVeUNuTKv_2BkMDveRdHYnln_2FOZcYY0I7L0VIMlksx3CdNizHX_2BP","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731211903","total_time":36,"date_modified":"2021-06-10T10:06:21+00:00","date_created":"2021-06-10T10:05:44+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731211903","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173229"}]},{"id":"667461471","answers":[{"choice_id":"4385173239"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173271"}]},{"id":"667461498","answers":[{"choice_id":"4385173416"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173456"}]},{"id":"667461516","answers":[{"choice_id":"4385173477"}]},{"id":"667461517","answers":[{"choice_id":"4385173484"}]},{"id":"667461521","answers":[{"choice_id":"4385173494"}]},{"id":"667461526","answers":[{"choice_id":"4385173526"}]}]}]},"emitted_at":1674149664921} +{"stream":"survey_responses","data":{"id":"12731231636","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=xv8ZLGu_2FUg9VAJ8hvx10oji6MvB1PbiAyA98qWpExvZvSaPKJ7cIFH8nZktkDKH0","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731231636","total_time":36,"date_modified":"2021-06-10T10:14:08+00:00","date_created":"2021-06-10T10:13:32+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731231636","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173226"}]},{"id":"667461471","answers":[{"choice_id":"4385173237"}]},{"id":"667461473","answers":[{"choice_id":"4385173258"}]},{"id":"667461476","answers":[{"choice_id":"4385173270"}]},{"id":"667461498","answers":[{"choice_id":"4385173413"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173454"}]},{"id":"667461516","answers":[{"choice_id":"4385173475"}]},{"id":"667461517","answers":[{"choice_id":"4385173486"}]},{"id":"667461521","answers":[{"choice_id":"4385173492"}]},{"id":"667461526","answers":[{"choice_id":"4385173527"}]}]}]},"emitted_at":1674149664922} +{"stream":"survey_responses","data":{"id":"12731250495","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=juR_2BEnc_2BsJLlCc6Sg7p2Ql_2B4icSx_2BsZwo_2FU1RVgYxqI2OzngMKnAUlrdJUS39ewn","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731250495","total_time":36,"date_modified":"2021-06-10T10:21:58+00:00","date_created":"2021-06-10T10:21:21+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731250495","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173229"}]},{"id":"667461471","answers":[{"choice_id":"4385173237"}]},{"id":"667461473","answers":[{"choice_id":"4385173257"}]},{"id":"667461476","answers":[{"choice_id":"4385173268"}]},{"id":"667461498","answers":[{"choice_id":"4385173415"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173459"}]},{"id":"667461516","answers":[{"choice_id":"4385173474"}]},{"id":"667461517","answers":[{"choice_id":"4385173486"}]},{"id":"667461521","answers":[{"choice_id":"4385173492"}]},{"id":"667461526","answers":[{"choice_id":"4385173526"}]}]}]},"emitted_at":1674149664924} +{"stream":"survey_responses","data":{"id":"12731268932","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=vXLZxpfaNUwy1JRrQLJCNL0kcVa5U5M5FtCofSN4MCcTJt9om9nRi2D4C4xJeXUg","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731268932","total_time":35,"date_modified":"2021-06-10T10:29:36+00:00","date_created":"2021-06-10T10:29:00+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731268932","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173228"}]},{"id":"667461471","answers":[{"choice_id":"4385173242"}]},{"id":"667461473","answers":[{"choice_id":"4385173257"}]},{"id":"667461476","answers":[{"choice_id":"4385173271"}]},{"id":"667461498","answers":[{"choice_id":"4385173412"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173454"}]},{"id":"667461516","answers":[{"choice_id":"4385173475"}]},{"id":"667461517","answers":[{"choice_id":"4385173483"}]},{"id":"667461521","answers":[{"choice_id":"4385173493"}]},{"id":"667461526","answers":[{"choice_id":"4385173524"}]}]}]},"emitted_at":1674149664925} +{"stream":"survey_responses","data":{"id":"12731289280","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=M4Lzmv89J2ZSnoBKgwxsZqDP3em9icPdsBglzN7NQB_2BM5AQ1bWpjH53fB0IsVZi6","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731289280","total_time":36,"date_modified":"2021-06-10T10:37:44+00:00","date_created":"2021-06-10T10:37:08+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731289280","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173227"}]},{"id":"667461471","answers":[{"choice_id":"4385173242"}]},{"id":"667461473","answers":[{"choice_id":"4385173258"}]},{"id":"667461476","answers":[{"choice_id":"4385173270"}]},{"id":"667461498","answers":[{"choice_id":"4385173416"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173454"}]},{"id":"667461516","answers":[{"choice_id":"4385173477"}]},{"id":"667461517","answers":[{"choice_id":"4385173485"}]},{"id":"667461521","answers":[{"choice_id":"4385173492"}]},{"id":"667461526","answers":[{"choice_id":"4385173526"}]}]}]},"emitted_at":1674149664927} +{"stream":"survey_responses","data":{"id":"12731308800","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=GQAEVhmAlwb5r_2FWfXNC_2Fqzqv5ULovU_2BGovk8oDp5nCvL2982DEXHbEhjSg4A3FdA","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731308800","total_time":39,"date_modified":"2021-06-10T10:45:33+00:00","date_created":"2021-06-10T10:44:54+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731308800","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173227"}]},{"id":"667461471","answers":[{"choice_id":"4385173239"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173271"}]},{"id":"667461498","answers":[{"choice_id":"4385173412"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173459"}]},{"id":"667461516","answers":[{"choice_id":"4385173473"}]},{"id":"667461517","answers":[{"choice_id":"4385173482"}]},{"id":"667461521","answers":[{"choice_id":"4385173494"}]},{"id":"667461526","answers":[{"choice_id":"4385173526"}]}]}]},"emitted_at":1674149664929} +{"stream":"survey_responses","data":{"id":"12731328082","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=MwpXysDo7Lhe8X4oi_2BfwDcfgG4XMlnjXbj783SvdsQcVCLn0Y0mvT87cyq6wLtri","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731328082","total_time":36,"date_modified":"2021-06-10T10:53:17+00:00","date_created":"2021-06-10T10:52:41+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731328082","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173227"}]},{"id":"667461471","answers":[{"choice_id":"4385173241"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173271"}]},{"id":"667461498","answers":[{"choice_id":"4385173413"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173456"}]},{"id":"667461516","answers":[{"choice_id":"4385173477"}]},{"id":"667461517","answers":[{"choice_id":"4385173486"}]},{"id":"667461521","answers":[{"choice_id":"4385173492"}]},{"id":"667461526","answers":[{"choice_id":"4385173524"}]}]}]},"emitted_at":1674149664930} +{"stream":"survey_responses","data":{"id":"12731346960","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843672","survey_id":"307785394","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=i9GzbJPTq_2BCfXqXCYc91kWSkkbD40J_2FGL8hESaU68w7nuZXOyFZ7xNpNth1mmf72","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNt3d6AR0J1aeeTU4KsCULsx8_3D?respondent_id=12731346960","total_time":35,"date_modified":"2021-06-10T11:00:58+00:00","date_created":"2021-06-10T11:00:22+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785394/responses/12731346960","pages":[{"id":"168831344","questions":[]},{"id":"168831345","questions":[{"id":"667461468","answers":[{"choice_id":"4385173229"}]},{"id":"667461471","answers":[{"choice_id":"4385173241"}]},{"id":"667461473","answers":[{"choice_id":"4385173256"}]},{"id":"667461476","answers":[{"choice_id":"4385173270"}]},{"id":"667461498","answers":[{"choice_id":"4385173412"}]}]},{"id":"168831352","questions":[{"id":"667461513","answers":[{"choice_id":"4385173457"}]},{"id":"667461516","answers":[{"choice_id":"4385173476"}]},{"id":"667461517","answers":[{"choice_id":"4385173483"}]},{"id":"667461521","answers":[{"choice_id":"4385173493"}]},{"id":"667461526","answers":[{"choice_id":"4385173527"}]}]}]},"emitted_at":1674149664931} +{"stream":"survey_responses","data":{"id":"12731044345","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=RiSWqWbbXVsX_2BRIyudfJwY_2BODcC0aHC0L77gSNMTF5T_2BsPWUy2vlIWpXf01Hqy8k","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731044345","total_time":34,"date_modified":"2021-06-10T08:48:50+00:00","date_created":"2021-06-10T08:48:16+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731044345","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173538"}]},{"id":"667461530","answers":[{"choice_id":"4385173549"}]},{"id":"667461549","answers":[{"choice_id":"4385173661"}]},{"id":"667461551","answers":[{"choice_id":"4385173676"}]},{"id":"667461553","answers":[{"choice_id":"4385173681"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173713"}]},{"id":"667461558","answers":[{"choice_id":"4385173732"}]},{"id":"667461561","answers":[{"choice_id":"4385173756"}]},{"id":"667461580","answers":[{"choice_id":"4385174059"}]},{"id":"667461598","answers":[{"choice_id":"4385174182"}]}]}]},"emitted_at":1674149666541} +{"stream":"survey_responses","data":{"id":"12731058644","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=8fjqeuyiG6EvuMWbYy64yqPXBnCSWaEpW8DInIUYXRbFyqerWPCENf5izNrPGoNw","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731058644","total_time":33,"date_modified":"2021-06-10T08:56:31+00:00","date_created":"2021-06-10T08:55:58+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731058644","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173537"}]},{"id":"667461530","answers":[{"choice_id":"4385173550"}]},{"id":"667461549","answers":[{"choice_id":"4385173662"}]},{"id":"667461551","answers":[{"choice_id":"4385173677"}]},{"id":"667461553","answers":[{"choice_id":"4385173678"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173713"}]},{"id":"667461558","answers":[{"choice_id":"4385173729"}]},{"id":"667461561","answers":[{"choice_id":"4385173755"}]},{"id":"667461580","answers":[{"choice_id":"4385174063"}]},{"id":"667461598","answers":[{"choice_id":"4385174183"}]}]}]},"emitted_at":1674149666543} +{"stream":"survey_responses","data":{"id":"12731073567","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ILVcHPPYp1qBeboZrnUw9zU8OfPDI3pBaSHE_2FPA1mcsZYgDgyEvD2DNJEXG50BwI","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731073567","total_time":34,"date_modified":"2021-06-10T09:04:16+00:00","date_created":"2021-06-10T09:03:42+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731073567","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173537"}]},{"id":"667461530","answers":[{"choice_id":"4385173552"}]},{"id":"667461549","answers":[{"choice_id":"4385173663"}]},{"id":"667461551","answers":[{"choice_id":"4385173675"}]},{"id":"667461553","answers":[{"choice_id":"4385173681"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173711"}]},{"id":"667461558","answers":[{"choice_id":"4385173734"}]},{"id":"667461561","answers":[{"choice_id":"4385173756"}]},{"id":"667461580","answers":[{"choice_id":"4385174066"}]},{"id":"667461598","answers":[{"choice_id":"4385174183"}]}]}]},"emitted_at":1674149666544} +{"stream":"survey_responses","data":{"id":"12731089919","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=WJVGjucUzW8fBD4StuC_2FFZoPB0pCtugYpTzgDrCOMnJyyzUp5Q2v55jJ8xqcAaJv","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731089919","total_time":33,"date_modified":"2021-06-10T09:12:00+00:00","date_created":"2021-06-10T09:11:26+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731089919","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173536"}]},{"id":"667461530","answers":[{"choice_id":"4385173551"}]},{"id":"667461549","answers":[{"choice_id":"4385173658"}]},{"id":"667461551","answers":[{"choice_id":"4385173675"}]},{"id":"667461553","answers":[{"choice_id":"4385173681"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173714"}]},{"id":"667461558","answers":[{"choice_id":"4385173728"}]},{"id":"667461561","answers":[{"choice_id":"4385173755"}]},{"id":"667461580","answers":[{"choice_id":"4385174060"}]},{"id":"667461598","answers":[{"choice_id":"4385174184"}]}]}]},"emitted_at":1674149666545} +{"stream":"survey_responses","data":{"id":"12731106311","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=pYr2BTIwVP0O3EzGC27aOOaCA0hnWvJ3FzJOiB_2Fhgw0UUSDh2QpQTcjrfXltZ8dv","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731106311","total_time":33,"date_modified":"2021-06-10T09:19:41+00:00","date_created":"2021-06-10T09:19:07+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731106311","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173537"}]},{"id":"667461530","answers":[{"choice_id":"4385173549"}]},{"id":"667461549","answers":[{"choice_id":"4385173663"}]},{"id":"667461551","answers":[{"choice_id":"4385173675"}]},{"id":"667461553","answers":[{"choice_id":"4385173680"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173712"}]},{"id":"667461558","answers":[{"choice_id":"4385173727"}]},{"id":"667461561","answers":[{"choice_id":"4385173757"}]},{"id":"667461580","answers":[{"choice_id":"4385174061"}]},{"id":"667461598","answers":[{"choice_id":"4385174186"}]}]}]},"emitted_at":1674149666546} +{"stream":"survey_responses","data":{"id":"12731123001","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=iMOq3PmDu_2Fpfu6Lqltp5VPoRV2azTczcfDSAY7AjMIzECAtQhUwU_2FNMCCwq_2BSvsN","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731123001","total_time":34,"date_modified":"2021-06-10T09:27:23+00:00","date_created":"2021-06-10T09:26:49+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731123001","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173540"}]},{"id":"667461530","answers":[{"choice_id":"4385173550"}]},{"id":"667461549","answers":[{"choice_id":"4385173658"}]},{"id":"667461551","answers":[{"choice_id":"4385173676"}]},{"id":"667461553","answers":[{"choice_id":"4385173682"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173713"}]},{"id":"667461558","answers":[{"choice_id":"4385173727"}]},{"id":"667461561","answers":[{"choice_id":"4385173757"}]},{"id":"667461580","answers":[{"choice_id":"4385174059"}]},{"id":"667461598","answers":[{"choice_id":"4385174186"}]}]}]},"emitted_at":1674149666546} +{"stream":"survey_responses","data":{"id":"12731140625","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=QTesi81CB_2BwJ62wJ8op06oDEuscTPvq1ke99azBrWELfhmlgdyrrpw0NVegVV_2BE7","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731140625","total_time":33,"date_modified":"2021-06-10T09:35:05+00:00","date_created":"2021-06-10T09:34:32+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731140625","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173538"}]},{"id":"667461530","answers":[{"choice_id":"4385173553"}]},{"id":"667461549","answers":[{"choice_id":"4385173661"}]},{"id":"667461551","answers":[{"choice_id":"4385173675"}]},{"id":"667461553","answers":[{"choice_id":"4385173678"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173713"}]},{"id":"667461558","answers":[{"choice_id":"4385173729"}]},{"id":"667461561","answers":[{"choice_id":"4385173755"}]},{"id":"667461580","answers":[{"choice_id":"4385174062"}]},{"id":"667461598","answers":[{"choice_id":"4385174185"}]}]}]},"emitted_at":1674149666547} +{"stream":"survey_responses","data":{"id":"12731157855","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Y_2BseyWnN45hqrdC63g5th2srbJCqZZuaaHgJaVUVwfuBPwNI2IdB2Dc1yEhLsRcy","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731157855","total_time":33,"date_modified":"2021-06-10T09:42:46+00:00","date_created":"2021-06-10T09:42:12+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731157855","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173536"}]},{"id":"667461530","answers":[{"choice_id":"4385173553"}]},{"id":"667461549","answers":[{"choice_id":"4385173661"}]},{"id":"667461551","answers":[{"choice_id":"4385173676"}]},{"id":"667461553","answers":[{"choice_id":"4385173681"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173713"}]},{"id":"667461558","answers":[{"choice_id":"4385173727"}]},{"id":"667461561","answers":[{"choice_id":"4385173756"}]},{"id":"667461580","answers":[{"choice_id":"4385174060"}]},{"id":"667461598","answers":[{"choice_id":"4385174183"}]}]}]},"emitted_at":1674149666548} +{"stream":"survey_responses","data":{"id":"12731175182","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=wvlpuaxYEnle4EG2hvBzqRUelWi_2BwXRQmZSU2ru959wJ7Ly3p7I9sg1wjhKu7Bm_2F","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731175182","total_time":27,"date_modified":"2021-06-10T09:50:26+00:00","date_created":"2021-06-10T09:49:58+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731175182","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173713"}]},{"id":"667461558","answers":[{"choice_id":"4385173731"}]},{"id":"667461561","answers":[{"choice_id":"4385173756"}]},{"id":"667461580","answers":[{"choice_id":"4385174061"}]},{"id":"667461598","answers":[{"choice_id":"4385174186"}]}]}]},"emitted_at":1674149666549} +{"stream":"survey_responses","data":{"id":"12731193598","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=mqmf_2BkbhXVJbx4WQXC0_2F72pU_2FFf6FkOVA8_2F7REJy4j9HAEPKg_2BCPmL8F2wfc6SKi","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731193598","total_time":37,"date_modified":"2021-06-10T09:58:58+00:00","date_created":"2021-06-10T09:58:20+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731193598","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173539"}]},{"id":"667461530","answers":[{"choice_id":"4385173553"}]},{"id":"667461549","answers":[{"choice_id":"4385173657"}]},{"id":"667461551","answers":[{"choice_id":"4385173676"}]},{"id":"667461553","answers":[{"choice_id":"4385173681"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173714"}]},{"id":"667461558","answers":[{"choice_id":"4385173733"}]},{"id":"667461561","answers":[{"choice_id":"4385173757"}]},{"id":"667461580","answers":[{"choice_id":"4385174065"}]},{"id":"667461598","answers":[{"choice_id":"4385174185"}]}]}]},"emitted_at":1674149666550} +{"stream":"survey_responses","data":{"id":"12731213708","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=FmbWXWfmfbsDK8MEuKSsHPviZSUYgchniK99dQeGSFpf_2BWnh6cTWlg0o5YRIRtn7","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731213708","total_time":33,"date_modified":"2021-06-10T10:06:59+00:00","date_created":"2021-06-10T10:06:25+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731213708","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173537"}]},{"id":"667461530","answers":[{"choice_id":"4385173550"}]},{"id":"667461549","answers":[{"choice_id":"4385173663"}]},{"id":"667461551","answers":[{"choice_id":"4385173677"}]},{"id":"667461553","answers":[{"choice_id":"4385173683"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173712"}]},{"id":"667461558","answers":[{"choice_id":"4385173729"}]},{"id":"667461561","answers":[{"choice_id":"4385173755"}]},{"id":"667461580","answers":[{"choice_id":"4385174061"}]},{"id":"667461598","answers":[{"choice_id":"4385174182"}]}]}]},"emitted_at":1674149666550} +{"stream":"survey_responses","data":{"id":"12731233283","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=VRo6oIX2X5OOWhsAVRYKuhrXr5zszr6duv29Vq3RdwAJMtFNcQqAJk71Bi4Oq3Bo","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731233283","total_time":33,"date_modified":"2021-06-10T10:14:47+00:00","date_created":"2021-06-10T10:14:13+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731233283","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173540"}]},{"id":"667461530","answers":[{"choice_id":"4385173554"}]},{"id":"667461549","answers":[{"choice_id":"4385173656"}]},{"id":"667461551","answers":[{"choice_id":"4385173676"}]},{"id":"667461553","answers":[{"choice_id":"4385173679"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173715"}]},{"id":"667461558","answers":[{"choice_id":"4385173727"}]},{"id":"667461561","answers":[{"choice_id":"4385173756"}]},{"id":"667461580","answers":[{"choice_id":"4385174063"}]},{"id":"667461598","answers":[{"choice_id":"4385174185"}]}]}]},"emitted_at":1674149666551} +{"stream":"survey_responses","data":{"id":"12731252105","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=TQiDe8sSx4_2FuWzT1Lr7RKGOBO2iwOmTuPPOzcvcHL45tRjbdZSW9UHv6_2B2nLtY6n","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731252105","total_time":34,"date_modified":"2021-06-10T10:22:37+00:00","date_created":"2021-06-10T10:22:03+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731252105","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173537"}]},{"id":"667461530","answers":[{"choice_id":"4385173552"}]},{"id":"667461549","answers":[{"choice_id":"4385173659"}]},{"id":"667461551","answers":[{"choice_id":"4385173675"}]},{"id":"667461553","answers":[{"choice_id":"4385173682"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173712"}]},{"id":"667461558","answers":[{"choice_id":"4385173731"}]},{"id":"667461561","answers":[{"choice_id":"4385173755"}]},{"id":"667461580","answers":[{"choice_id":"4385174062"}]},{"id":"667461598","answers":[{"choice_id":"4385174182"}]}]}]},"emitted_at":1674149666552} +{"stream":"survey_responses","data":{"id":"12731270690","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ipONp_2F6FrM7HwOh1_2BpJXXqL65aZR6EN_2BmCdmmlM4Etuv_2BqfU5P8wsYtpW2_2BvsbR2","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731270690","total_time":33,"date_modified":"2021-06-10T10:30:16+00:00","date_created":"2021-06-10T10:29:42+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731270690","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173536"}]},{"id":"667461530","answers":[{"choice_id":"4385173550"}]},{"id":"667461549","answers":[{"choice_id":"4385173656"}]},{"id":"667461551","answers":[{"choice_id":"4385173677"}]},{"id":"667461553","answers":[{"choice_id":"4385173681"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173715"}]},{"id":"667461558","answers":[{"choice_id":"4385173734"}]},{"id":"667461561","answers":[{"choice_id":"4385173757"}]},{"id":"667461580","answers":[{"choice_id":"4385174064"}]},{"id":"667461598","answers":[{"choice_id":"4385174186"}]}]}]},"emitted_at":1674149666553} +{"stream":"survey_responses","data":{"id":"12731290962","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=eWOUaV5xBiUO9JblKm5rYeLfk2_2FPRiygYknRKYIPlBC3Vl9805OBGP8f2kjnm0r2","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731290962","total_time":33,"date_modified":"2021-06-10T10:38:22+00:00","date_created":"2021-06-10T10:37:48+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731290962","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173538"}]},{"id":"667461530","answers":[{"choice_id":"4385173553"}]},{"id":"667461549","answers":[{"choice_id":"4385173658"}]},{"id":"667461551","answers":[{"choice_id":"4385173675"}]},{"id":"667461553","answers":[{"choice_id":"4385173678"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173715"}]},{"id":"667461558","answers":[{"choice_id":"4385173729"}]},{"id":"667461561","answers":[{"choice_id":"4385173757"}]},{"id":"667461580","answers":[{"choice_id":"4385174066"}]},{"id":"667461598","answers":[{"choice_id":"4385174182"}]}]}]},"emitted_at":1674149666555} +{"stream":"survey_responses","data":{"id":"12731310541","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=wFNF4x4oPfyHaT5uvGstRuK1DUDfrHJyxBXB95bRgrB_2FdJojFuoGIhxA0BIH0XSO","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731310541","total_time":37,"date_modified":"2021-06-10T10:46:14+00:00","date_created":"2021-06-10T10:45:37+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731310541","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173540"}]},{"id":"667461530","answers":[{"choice_id":"4385173551"}]},{"id":"667461549","answers":[{"choice_id":"4385173661"}]},{"id":"667461551","answers":[{"choice_id":"4385173677"}]},{"id":"667461553","answers":[{"choice_id":"4385173682"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173712"}]},{"id":"667461558","answers":[{"choice_id":"4385173732"}]},{"id":"667461561","answers":[{"choice_id":"4385173756"}]},{"id":"667461580","answers":[{"choice_id":"4385174059"}]},{"id":"667461598","answers":[{"choice_id":"4385174184"}]}]}]},"emitted_at":1674149666556} +{"stream":"survey_responses","data":{"id":"12731329746","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=vGkpaT5QedSZDkH1LkdPEMwKHIlyZ2mKjKyt8tgek5uzfoU30oxZnac34WvjYm1h","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731329746","total_time":33,"date_modified":"2021-06-10T10:53:55+00:00","date_created":"2021-06-10T10:53:21+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731329746","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[{"id":"667461529","answers":[{"choice_id":"4385173540"}]},{"id":"667461530","answers":[{"choice_id":"4385173551"}]},{"id":"667461549","answers":[{"choice_id":"4385173661"}]},{"id":"667461551","answers":[{"choice_id":"4385173677"}]},{"id":"667461553","answers":[{"choice_id":"4385173682"}]}]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173711"}]},{"id":"667461558","answers":[{"choice_id":"4385173732"}]},{"id":"667461561","answers":[{"choice_id":"4385173755"}]},{"id":"667461580","answers":[{"choice_id":"4385174059"}]},{"id":"667461598","answers":[{"choice_id":"4385174182"}]}]}]},"emitted_at":1674149666557} +{"stream":"survey_responses","data":{"id":"12731348717","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843682","survey_id":"307785402","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=vuWK6q7Hz9dNybRoH2rP8Ux0qNc_2B0E3lMUmtDlPUbslKbHc7FranQhTJxg_2BIo3Pw","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxuFqiaqWbXDPfS4KhzQnJ4c_3D?respondent_id=12731348717","total_time":26,"date_modified":"2021-06-10T11:01:30+00:00","date_created":"2021-06-10T11:01:03+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785402/responses/12731348717","pages":[{"id":"168831357","questions":[]},{"id":"168831358","questions":[]},{"id":"168831365","questions":[{"id":"667461555","answers":[{"choice_id":"4385173714"}]},{"id":"667461558","answers":[{"choice_id":"4385173729"}]},{"id":"667461561","answers":[{"choice_id":"4385173755"}]},{"id":"667461580","answers":[{"choice_id":"4385174059"}]},{"id":"667461598","answers":[{"choice_id":"4385174186"}]}]}]},"emitted_at":1674149666558} +{"stream":"survey_responses","data":{"id":"12731045521","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=0SWEpDfTb_2FAVFz7Ddryxk5koNgVExk8Oke4TJ8tz6QD5Eqc7uoqHQWRcLUi7yOAb","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731045521","total_time":32,"date_modified":"2021-06-10T08:49:26+00:00","date_created":"2021-06-10T08:48:54+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731045521","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174255"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174372"}]},{"id":"667461651","answers":[{"choice_id":"4385174482"}]},{"id":"667461652","answers":[{"choice_id":"4385174496"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174598"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174649"}]},{"id":"667461686","answers":[{"choice_id":"4385174678"}]}]}]},"emitted_at":1674149668076} +{"stream":"survey_responses","data":{"id":"12731059832","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=vhiMNZdaQtV6_2FPkJM_2BP8UtinkM87qYXz4VjmfwvWnjK1NFrLnN1P_2FH3w9GU7JUxX","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731059832","total_time":32,"date_modified":"2021-06-10T08:57:08+00:00","date_created":"2021-06-10T08:56:36+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731059832","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174252"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174485"}]},{"id":"667461652","answers":[{"choice_id":"4385174497"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174600"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174635"}]},{"id":"667461676","answers":[{"choice_id":"4385174644"}]},{"id":"667461686","answers":[{"choice_id":"4385174677"}]}]}]},"emitted_at":1674149668077} +{"stream":"survey_responses","data":{"id":"12731074829","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ZUZi7r7io9fCwXP7l4K5oirdqpAhNEdbesFS73p617lSOzxuK5oKGDsqiK8zdA8E","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731074829","total_time":31,"date_modified":"2021-06-10T09:04:52+00:00","date_created":"2021-06-10T09:04:20+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731074829","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174255"}]},{"id":"667461628","answers":[{"choice_id":"4385174360"}]},{"id":"667461630","answers":[{"choice_id":"4385174372"}]},{"id":"667461651","answers":[{"choice_id":"4385174485"}]},{"id":"667461652","answers":[{"choice_id":"4385174498"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174599"}]},{"id":"667461670","answers":[{"choice_id":"4385174622"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174645"}]},{"id":"667461686","answers":[{"choice_id":"4385174678"}]}]}]},"emitted_at":1674149668077} +{"stream":"survey_responses","data":{"id":"12731091270","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=eL4vDkGrDZfi5BiJC001E_2FoL_2Bo1mAtZxB97VuOw0Ue7x2Y_2Fvj9cWXWEFAG1_2For6z","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731091270","total_time":33,"date_modified":"2021-06-10T09:12:38+00:00","date_created":"2021-06-10T09:12:05+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731091270","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174252"}]},{"id":"667461628","answers":[{"choice_id":"4385174360"}]},{"id":"667461630","answers":[{"choice_id":"4385174372"}]},{"id":"667461651","answers":[{"choice_id":"4385174483"}]},{"id":"667461652","answers":[{"choice_id":"4385174493"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174600"}]},{"id":"667461670","answers":[{"choice_id":"4385174623"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174646"}]},{"id":"667461686","answers":[{"choice_id":"4385174678"}]}]}]},"emitted_at":1674149668078} +{"stream":"survey_responses","data":{"id":"12731107632","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=VzELV_2Bc1GPJfJsXsRIabrQVAi9_2BSDOS6F_2B68zR_2BP4u98MGtxvy_2BeSOjCh5s1HKa5","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731107632","total_time":32,"date_modified":"2021-06-10T09:20:17+00:00","date_created":"2021-06-10T09:19:44+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731107632","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174254"}]},{"id":"667461628","answers":[{"choice_id":"4385174360"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174483"}]},{"id":"667461652","answers":[{"choice_id":"4385174496"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174598"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174636"}]},{"id":"667461676","answers":[{"choice_id":"4385174649"}]},{"id":"667461686","answers":[{"choice_id":"4385174678"}]}]}]},"emitted_at":1674149668078} +{"stream":"survey_responses","data":{"id":"12731124423","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=QIT1tkBlcTVTBkkHm7dpbWllNNXyBriN0RSobCplWUm5LoJpA_2FC93B5N8fFbc0Zs","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731124423","total_time":31,"date_modified":"2021-06-10T09:28:00+00:00","date_created":"2021-06-10T09:27:28+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731124423","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174252"}]},{"id":"667461628","answers":[{"choice_id":"4385174362"}]},{"id":"667461630","answers":[{"choice_id":"4385174371"}]},{"id":"667461651","answers":[{"choice_id":"4385174484"}]},{"id":"667461652","answers":[{"choice_id":"4385174498"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174598"}]},{"id":"667461670","answers":[{"choice_id":"4385174620"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174645"}]},{"id":"667461686","answers":[{"choice_id":"4385174677"}]}]}]},"emitted_at":1674149668078} +{"stream":"survey_responses","data":{"id":"12731142107","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=URkLmYAmILJkZgOzrwRncRyLAGrxL_2FGHdeqmjSqrSYjS_2F7cjqy4e3nBWqRsOOv0r","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731142107","total_time":31,"date_modified":"2021-06-10T09:35:42+00:00","date_created":"2021-06-10T09:35:10+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731142107","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174252"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174482"}]},{"id":"667461652","answers":[{"choice_id":"4385174498"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174601"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174636"}]},{"id":"667461676","answers":[{"choice_id":"4385174643"}]},{"id":"667461686","answers":[{"choice_id":"4385174677"}]}]}]},"emitted_at":1674149668079} +{"stream":"survey_responses","data":{"id":"12731159230","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=O0O262_2ByzCPZXGbz3NLSBdAJfB9rNAyLSz4YX4ubxd_2BIrVIo2jJ_2Bzk8KQNxCcjXb","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731159230","total_time":31,"date_modified":"2021-06-10T09:43:20+00:00","date_created":"2021-06-10T09:42:49+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731159230","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174252"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174371"}]},{"id":"667461651","answers":[{"choice_id":"4385174482"}]},{"id":"667461652","answers":[{"choice_id":"4385174497"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174600"}]},{"id":"667461670","answers":[{"choice_id":"4385174623"}]},{"id":"667461674","answers":[{"choice_id":"4385174636"}]},{"id":"667461676","answers":[{"choice_id":"4385174643"}]},{"id":"667461686","answers":[{"choice_id":"4385174677"}]}]}]},"emitted_at":1674149668079} +{"stream":"survey_responses","data":{"id":"12731176347","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=LVM3eoF2xyKmckO7bkvBEw0i_2FoajMZMA_2Fc_2FVcI95ReDdVUuQQ_2Babxm1nILbPUISC","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731176347","total_time":33,"date_modified":"2021-06-10T09:51:04+00:00","date_created":"2021-06-10T09:50:30+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731176347","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174253"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174486"}]},{"id":"667461652","answers":[{"choice_id":"4385174497"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174600"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174649"}]},{"id":"667461686","answers":[{"choice_id":"4385174676"}]}]}]},"emitted_at":1674149668079} +{"stream":"survey_responses","data":{"id":"12731195152","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=SDlGK5Xxc7lpBehXWM_2B47eY24yPtwGB4NBBehIidUXtChXAXOgjA_2F8CxAHW97nUA","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731195152","total_time":35,"date_modified":"2021-06-10T09:59:39+00:00","date_created":"2021-06-10T09:59:03+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731195152","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174253"}]},{"id":"667461628","answers":[{"choice_id":"4385174360"}]},{"id":"667461630","answers":[{"choice_id":"4385174372"}]},{"id":"667461651","answers":[{"choice_id":"4385174485"}]},{"id":"667461652","answers":[{"choice_id":"4385174497"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174598"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174635"}]},{"id":"667461676","answers":[{"choice_id":"4385174647"}]},{"id":"667461686","answers":[{"choice_id":"4385174677"}]}]}]},"emitted_at":1674149668080} +{"stream":"survey_responses","data":{"id":"12731215248","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ft3pzaYpicC1h6Ah26Wj0wRkCmTK1Yu7BTxxTQ0po_2FC00oJaK3YHuX9XV5WB5T60","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731215248","total_time":32,"date_modified":"2021-06-10T10:07:34+00:00","date_created":"2021-06-10T10:07:02+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731215248","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174253"}]},{"id":"667461628","answers":[{"choice_id":"4385174360"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174485"}]},{"id":"667461652","answers":[{"choice_id":"4385174493"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174599"}]},{"id":"667461670","answers":[{"choice_id":"4385174623"}]},{"id":"667461674","answers":[{"choice_id":"4385174635"}]},{"id":"667461676","answers":[{"choice_id":"4385174646"}]},{"id":"667461686","answers":[{"choice_id":"4385174676"}]}]}]},"emitted_at":1674149668080} +{"stream":"survey_responses","data":{"id":"12731234853","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=2W_2B7kOeuvhHSN7s0oUQZQwt3iySUHWLv5qq0xw8gojd0RWsFcAMM6NILAk_2FZJbdX","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731234853","total_time":31,"date_modified":"2021-06-10T10:15:23+00:00","date_created":"2021-06-10T10:14:51+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731234853","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174252"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174372"}]},{"id":"667461651","answers":[{"choice_id":"4385174485"}]},{"id":"667461652","answers":[{"choice_id":"4385174497"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174601"}]},{"id":"667461670","answers":[{"choice_id":"4385174622"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174650"}]},{"id":"667461686","answers":[{"choice_id":"4385174678"}]}]}]},"emitted_at":1674149668080} +{"stream":"survey_responses","data":{"id":"12731253651","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=0yectjqXWcCHTMhyv3pd4HqlpH_2FjslmIWhw59V07Em7ASx_2FsHGk5ZFvSKThLEb3f","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731253651","total_time":31,"date_modified":"2021-06-10T10:23:12+00:00","date_created":"2021-06-10T10:22:41+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731253651","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174252"}]},{"id":"667461628","answers":[{"choice_id":"4385174362"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174482"}]},{"id":"667461652","answers":[{"choice_id":"4385174497"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174600"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174636"}]},{"id":"667461676","answers":[{"choice_id":"4385174646"}]},{"id":"667461686","answers":[{"choice_id":"4385174677"}]}]}]},"emitted_at":1674149668081} +{"stream":"survey_responses","data":{"id":"12731272195","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=owJREFrbM6_2Fu6fqPiWbW3rJ15U9q9DLJ_2BlAZMq6Gi_2BGKjQ2AGiWVNE5RBM_2FKLyMs","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731272195","total_time":31,"date_modified":"2021-06-10T10:30:52+00:00","date_created":"2021-06-10T10:30:20+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731272195","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174255"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174371"}]},{"id":"667461651","answers":[{"choice_id":"4385174482"}]},{"id":"667461652","answers":[{"choice_id":"4385174495"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174600"}]},{"id":"667461670","answers":[{"choice_id":"4385174623"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174646"}]},{"id":"667461686","answers":[{"choice_id":"4385174677"}]}]}]},"emitted_at":1674149668081} +{"stream":"survey_responses","data":{"id":"12731292534","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=zAYnDyr9Dxd9Em4YpxVpKH7_2BtJbsMFiI0bH89dH2LhhokCrBrNjKYFI0nacFEIpq","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731292534","total_time":32,"date_modified":"2021-06-10T10:38:57+00:00","date_created":"2021-06-10T10:38:25+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731292534","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174254"}]},{"id":"667461628","answers":[{"choice_id":"4385174362"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174483"}]},{"id":"667461652","answers":[{"choice_id":"4385174494"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174599"}]},{"id":"667461670","answers":[{"choice_id":"4385174623"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174649"}]},{"id":"667461686","answers":[{"choice_id":"4385174678"}]}]}]},"emitted_at":1674149668081} +{"stream":"survey_responses","data":{"id":"12731312208","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=uSGoF1sumsyf_2B3iBhadh_2F73k_2BM0dxEwFfAlWl70AwraHwQHcfj64cL0FUt9StbRx","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731312208","total_time":34,"date_modified":"2021-06-10T10:46:52+00:00","date_created":"2021-06-10T10:46:18+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731312208","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174255"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174371"}]},{"id":"667461651","answers":[{"choice_id":"4385174486"}]},{"id":"667461652","answers":[{"choice_id":"4385174495"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174598"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174635"}]},{"id":"667461676","answers":[{"choice_id":"4385174643"}]},{"id":"667461686","answers":[{"choice_id":"4385174677"}]}]}]},"emitted_at":1674149668082} +{"stream":"survey_responses","data":{"id":"12731331308","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=vQGF4JMphBOwv8kJxOmtjdRG81lTGr7CW73feMGxDEMLSwybystpUFV76KKxYQR6","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731331308","total_time":31,"date_modified":"2021-06-10T10:54:29+00:00","date_created":"2021-06-10T10:53:58+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731331308","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174253"}]},{"id":"667461628","answers":[{"choice_id":"4385174362"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174486"}]},{"id":"667461652","answers":[{"choice_id":"4385174498"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174598"}]},{"id":"667461670","answers":[{"choice_id":"4385174620"}]},{"id":"667461674","answers":[{"choice_id":"4385174636"}]},{"id":"667461676","answers":[{"choice_id":"4385174644"}]},{"id":"667461686","answers":[{"choice_id":"4385174676"}]}]}]},"emitted_at":1674149668082} +{"stream":"survey_responses","data":{"id":"12731350053","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843688","survey_id":"307785408","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=uQGI1ouCt3TwYg_2F0OjcapOOokxhfAvoP3vsYcJntZXz4yNaoZRXNQePI1o27JEfS","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxvvr7YEM4YZ5j7dMDUtBHEw_3D?respondent_id=12731350053","total_time":32,"date_modified":"2021-06-10T11:02:07+00:00","date_created":"2021-06-10T11:01:34+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785408/responses/12731350053","pages":[{"id":"168831381","questions":[]},{"id":"168831382","questions":[{"id":"667461606","answers":[{"choice_id":"4385174252"}]},{"id":"667461628","answers":[{"choice_id":"4385174361"}]},{"id":"667461630","answers":[{"choice_id":"4385174370"}]},{"id":"667461651","answers":[{"choice_id":"4385174483"}]},{"id":"667461652","answers":[{"choice_id":"4385174496"}]}]},{"id":"168831388","questions":[{"id":"667461666","answers":[{"choice_id":"4385174599"}]},{"id":"667461670","answers":[{"choice_id":"4385174621"}]},{"id":"667461674","answers":[{"choice_id":"4385174634"}]},{"id":"667461676","answers":[{"choice_id":"4385174646"}]},{"id":"667461686","answers":[{"choice_id":"4385174678"}]}]}]},"emitted_at":1674149668082} +{"stream":"survey_responses","data":{"id":"12730895819","recipient_id":"","collection_mode":"default","response_status":"partial","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":["168830049","168830050","168830060"],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=2awnrk_2BH5OxFP_2BQgeiHHjR9yR3bHHngtP06WJ08L7vUw_2Bi4HP_2BoIM_2Fzdi4XZBg4c","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12730895819","total_time":3851,"date_modified":"2021-06-10T08:30:24+00:00","date_created":"2021-06-10T07:26:12+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12730895819","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455130","answers":[{"choice_id":"4385137345"}]},{"id":"667455161","answers":[{"choice_id":"4385137473"}]},{"id":"667455172","answers":[{"choice_id":"4385137488"}]},{"id":"667455179","answers":[{"choice_id":"4385137493"}]}]},{"id":"168830060","questions":[]}]},"emitted_at":1674149669531} +{"stream":"survey_responses","data":{"id":"12731026318","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=9zPtrl88F3NYIsYeyGVBOAH8xcbXCyfUnb5wJmafeNnqKu0OuTBMd3AMA70CA0Dd","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731026318","total_time":42,"date_modified":"2021-06-10T08:38:55+00:00","date_created":"2021-06-10T08:38:13+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731026318","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137324"}]},{"id":"667455130","answers":[{"choice_id":"4385137342"}]},{"id":"667455161","answers":[{"choice_id":"4385137468"}]},{"id":"667455172","answers":[{"choice_id":"4385137486"}]},{"id":"667455179","answers":[{"choice_id":"4385137494"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137702"}]},{"id":"667455205","answers":[{"choice_id":"4385137743"}]},{"id":"667455210","answers":[{"choice_id":"4385137776"}]},{"id":"667455212","answers":[{"choice_id":"4385137797"}]},{"id":"667455215","answers":[{"choice_id":"4385137810"}]}]}]},"emitted_at":1674149669532} +{"stream":"survey_responses","data":{"id":"12731034119","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=_2F1iWQXdsu69adcyLuCe0CWLGDC2dm6Mi6UQBAgHHW5tqLGpm6S8VgnyogtlqQcF4","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731034119","total_time":38,"date_modified":"2021-06-10T08:43:18+00:00","date_created":"2021-06-10T08:42:40+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731034119","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137328"}]},{"id":"667455130","answers":[{"choice_id":"4385137342"}]},{"id":"667455161","answers":[{"choice_id":"4385137470"}]},{"id":"667455172","answers":[{"choice_id":"4385137488"}]},{"id":"667455179","answers":[{"choice_id":"4385137494"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137700"}]},{"id":"667455205","answers":[{"choice_id":"4385137742"}]},{"id":"667455210","answers":[{"choice_id":"4385137782"}]},{"id":"667455212","answers":[{"choice_id":"4385137793"}]},{"id":"667455215","answers":[{"choice_id":"4385137813"}]}]}]},"emitted_at":1674149669532} +{"stream":"survey_responses","data":{"id":"12731048348","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=teZL209m07VmwPLhipUVAeikuCFifwYD7Xbn856h7nliTsJok_2BJ8cUsANlBG1x09","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731048348","total_time":37,"date_modified":"2021-06-10T08:51:05+00:00","date_created":"2021-06-10T08:50:27+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731048348","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137324"}]},{"id":"667455130","answers":[{"choice_id":"4385137345"}]},{"id":"667455161","answers":[{"choice_id":"4385137472"}]},{"id":"667455172","answers":[{"choice_id":"4385137488"}]},{"id":"667455179","answers":[{"choice_id":"4385137494"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137700"}]},{"id":"667455205","answers":[{"choice_id":"4385137741"}]},{"id":"667455210","answers":[{"choice_id":"4385137780"}]},{"id":"667455212","answers":[{"choice_id":"4385137793"}]},{"id":"667455215","answers":[{"choice_id":"4385137812"}]}]}]},"emitted_at":1674149669532} +{"stream":"survey_responses","data":{"id":"12731062826","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=iBwqqk7dTblJHtZ5UWdoNXNfZvamq_2FWqVX9lPmgcaEk_2FJSEZbpEjvTDEp1kntA4I","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731062826","total_time":37,"date_modified":"2021-06-10T08:58:47+00:00","date_created":"2021-06-10T08:58:09+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731062826","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137325"}]},{"id":"667455130","answers":[{"choice_id":"4385137341"}]},{"id":"667455161","answers":[{"choice_id":"4385137473"}]},{"id":"667455172","answers":[{"choice_id":"4385137485"}]},{"id":"667455179","answers":[{"choice_id":"4385137494"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137701"}]},{"id":"667455205","answers":[{"choice_id":"4385137741"}]},{"id":"667455210","answers":[{"choice_id":"4385137782"}]},{"id":"667455212","answers":[{"choice_id":"4385137794"}]},{"id":"667455215","answers":[{"choice_id":"4385137813"}]}]}]},"emitted_at":1674149669533} +{"stream":"survey_responses","data":{"id":"12731078267","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=EWvr594gc6fTNOWCnzJcr1awvjtYrfcHOS1dCZlEmJOVdekL3kH9fN015tpi7AVW","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731078267","total_time":37,"date_modified":"2021-06-10T09:06:31+00:00","date_created":"2021-06-10T09:05:53+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731078267","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137329"}]},{"id":"667455130","answers":[{"choice_id":"4385137342"}]},{"id":"667455161","answers":[{"choice_id":"4385137468"}]},{"id":"667455172","answers":[{"choice_id":"4385137487"}]},{"id":"667455179","answers":[{"choice_id":"4385137495"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137701"}]},{"id":"667455205","answers":[{"choice_id":"4385137741"}]},{"id":"667455210","answers":[{"choice_id":"4385137775"}]},{"id":"667455212","answers":[{"choice_id":"4385137796"}]},{"id":"667455215","answers":[{"choice_id":"4385137811"}]}]}]},"emitted_at":1674149669533} +{"stream":"survey_responses","data":{"id":"12731094627","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=UEDBFTIm3XGLxP7HF9d4l806UiymFhRau6MyuUYkfb1y7zOR96xOkRxERkrOJ9ca","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731094627","total_time":38,"date_modified":"2021-06-10T09:14:16+00:00","date_created":"2021-06-10T09:13:38+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731094627","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137329"}]},{"id":"667455130","answers":[{"choice_id":"4385137345"}]},{"id":"667455161","answers":[{"choice_id":"4385137470"}]},{"id":"667455172","answers":[{"choice_id":"4385137486"}]},{"id":"667455179","answers":[{"choice_id":"4385137495"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137700"}]},{"id":"667455205","answers":[{"choice_id":"4385137743"}]},{"id":"667455210","answers":[{"choice_id":"4385137780"}]},{"id":"667455212","answers":[{"choice_id":"4385137792"}]},{"id":"667455215","answers":[{"choice_id":"4385137810"}]}]}]},"emitted_at":1674149669533} +{"stream":"survey_responses","data":{"id":"12731111090","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=X3JQr1B6y2spk9th1IPF0YF8VQxsZUEffTzik0RdvFtFl2SnrnJQRca_2BDoV2r4mq","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731111090","total_time":38,"date_modified":"2021-06-10T09:21:54+00:00","date_created":"2021-06-10T09:21:16+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731111090","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137326"}]},{"id":"667455130","answers":[{"choice_id":"4385137341"}]},{"id":"667455161","answers":[{"choice_id":"4385137474"}]},{"id":"667455172","answers":[{"choice_id":"4385137487"}]},{"id":"667455179","answers":[{"choice_id":"4385137493"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137701"}]},{"id":"667455205","answers":[{"choice_id":"4385137741"}]},{"id":"667455210","answers":[{"choice_id":"4385137775"}]},{"id":"667455212","answers":[{"choice_id":"4385137793"}]},{"id":"667455215","answers":[{"choice_id":"4385137811"}]}]}]},"emitted_at":1674149669534} +{"stream":"survey_responses","data":{"id":"12731127763","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ETzE9VL934Fk2aBcNUUcKaSh2V3EZHIzNm7GmAoHdznlQgZLuN90AHX13K3n6CVD","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731127763","total_time":37,"date_modified":"2021-06-10T09:29:36+00:00","date_created":"2021-06-10T09:28:58+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731127763","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137325"}]},{"id":"667455130","answers":[{"choice_id":"4385137341"}]},{"id":"667455161","answers":[{"choice_id":"4385137472"}]},{"id":"667455172","answers":[{"choice_id":"4385137488"}]},{"id":"667455179","answers":[{"choice_id":"4385137496"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137702"}]},{"id":"667455205","answers":[{"choice_id":"4385137740"}]},{"id":"667455210","answers":[{"choice_id":"4385137775"}]},{"id":"667455212","answers":[{"choice_id":"4385137797"}]},{"id":"667455215","answers":[{"choice_id":"4385137813"}]}]}]},"emitted_at":1674149669534} +{"stream":"survey_responses","data":{"id":"12731145509","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=VdEi6nthWHwzn1S6g9Ejj36ATaNJTgGRTvPg9OSgXQX3v7zuJ7b8kUW4JpPgoH8N","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731145509","total_time":37,"date_modified":"2021-06-10T09:37:18+00:00","date_created":"2021-06-10T09:36:40+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731145509","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137324"}]},{"id":"667455130","answers":[{"choice_id":"4385137344"}]},{"id":"667455161","answers":[{"choice_id":"4385137473"}]},{"id":"667455172","answers":[{"choice_id":"4385137486"}]},{"id":"667455179","answers":[{"choice_id":"4385137492"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137700"}]},{"id":"667455205","answers":[{"choice_id":"4385137743"}]},{"id":"667455210","answers":[{"choice_id":"4385137782"}]},{"id":"667455212","answers":[{"choice_id":"4385137795"}]},{"id":"667455215","answers":[{"choice_id":"4385137810"}]}]}]},"emitted_at":1674149669534} +{"stream":"survey_responses","data":{"id":"12731162853","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=SpVNwOtvMvqHvq3zHMXNhDHSmc7HA4m3XTWJpvcSJxvt1b1rvgGaOej3oC_2BolYPy","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731162853","total_time":38,"date_modified":"2021-06-10T09:45:01+00:00","date_created":"2021-06-10T09:44:23+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731162853","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137328"}]},{"id":"667455130","answers":[{"choice_id":"4385137340"}]},{"id":"667455161","answers":[{"choice_id":"4385137469"}]},{"id":"667455172","answers":[{"choice_id":"4385137487"}]},{"id":"667455179","answers":[{"choice_id":"4385137492"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137701"}]},{"id":"667455205","answers":[{"choice_id":"4385137743"}]},{"id":"667455210","answers":[{"choice_id":"4385137777"}]},{"id":"667455212","answers":[{"choice_id":"4385137795"}]},{"id":"667455215","answers":[{"choice_id":"4385137811"}]}]}]},"emitted_at":1674149669535} +{"stream":"survey_responses","data":{"id":"12731180052","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=JiwKhmlzAA4BE2G7wLdiXM8p7qGKqy7FVolioM_2BFHLNo4MIvbtO7U2T2MtIhjHQT","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731180052","total_time":40,"date_modified":"2021-06-10T09:52:49+00:00","date_created":"2021-06-10T09:52:09+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731180052","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137324"}]},{"id":"667455130","answers":[{"choice_id":"4385137342"}]},{"id":"667455161","answers":[{"choice_id":"4385137468"}]},{"id":"667455172","answers":[{"choice_id":"4385137487"}]},{"id":"667455179","answers":[{"choice_id":"4385137494"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137702"}]},{"id":"667455205","answers":[{"choice_id":"4385137740"}]},{"id":"667455210","answers":[{"choice_id":"4385137775"}]},{"id":"667455212","answers":[{"choice_id":"4385137794"}]},{"id":"667455215","answers":[{"choice_id":"4385137812"}]}]}]},"emitted_at":1674149669535} +{"stream":"survey_responses","data":{"id":"12731198914","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=4lczf0MNm2lOpWvmpCXz8qaQFfYxrkqDyo3Na6JqZ3SoyW9vfVtRkWihGPcm3TJ9","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731198914","total_time":37,"date_modified":"2021-06-10T10:01:22+00:00","date_created":"2021-06-10T10:00:44+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731198914","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137329"}]},{"id":"667455130","answers":[{"choice_id":"4385137345"}]},{"id":"667455161","answers":[{"choice_id":"4385137472"}]},{"id":"667455172","answers":[{"choice_id":"4385137485"}]},{"id":"667455179","answers":[{"choice_id":"4385137494"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137700"}]},{"id":"667455205","answers":[{"choice_id":"4385137741"}]},{"id":"667455210","answers":[{"choice_id":"4385137776"}]},{"id":"667455212","answers":[{"choice_id":"4385137795"}]},{"id":"667455215","answers":[{"choice_id":"4385137811"}]}]}]},"emitted_at":1674149669535} +{"stream":"survey_responses","data":{"id":"12731219287","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=BuKPZoR_2B7yhJkjbyRrpCv9Xsryak851Sl2u8K17_2FsYnSAZUFHdu4fJB0umnx5Y9_2B","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731219287","total_time":37,"date_modified":"2021-06-10T10:09:13+00:00","date_created":"2021-06-10T10:08:35+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731219287","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137327"}]},{"id":"667455130","answers":[{"choice_id":"4385137341"}]},{"id":"667455161","answers":[{"choice_id":"4385137470"}]},{"id":"667455172","answers":[{"choice_id":"4385137488"}]},{"id":"667455179","answers":[{"choice_id":"4385137494"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137701"}]},{"id":"667455205","answers":[{"choice_id":"4385137740"}]},{"id":"667455210","answers":[{"choice_id":"4385137776"}]},{"id":"667455212","answers":[{"choice_id":"4385137792"}]},{"id":"667455215","answers":[{"choice_id":"4385137811"}]}]}]},"emitted_at":1674149669536} +{"stream":"survey_responses","data":{"id":"12731238577","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=gYK41YcmDya_2Bvsx_2BqjLe992H7r6ORc6kyUL3YhAqx78syU1tTY9dv_2Fn92J5xM033","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731238577","total_time":37,"date_modified":"2021-06-10T10:16:59+00:00","date_created":"2021-06-10T10:16:21+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731238577","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137327"}]},{"id":"667455130","answers":[{"choice_id":"4385137340"}]},{"id":"667455161","answers":[{"choice_id":"4385137472"}]},{"id":"667455172","answers":[{"choice_id":"4385137485"}]},{"id":"667455179","answers":[{"choice_id":"4385137496"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137702"}]},{"id":"667455205","answers":[{"choice_id":"4385137741"}]},{"id":"667455210","answers":[{"choice_id":"4385137778"}]},{"id":"667455212","answers":[{"choice_id":"4385137793"}]},{"id":"667455215","answers":[{"choice_id":"4385137810"}]}]}]},"emitted_at":1674149669536} +{"stream":"survey_responses","data":{"id":"12731257342","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=gXcd4_2B0crZ3JHyflBVCFpzaABCmJO9PKQzLnjMuvOHPsOS0sIISJZjVscMHtusHw","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731257342","total_time":37,"date_modified":"2021-06-10T10:24:47+00:00","date_created":"2021-06-10T10:24:10+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731257342","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137324"}]},{"id":"667455130","answers":[{"choice_id":"4385137340"}]},{"id":"667455161","answers":[{"choice_id":"4385137471"}]},{"id":"667455172","answers":[{"choice_id":"4385137486"}]},{"id":"667455179","answers":[{"choice_id":"4385137495"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137701"}]},{"id":"667455205","answers":[{"choice_id":"4385137740"}]},{"id":"667455210","answers":[{"choice_id":"4385137782"}]},{"id":"667455212","answers":[{"choice_id":"4385137793"}]},{"id":"667455215","answers":[{"choice_id":"4385137813"}]}]}]},"emitted_at":1674149669536} +{"stream":"survey_responses","data":{"id":"12731276322","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=fdG3OylITjbhJlFfCAIGHmTQ6YpdyOcILnp8DliR5bm9qPSRMG6AkkWm3Gu2gJoP","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731276322","total_time":41,"date_modified":"2021-06-10T10:32:36+00:00","date_created":"2021-06-10T10:31:54+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731276322","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137328"}]},{"id":"667455130","answers":[{"choice_id":"4385137340"}]},{"id":"667455161","answers":[{"choice_id":"4385137468"}]},{"id":"667455172","answers":[{"choice_id":"4385137487"}]},{"id":"667455179","answers":[{"choice_id":"4385137495"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137702"}]},{"id":"667455205","answers":[{"choice_id":"4385137742"}]},{"id":"667455210","answers":[{"choice_id":"4385137776"}]},{"id":"667455212","answers":[{"choice_id":"4385137793"}]},{"id":"667455215","answers":[{"choice_id":"4385137812"}]}]}]},"emitted_at":1674149669537} +{"stream":"survey_responses","data":{"id":"12731296299","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=PijLaybIFW4zp3WXn6Qn_2Bes5snwJCUJdhdklhMDUCFNxV8kYJTspV5CKmi9JxcxR","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731296299","total_time":28,"date_modified":"2021-06-10T10:40:25+00:00","date_created":"2021-06-10T10:39:56+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731296299","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137700"}]},{"id":"667455205","answers":[{"choice_id":"4385137742"}]},{"id":"667455210","answers":[{"choice_id":"4385137778"}]},{"id":"667455212","answers":[{"choice_id":"4385137795"}]},{"id":"667455215","answers":[{"choice_id":"4385137812"}]}]}]},"emitted_at":1674149669537} +{"stream":"survey_responses","data":{"id":"12731316167","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=DdWwrUlBvSWJMjuKWSDCTJGmzJlZPpJ9HEf_2F_2BW1pzPCQ9WlJ7Su0kQcly_2B_2F6O8il","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731316167","total_time":37,"date_modified":"2021-06-10T10:48:31+00:00","date_created":"2021-06-10T10:47:54+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731316167","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137327"}]},{"id":"667455130","answers":[{"choice_id":"4385137342"}]},{"id":"667455161","answers":[{"choice_id":"4385137469"}]},{"id":"667455172","answers":[{"choice_id":"4385137487"}]},{"id":"667455179","answers":[{"choice_id":"4385137492"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137700"}]},{"id":"667455205","answers":[{"choice_id":"4385137740"}]},{"id":"667455210","answers":[{"choice_id":"4385137776"}]},{"id":"667455212","answers":[{"choice_id":"4385137797"}]},{"id":"667455215","answers":[{"choice_id":"4385137811"}]}]}]},"emitted_at":1674149669537} +{"stream":"survey_responses","data":{"id":"12731335082","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=JT5nsI3dl0SB9aaAvObos67DXY6qy_2FDXI1TTpgeEv1m3sqvcxy3MhVQQlApbsDQN","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731335082","total_time":37,"date_modified":"2021-06-10T10:56:07+00:00","date_created":"2021-06-10T10:55:30+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731335082","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137325"}]},{"id":"667455130","answers":[{"choice_id":"4385137340"}]},{"id":"667455161","answers":[{"choice_id":"4385137473"}]},{"id":"667455172","answers":[{"choice_id":"4385137487"}]},{"id":"667455179","answers":[{"choice_id":"4385137493"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137701"}]},{"id":"667455205","answers":[{"choice_id":"4385137742"}]},{"id":"667455210","answers":[{"choice_id":"4385137782"}]},{"id":"667455212","answers":[{"choice_id":"4385137794"}]},{"id":"667455215","answers":[{"choice_id":"4385137810"}]}]}]},"emitted_at":1674149669538} +{"stream":"survey_responses","data":{"id":"12731354013","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829319","survey_id":"307784834","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=VD2H3n1aqESl1LrF5U_2B7SlCYCH1VXiN11NQ44aSykUk8VdT8zluzTaiFP1WRilVh","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwf91XTSWLx4XNlQvyUVl4Y_3D?respondent_id=12731354013","total_time":37,"date_modified":"2021-06-10T11:03:44+00:00","date_created":"2021-06-10T11:03:07+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784834/responses/12731354013","pages":[{"id":"168830049","questions":[]},{"id":"168830050","questions":[{"id":"667455128","answers":[{"choice_id":"4385137325"}]},{"id":"667455130","answers":[{"choice_id":"4385137344"}]},{"id":"667455161","answers":[{"choice_id":"4385137473"}]},{"id":"667455172","answers":[{"choice_id":"4385137488"}]},{"id":"667455179","answers":[{"choice_id":"4385137493"}]}]},{"id":"168830060","questions":[{"id":"667455202","answers":[{"choice_id":"4385137701"}]},{"id":"667455205","answers":[{"choice_id":"4385137740"}]},{"id":"667455210","answers":[{"choice_id":"4385137781"}]},{"id":"667455212","answers":[{"choice_id":"4385137792"}]},{"id":"667455215","answers":[{"choice_id":"4385137811"}]}]}]},"emitted_at":1674149669538} +{"stream":"survey_responses","data":{"id":"12731046667","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=3m5bJqYOPzi9hTHWeQaMVChOOH_2FutIpC1GCzcEhDLsPuEi5IsDvCVew50TpjMJ7_2B","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731046667","total_time":36,"date_modified":"2021-06-10T08:50:07+00:00","date_created":"2021-06-10T08:49:30+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731046667","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177067"}]},{"id":"667462114","answers":[{"choice_id":"4385177098"}]},{"id":"667462122","answers":[{"choice_id":"4385177138"}]},{"id":"667462126","answers":[{"choice_id":"4385177155"}]},{"id":"667462130","answers":[{"choice_id":"4385177172"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177202"}]},{"id":"667462136","answers":[{"choice_id":"4385177213"}]},{"id":"667462138","answers":[{"choice_id":"4385177216"}]},{"id":"667462170","answers":[{"choice_id":"4385177381"}]},{"id":"667462172","answers":[{"choice_id":"4385177393"}]}]}]},"emitted_at":1674149671253} +{"stream":"survey_responses","data":{"id":"12731061053","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=RliJfymKsHA5ERiuKeRola_2B_2F2kldmGpI58KjGRQTMy_2F7NOeFnJ8VaeyjrQYqefuv","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731061053","total_time":36,"date_modified":"2021-06-10T08:57:50+00:00","date_created":"2021-06-10T08:57:13+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731061053","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177068"}]},{"id":"667462114","answers":[{"choice_id":"4385177098"}]},{"id":"667462122","answers":[{"choice_id":"4385177139"}]},{"id":"667462126","answers":[{"choice_id":"4385177158"}]},{"id":"667462130","answers":[{"choice_id":"4385177171"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177202"}]},{"id":"667462136","answers":[{"choice_id":"4385177211"}]},{"id":"667462138","answers":[{"choice_id":"4385177217"}]},{"id":"667462170","answers":[{"choice_id":"4385177381"}]},{"id":"667462172","answers":[{"choice_id":"4385177395"}]}]}]},"emitted_at":1674149671254} +{"stream":"survey_responses","data":{"id":"12731076167","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Fbm6tEId2O2bNT8H0BJ8ZuinueLnpLoMwgotsY_2BRD_2FzbvCnhEaxZHye5e5bkXF_2B0","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731076167","total_time":36,"date_modified":"2021-06-10T09:05:33+00:00","date_created":"2021-06-10T09:04:57+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731076167","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177067"}]},{"id":"667462114","answers":[{"choice_id":"4385177097"}]},{"id":"667462122","answers":[{"choice_id":"4385177142"}]},{"id":"667462126","answers":[{"choice_id":"4385177153"}]},{"id":"667462130","answers":[{"choice_id":"4385177172"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177204"}]},{"id":"667462136","answers":[{"choice_id":"4385177210"}]},{"id":"667462138","answers":[{"choice_id":"4385177220"}]},{"id":"667462170","answers":[{"choice_id":"4385177382"}]},{"id":"667462172","answers":[{"choice_id":"4385177392"}]}]}]},"emitted_at":1674149671256} +{"stream":"survey_responses","data":{"id":"12731092606","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=FSRkUyOqh9XslZbpVGw5556THT2fSckee67DmK8vg8QM5E_2BIPpatzKJNVF6E4pI2","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731092606","total_time":36,"date_modified":"2021-06-10T09:13:19+00:00","date_created":"2021-06-10T09:12:43+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731092606","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177066"}]},{"id":"667462114","answers":[{"choice_id":"4385177098"}]},{"id":"667462122","answers":[{"choice_id":"4385177138"}]},{"id":"667462126","answers":[{"choice_id":"4385177153"}]},{"id":"667462130","answers":[{"choice_id":"4385177173"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177202"}]},{"id":"667462136","answers":[{"choice_id":"4385177213"}]},{"id":"667462138","answers":[{"choice_id":"4385177215"}]},{"id":"667462170","answers":[{"choice_id":"4385177381"}]},{"id":"667462172","answers":[{"choice_id":"4385177399"}]}]}]},"emitted_at":1674149671258} +{"stream":"survey_responses","data":{"id":"12731109051","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=hFBXkisB3CTNYQ4UTLe_2FgTWjKwcR0l_2Fk9xXG2L2eiiv2m1A4IK6anbX8e98lxI_2BJ","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731109051","total_time":36,"date_modified":"2021-06-10T09:20:57+00:00","date_created":"2021-06-10T09:20:21+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731109051","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177068"}]},{"id":"667462114","answers":[{"choice_id":"4385177098"}]},{"id":"667462122","answers":[{"choice_id":"4385177139"}]},{"id":"667462126","answers":[{"choice_id":"4385177156"}]},{"id":"667462130","answers":[{"choice_id":"4385177171"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177204"}]},{"id":"667462136","answers":[{"choice_id":"4385177211"}]},{"id":"667462138","answers":[{"choice_id":"4385177220"}]},{"id":"667462170","answers":[{"choice_id":"4385177383"}]},{"id":"667462172","answers":[{"choice_id":"4385177398"}]}]}]},"emitted_at":1674149671259} +{"stream":"survey_responses","data":{"id":"12731125773","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=IitR8qwcQJhjvJZGpnRnQ51uSFMITWI_2Fj71B7P5SgZeC4E3yXEi1_2B_2FMm5wo_2BDV8h","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731125773","total_time":37,"date_modified":"2021-06-10T09:28:41+00:00","date_created":"2021-06-10T09:28:04+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731125773","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177066"}]},{"id":"667462114","answers":[{"choice_id":"4385177099"}]},{"id":"667462122","answers":[{"choice_id":"4385177142"}]},{"id":"667462126","answers":[{"choice_id":"4385177158"}]},{"id":"667462130","answers":[{"choice_id":"4385177171"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177203"}]},{"id":"667462136","answers":[{"choice_id":"4385177211"}]},{"id":"667462138","answers":[{"choice_id":"4385177220"}]},{"id":"667462170","answers":[{"choice_id":"4385177382"}]},{"id":"667462172","answers":[{"choice_id":"4385177392"}]}]}]},"emitted_at":1674149671261} +{"stream":"survey_responses","data":{"id":"12731143496","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=afwrrGApCHDKe6n5FTBrtOaHsGGtP_2BhesVrwRj_2FP25EjYCQxzsAC6aAkUchVScSv","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731143496","total_time":36,"date_modified":"2021-06-10T09:36:22+00:00","date_created":"2021-06-10T09:35:46+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731143496","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177066"}]},{"id":"667462114","answers":[{"choice_id":"4385177097"}]},{"id":"667462122","answers":[{"choice_id":"4385177138"}]},{"id":"667462126","answers":[{"choice_id":"4385177154"}]},{"id":"667462130","answers":[{"choice_id":"4385177174"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177201"}]},{"id":"667462136","answers":[{"choice_id":"4385177213"}]},{"id":"667462138","answers":[{"choice_id":"4385177216"}]},{"id":"667462170","answers":[{"choice_id":"4385177382"}]},{"id":"667462172","answers":[{"choice_id":"4385177392"}]}]}]},"emitted_at":1674149671263} +{"stream":"survey_responses","data":{"id":"12731160592","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=gi5j6iOFt63bX7t4yH9tggXGZlHkMPjNnRuEfb_2BfIFrcSwpamxUO_2B9Y0WXX9oSHD","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731160592","total_time":35,"date_modified":"2021-06-10T09:44:01+00:00","date_created":"2021-06-10T09:43:25+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731160592","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177065"}]},{"id":"667462114","answers":[{"choice_id":"4385177098"}]},{"id":"667462122","answers":[{"choice_id":"4385177142"}]},{"id":"667462126","answers":[{"choice_id":"4385177156"}]},{"id":"667462130","answers":[{"choice_id":"4385177174"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177203"}]},{"id":"667462136","answers":[{"choice_id":"4385177210"}]},{"id":"667462138","answers":[{"choice_id":"4385177219"}]},{"id":"667462170","answers":[{"choice_id":"4385177382"}]},{"id":"667462172","answers":[{"choice_id":"4385177398"}]}]}]},"emitted_at":1674149671264} +{"stream":"survey_responses","data":{"id":"12731177842","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Mdft9tg4e78_2Fa7lJAhODrqVOjXTcfF0kM1rlL9FH_2B4OFTc8svhyUTN194QTJecZV","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731177842","total_time":38,"date_modified":"2021-06-10T09:51:48+00:00","date_created":"2021-06-10T09:51:09+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731177842","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177068"}]},{"id":"667462114","answers":[{"choice_id":"4385177097"}]},{"id":"667462122","answers":[{"choice_id":"4385177141"}]},{"id":"667462126","answers":[{"choice_id":"4385177155"}]},{"id":"667462130","answers":[{"choice_id":"4385177174"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177204"}]},{"id":"667462136","answers":[{"choice_id":"4385177211"}]},{"id":"667462138","answers":[{"choice_id":"4385177220"}]},{"id":"667462170","answers":[{"choice_id":"4385177381"}]},{"id":"667462172","answers":[{"choice_id":"4385177398"}]}]}]},"emitted_at":1674149671266} +{"stream":"survey_responses","data":{"id":"12731196644","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=j0mjP6Z7LrcWGOboY6jmQkq3eLodG5VEJ1xjmK_2FVYi4g_2BLXzw2TXVIZDXlMQfSce","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731196644","total_time":38,"date_modified":"2021-06-10T10:00:23+00:00","date_created":"2021-06-10T09:59:44+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731196644","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177067"}]},{"id":"667462114","answers":[{"choice_id":"4385177096"}]},{"id":"667462122","answers":[{"choice_id":"4385177141"}]},{"id":"667462126","answers":[{"choice_id":"4385177153"}]},{"id":"667462130","answers":[{"choice_id":"4385177174"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177202"}]},{"id":"667462136","answers":[{"choice_id":"4385177211"}]},{"id":"667462138","answers":[{"choice_id":"4385177218"}]},{"id":"667462170","answers":[{"choice_id":"4385177381"}]},{"id":"667462172","answers":[{"choice_id":"4385177393"}]}]}]},"emitted_at":1674149671267} +{"stream":"survey_responses","data":{"id":"12731216845","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=42BF5q8j9sIJ7FZW3oHucGLBgLbhnDLuy54e3nC1dr_2BV65av2cB1XpRMxXE8qLrk","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731216845","total_time":35,"date_modified":"2021-06-10T10:08:14+00:00","date_created":"2021-06-10T10:07:38+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731216845","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177066"}]},{"id":"667462114","answers":[{"choice_id":"4385177099"}]},{"id":"667462122","answers":[{"choice_id":"4385177139"}]},{"id":"667462126","answers":[{"choice_id":"4385177158"}]},{"id":"667462130","answers":[{"choice_id":"4385177172"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177202"}]},{"id":"667462136","answers":[{"choice_id":"4385177211"}]},{"id":"667462138","answers":[{"choice_id":"4385177215"}]},{"id":"667462170","answers":[{"choice_id":"4385177383"}]},{"id":"667462172","answers":[{"choice_id":"4385177392"}]}]}]},"emitted_at":1674149671269} +{"stream":"survey_responses","data":{"id":"12731236327","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=NqwagvKjeHPRtNo1Xjgzhlf20oC0V9pmZhKn9M_2FI7d0WQpLl5SvMJmpPx_2FMR8WOA","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731236327","total_time":36,"date_modified":"2021-06-10T10:16:03+00:00","date_created":"2021-06-10T10:15:27+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731236327","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177066"}]},{"id":"667462114","answers":[{"choice_id":"4385177099"}]},{"id":"667462122","answers":[{"choice_id":"4385177138"}]},{"id":"667462126","answers":[{"choice_id":"4385177153"}]},{"id":"667462130","answers":[{"choice_id":"4385177171"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177204"}]},{"id":"667462136","answers":[{"choice_id":"4385177212"}]},{"id":"667462138","answers":[{"choice_id":"4385177214"}]},{"id":"667462170","answers":[{"choice_id":"4385177382"}]},{"id":"667462172","answers":[{"choice_id":"4385177394"}]}]}]},"emitted_at":1674149671270} +{"stream":"survey_responses","data":{"id":"12731255115","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=68xsdhMhxZnM6kEBzq6YOW2Pcy65CdGFnjt47M9pu1JOngmURrmW_2BioZOUdc5iwt","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731255115","total_time":35,"date_modified":"2021-06-10T10:23:53+00:00","date_created":"2021-06-10T10:23:17+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731255115","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177067"}]},{"id":"667462114","answers":[{"choice_id":"4385177095"}]},{"id":"667462122","answers":[{"choice_id":"4385177141"}]},{"id":"667462126","answers":[{"choice_id":"4385177158"}]},{"id":"667462130","answers":[{"choice_id":"4385177172"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177202"}]},{"id":"667462136","answers":[{"choice_id":"4385177211"}]},{"id":"667462138","answers":[{"choice_id":"4385177218"}]},{"id":"667462170","answers":[{"choice_id":"4385177382"}]},{"id":"667462172","answers":[{"choice_id":"4385177395"}]}]}]},"emitted_at":1674149671272} +{"stream":"survey_responses","data":{"id":"12731273731","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=5V96fOaPSetDK7aFZp_2BQMlsfP5WVMuaklhLOVJzxjkLao_2BG1CUfWUAOvXCoIqzu7","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731273731","total_time":35,"date_modified":"2021-06-10T10:31:32+00:00","date_created":"2021-06-10T10:30:56+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731273731","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177065"}]},{"id":"667462114","answers":[{"choice_id":"4385177096"}]},{"id":"667462122","answers":[{"choice_id":"4385177140"}]},{"id":"667462126","answers":[{"choice_id":"4385177155"}]},{"id":"667462130","answers":[{"choice_id":"4385177171"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177203"}]},{"id":"667462136","answers":[{"choice_id":"4385177210"}]},{"id":"667462138","answers":[{"choice_id":"4385177215"}]},{"id":"667462170","answers":[{"choice_id":"4385177381"}]},{"id":"667462172","answers":[{"choice_id":"4385177398"}]}]}]},"emitted_at":1674149671273} +{"stream":"survey_responses","data":{"id":"12731294056","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=yqW6gwVkcj7CYuN1hQxBNE2_2BGnnSO_2FMoG_2FJOr_2Bl9LOFwGfvlISTxAL6DegDXn5gw","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731294056","total_time":36,"date_modified":"2021-06-10T10:39:38+00:00","date_created":"2021-06-10T10:39:02+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731294056","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177067"}]},{"id":"667462114","answers":[{"choice_id":"4385177096"}]},{"id":"667462122","answers":[{"choice_id":"4385177142"}]},{"id":"667462126","answers":[{"choice_id":"4385177154"}]},{"id":"667462130","answers":[{"choice_id":"4385177172"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177204"}]},{"id":"667462136","answers":[{"choice_id":"4385177213"}]},{"id":"667462138","answers":[{"choice_id":"4385177214"}]},{"id":"667462170","answers":[{"choice_id":"4385177383"}]},{"id":"667462172","answers":[{"choice_id":"4385177393"}]}]}]},"emitted_at":1674149671275} +{"stream":"survey_responses","data":{"id":"12731313837","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=D85HuJHtbiPW1vl_2FIvU2ocvUVCdJggW_2F0WR5WpMSLCGZaGIg8UdLj54drv_2FcmRMz","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731313837","total_time":37,"date_modified":"2021-06-10T10:47:34+00:00","date_created":"2021-06-10T10:46:57+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731313837","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177067"}]},{"id":"667462114","answers":[{"choice_id":"4385177097"}]},{"id":"667462122","answers":[{"choice_id":"4385177139"}]},{"id":"667462126","answers":[{"choice_id":"4385177156"}]},{"id":"667462130","answers":[{"choice_id":"4385177172"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177200"}]},{"id":"667462136","answers":[{"choice_id":"4385177212"}]},{"id":"667462138","answers":[{"choice_id":"4385177220"}]},{"id":"667462170","answers":[{"choice_id":"4385177382"}]},{"id":"667462172","answers":[{"choice_id":"4385177395"}]}]}]},"emitted_at":1674149671276} +{"stream":"survey_responses","data":{"id":"12731332767","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=hztkSX5ztC9RUhcoXXjOEZsT0_2BjH5f6tNA9Fh0afPXTD4285Qb8YReTOBLbelKig","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731332767","total_time":35,"date_modified":"2021-06-10T10:55:09+00:00","date_created":"2021-06-10T10:54:33+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731332767","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177068"}]},{"id":"667462114","answers":[{"choice_id":"4385177096"}]},{"id":"667462122","answers":[{"choice_id":"4385177139"}]},{"id":"667462126","answers":[{"choice_id":"4385177158"}]},{"id":"667462130","answers":[{"choice_id":"4385177172"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177204"}]},{"id":"667462136","answers":[{"choice_id":"4385177210"}]},{"id":"667462138","answers":[{"choice_id":"4385177217"}]},{"id":"667462170","answers":[{"choice_id":"4385177382"}]},{"id":"667462172","answers":[{"choice_id":"4385177398"}]}]}]},"emitted_at":1674149671277} +{"stream":"survey_responses","data":{"id":"12731351604","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829931","survey_id":"307785448","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=4s6X1KZyt2TAwDeH6zLlLbhI1hJkumblOrBysCkO3gPTDp7tdY9BOD_2FvWkRVgEAz","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxi9bVow7JzoPHlGgDld6S4o_3D?respondent_id=12731351604","total_time":36,"date_modified":"2021-06-10T11:02:48+00:00","date_created":"2021-06-10T11:02:12+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785448/responses/12731351604","pages":[{"id":"168831470","questions":[]},{"id":"168831471","questions":[{"id":"667462113","answers":[{"choice_id":"4385177068"}]},{"id":"667462114","answers":[{"choice_id":"4385177098"}]},{"id":"667462122","answers":[{"choice_id":"4385177138"}]},{"id":"667462126","answers":[{"choice_id":"4385177154"}]},{"id":"667462130","answers":[{"choice_id":"4385177172"}]}]},{"id":"168831478","questions":[{"id":"667462135","answers":[{"choice_id":"4385177200"}]},{"id":"667462136","answers":[{"choice_id":"4385177213"}]},{"id":"667462138","answers":[{"choice_id":"4385177218"}]},{"id":"667462170","answers":[{"choice_id":"4385177381"}]},{"id":"667462172","answers":[{"choice_id":"4385177397"}]}]}]},"emitted_at":1674149671278} +{"stream":"survey_responses","data":{"id":"12731027651","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=fTFc6V6Lifr7HoJ_2Bl_2Bc74bpg_2B9JRwagJN_2FN3k2RwdJ8CrOldvM08uLZMXEGk5uR_2B","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731027651","total_time":29,"date_modified":"2021-06-10T08:39:30+00:00","date_created":"2021-06-10T08:39:01+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731027651","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138588"}]},{"id":"667455351","answers":[{"choice_id":"4385138599"}]},{"id":"667455358","answers":[{"choice_id":"4385138621"}]},{"id":"667455370","answers":[{"choice_id":"4385138707"}]},{"id":"667455395","answers":[{"choice_id":"4385138780"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139016"}]},{"id":"667455439","answers":[{"choice_id":"4385139062"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139232"}]},{"id":"667455466","answers":[{"choice_id":"4385139246"}]}]}]},"emitted_at":1674149672891} +{"stream":"survey_responses","data":{"id":"12731035521","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=P3yPukgvQbdQ0TVJQrLvSnRv3NllOsosNLSuGp34tGmMRN3SsXsVqXxRkHoUAZzR","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731035521","total_time":27,"date_modified":"2021-06-10T08:43:50+00:00","date_created":"2021-06-10T08:43:23+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731035521","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138593"}]},{"id":"667455351","answers":[{"choice_id":"4385138600"}]},{"id":"667455358","answers":[{"choice_id":"4385138623"}]},{"id":"667455370","answers":[{"choice_id":"4385138700"}]},{"id":"667455395","answers":[{"choice_id":"4385138780"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139018"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139231"}]},{"id":"667455466","answers":[{"choice_id":"4385139244"}]}]}]},"emitted_at":1674149672893} +{"stream":"survey_responses","data":{"id":"12731049611","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=1ZxbynfKwvppvatsw2rpbv64I6YRz_2BRUyTcv8dLIbh63fwCm_2Fl9TFtbLXUoePm1q","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731049611","total_time":27,"date_modified":"2021-06-10T08:51:37+00:00","date_created":"2021-06-10T08:51:09+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731049611","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138588"}]},{"id":"667455351","answers":[{"choice_id":"4385138598"}]},{"id":"667455358","answers":[{"choice_id":"4385138623"}]},{"id":"667455370","answers":[{"choice_id":"4385138701"}]},{"id":"667455395","answers":[{"choice_id":"4385138782"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139017"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139232"}]},{"id":"667455466","answers":[{"choice_id":"4385139245"}]}]}]},"emitted_at":1674149672895} +{"stream":"survey_responses","data":{"id":"12731064110","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Vxei42yDMEVFSnyt9M3fpCOreC5nzmSKyEY9iwPt1QtQFzPyFiaGMuw2XQKlF4Tu","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731064110","total_time":27,"date_modified":"2021-06-10T08:59:20+00:00","date_created":"2021-06-10T08:58:52+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731064110","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138591"}]},{"id":"667455351","answers":[{"choice_id":"4385138600"}]},{"id":"667455358","answers":[{"choice_id":"4385138620"}]},{"id":"667455370","answers":[{"choice_id":"4385138706"}]},{"id":"667455395","answers":[{"choice_id":"4385138782"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139013"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139112"}]},{"id":"667455463","answers":[{"choice_id":"4385139231"}]},{"id":"667455466","answers":[{"choice_id":"4385139246"}]}]}]},"emitted_at":1674149672897} +{"stream":"survey_responses","data":{"id":"12731079723","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=pucu83BOi19Z2n_2Bq7Cmuq6GrV4auydnhRuXlDsCZ5DwqqAhRkuX0GL8i_2FXCRgVnb","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731079723","total_time":27,"date_modified":"2021-06-10T09:07:03+00:00","date_created":"2021-06-10T09:06:36+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731079723","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138589"}]},{"id":"667455351","answers":[{"choice_id":"4385138599"}]},{"id":"667455358","answers":[{"choice_id":"4385138622"}]},{"id":"667455370","answers":[{"choice_id":"4385138707"}]},{"id":"667455395","answers":[{"choice_id":"4385138780"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139016"}]},{"id":"667455439","answers":[{"choice_id":"4385139063"}]},{"id":"667455443","answers":[{"choice_id":"4385139111"}]},{"id":"667455463","answers":[{"choice_id":"4385139235"}]},{"id":"667455466","answers":[{"choice_id":"4385139244"}]}]}]},"emitted_at":1674149672898} +{"stream":"survey_responses","data":{"id":"12731096120","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=cmwD6t6spTjvPh8zt8wpzOowMPktBxJBhl8ROXhWK7NsNRfaf9VJ51wtPZfMsbPJ","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731096120","total_time":27,"date_modified":"2021-06-10T09:14:48+00:00","date_created":"2021-06-10T09:14:21+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731096120","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138593"}]},{"id":"667455351","answers":[{"choice_id":"4385138597"}]},{"id":"667455358","answers":[{"choice_id":"4385138623"}]},{"id":"667455370","answers":[{"choice_id":"4385138706"}]},{"id":"667455395","answers":[{"choice_id":"4385138780"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139016"}]},{"id":"667455439","answers":[{"choice_id":"4385139063"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139235"}]},{"id":"667455466","answers":[{"choice_id":"4385139245"}]}]}]},"emitted_at":1674149672900} +{"stream":"survey_responses","data":{"id":"12731112612","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=tYfRsLpnvLXiDU1aSXTH5nIXnauCRjmyXNWWEYT8RsVkytyEn7W9JT8TX_2FQ_2FZXmm","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731112612","total_time":27,"date_modified":"2021-06-10T09:22:26+00:00","date_created":"2021-06-10T09:21:59+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731112612","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138593"}]},{"id":"667455351","answers":[{"choice_id":"4385138595"}]},{"id":"667455358","answers":[{"choice_id":"4385138625"}]},{"id":"667455370","answers":[{"choice_id":"4385138700"}]},{"id":"667455395","answers":[{"choice_id":"4385138779"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139014"}]},{"id":"667455439","answers":[{"choice_id":"4385139063"}]},{"id":"667455443","answers":[{"choice_id":"4385139110"}]},{"id":"667455463","answers":[{"choice_id":"4385139230"}]},{"id":"667455466","answers":[{"choice_id":"4385139245"}]}]}]},"emitted_at":1674149672901} +{"stream":"survey_responses","data":{"id":"12731129209","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Smvc_2Fhq34btK33i0b1sGxYeWInTkfyhJ_2BYMIBz_2B0I9Z2ZIyvlPNu3h_2B65f84DuA0","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731129209","total_time":27,"date_modified":"2021-06-10T09:30:08+00:00","date_created":"2021-06-10T09:29:41+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731129209","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138588"}]},{"id":"667455351","answers":[{"choice_id":"4385138597"}]},{"id":"667455358","answers":[{"choice_id":"4385138622"}]},{"id":"667455370","answers":[{"choice_id":"4385138704"}]},{"id":"667455395","answers":[{"choice_id":"4385138779"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139015"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139111"}]},{"id":"667455463","answers":[{"choice_id":"4385139234"}]},{"id":"667455466","answers":[{"choice_id":"4385139244"}]}]}]},"emitted_at":1674149672903} +{"stream":"survey_responses","data":{"id":"12731147035","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=U9JFMHqI683O1sqxW8mLF_2FgU_2F7fYGjSSm6LScE6pu2LDPRKAAVQXvZThLKDp2GXJ","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731147035","total_time":27,"date_modified":"2021-06-10T09:37:50+00:00","date_created":"2021-06-10T09:37:23+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731147035","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138589"}]},{"id":"667455351","answers":[{"choice_id":"4385138595"}]},{"id":"667455358","answers":[{"choice_id":"4385138625"}]},{"id":"667455370","answers":[{"choice_id":"4385138703"}]},{"id":"667455395","answers":[{"choice_id":"4385138781"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139017"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139110"}]},{"id":"667455463","answers":[{"choice_id":"4385139236"}]},{"id":"667455466","answers":[{"choice_id":"4385139245"}]}]}]},"emitted_at":1674149672904} +{"stream":"survey_responses","data":{"id":"12731164403","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=0jJiVT47Abo_2BkHRNm2_2FqakaCDR5LNaVs9r5z_2BNCgUb1UPEiUm95gFyEF3xtdkYv3","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731164403","total_time":27,"date_modified":"2021-06-10T09:45:34+00:00","date_created":"2021-06-10T09:45:06+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731164403","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138593"}]},{"id":"667455351","answers":[{"choice_id":"4385138600"}]},{"id":"667455358","answers":[{"choice_id":"4385138626"}]},{"id":"667455370","answers":[{"choice_id":"4385138701"}]},{"id":"667455395","answers":[{"choice_id":"4385138779"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139018"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139235"}]},{"id":"667455466","answers":[{"choice_id":"4385139245"}]}]}]},"emitted_at":1674149672906} +{"stream":"survey_responses","data":{"id":"12731181688","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=UQZSADafI1w57hYP_2FS2NflQKw4HeCD0bqS8NFrI480xqhT_2BmBKvsbhwZESEP6bWH","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731181688","total_time":33,"date_modified":"2021-06-10T09:53:29+00:00","date_created":"2021-06-10T09:52:55+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731181688","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138592"}]},{"id":"667455351","answers":[{"choice_id":"4385138598"}]},{"id":"667455358","answers":[{"choice_id":"4385138622"}]},{"id":"667455370","answers":[{"choice_id":"4385138707"}]},{"id":"667455395","answers":[{"choice_id":"4385138779"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139013"}]},{"id":"667455439","answers":[{"choice_id":"4385139062"}]},{"id":"667455443","answers":[{"choice_id":"4385139112"}]},{"id":"667455463","answers":[{"choice_id":"4385139230"}]},{"id":"667455466","answers":[{"choice_id":"4385139246"}]}]}]},"emitted_at":1674149672907} +{"stream":"survey_responses","data":{"id":"12731200697","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Z_2FtAEFehOtxFbKh3vENz8bUgBufRs3dp1FPH_2BaixcDbpWdxRX3s0ydAEfVu_2F_2FV9k","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731200697","total_time":27,"date_modified":"2021-06-10T10:01:55+00:00","date_created":"2021-06-10T10:01:27+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731200697","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138589"}]},{"id":"667455351","answers":[{"choice_id":"4385138598"}]},{"id":"667455358","answers":[{"choice_id":"4385138622"}]},{"id":"667455370","answers":[{"choice_id":"4385138706"}]},{"id":"667455395","answers":[{"choice_id":"4385138779"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139013"}]},{"id":"667455439","answers":[{"choice_id":"4385139063"}]},{"id":"667455443","answers":[{"choice_id":"4385139112"}]},{"id":"667455463","answers":[{"choice_id":"4385139233"}]},{"id":"667455466","answers":[{"choice_id":"4385139246"}]}]}]},"emitted_at":1674149672909} +{"stream":"survey_responses","data":{"id":"12731221002","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=YYEQ9YPblwXypUXP9UsD2QOQI_2B52u8EQSph1_2FmToJDM9mtFZbqeiOLVv8CbSN_2BdL","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731221002","total_time":27,"date_modified":"2021-06-10T10:09:45+00:00","date_created":"2021-06-10T10:09:18+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731221002","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138592"}]},{"id":"667455351","answers":[{"choice_id":"4385138600"}]},{"id":"667455358","answers":[{"choice_id":"4385138620"}]},{"id":"667455370","answers":[{"choice_id":"4385138702"}]},{"id":"667455395","answers":[{"choice_id":"4385138779"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139017"}]},{"id":"667455439","answers":[{"choice_id":"4385139062"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139233"}]},{"id":"667455466","answers":[{"choice_id":"4385139246"}]}]}]},"emitted_at":1674149672910} +{"stream":"survey_responses","data":{"id":"12731240798","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=4ZdZmIl45awCiUkNXcRb9vC0pYIZMfHtCv3apho2x9McRs1lDMv5yNnqz4z3VnSP","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731240798","total_time":27,"date_modified":"2021-06-10T10:17:43+00:00","date_created":"2021-06-10T10:17:16+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731240798","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138590"}]},{"id":"667455351","answers":[{"choice_id":"4385138600"}]},{"id":"667455358","answers":[{"choice_id":"4385138620"}]},{"id":"667455370","answers":[{"choice_id":"4385138703"}]},{"id":"667455395","answers":[{"choice_id":"4385138780"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139018"}]},{"id":"667455439","answers":[{"choice_id":"4385139062"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139230"}]},{"id":"667455466","answers":[{"choice_id":"4385139244"}]}]}]},"emitted_at":1674149672912} +{"stream":"survey_responses","data":{"id":"12731258961","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=emSG54_2BrHmGYvPyc21uSnPZeh8nU2iPahv_2B21isNydKP_2Bl4t3C_2B821nvNucSSxD_2F","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731258961","total_time":27,"date_modified":"2021-06-10T10:25:19+00:00","date_created":"2021-06-10T10:24:52+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731258961","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138588"}]},{"id":"667455351","answers":[{"choice_id":"4385138596"}]},{"id":"667455358","answers":[{"choice_id":"4385138624"}]},{"id":"667455370","answers":[{"choice_id":"4385138701"}]},{"id":"667455395","answers":[{"choice_id":"4385138780"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139016"}]},{"id":"667455439","answers":[{"choice_id":"4385139062"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139235"}]},{"id":"667455466","answers":[{"choice_id":"4385139245"}]}]}]},"emitted_at":1674149672913} +{"stream":"survey_responses","data":{"id":"12731278204","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=IqIG55XKRRDg9SlyFaGnS3M3bEcCu3Kc0adBsNxgJoXgsm_2FSsAZO5dQiHmAg137N","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731278204","total_time":29,"date_modified":"2021-06-10T10:33:09+00:00","date_created":"2021-06-10T10:32:40+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731278204","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138589"}]},{"id":"667455351","answers":[{"choice_id":"4385138596"}]},{"id":"667455358","answers":[{"choice_id":"4385138621"}]},{"id":"667455370","answers":[{"choice_id":"4385138705"}]},{"id":"667455395","answers":[{"choice_id":"4385138780"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139016"}]},{"id":"667455439","answers":[{"choice_id":"4385139063"}]},{"id":"667455443","answers":[{"choice_id":"4385139113"}]},{"id":"667455463","answers":[{"choice_id":"4385139232"}]},{"id":"667455466","answers":[{"choice_id":"4385139244"}]}]}]},"emitted_at":1674149672914} +{"stream":"survey_responses","data":{"id":"12731297693","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=4YsTEO_2Ft1AqmjnchtBZcCuBm0IyfVnOc8GnFYBmeTI3DsacLLtX6HINSLOXrSTvD","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731297693","total_time":27,"date_modified":"2021-06-10T10:40:58+00:00","date_created":"2021-06-10T10:40:30+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731297693","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138588"}]},{"id":"667455351","answers":[{"choice_id":"4385138598"}]},{"id":"667455358","answers":[{"choice_id":"4385138626"}]},{"id":"667455370","answers":[{"choice_id":"4385138704"}]},{"id":"667455395","answers":[{"choice_id":"4385138780"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139015"}]},{"id":"667455439","answers":[{"choice_id":"4385139063"}]},{"id":"667455443","answers":[{"choice_id":"4385139111"}]},{"id":"667455463","answers":[{"choice_id":"4385139230"}]},{"id":"667455466","answers":[{"choice_id":"4385139244"}]}]}]},"emitted_at":1674149672916} +{"stream":"survey_responses","data":{"id":"12731317951","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=0MbtsVOF4vEh5Xcf2H_2B4YhWcgeBtjnt_2BlJxPWFG88HIYuNIOdDcQkUMEv2VCZHUT","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731317951","total_time":27,"date_modified":"2021-06-10T10:49:06+00:00","date_created":"2021-06-10T10:48:39+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731317951","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138589"}]},{"id":"667455351","answers":[{"choice_id":"4385138596"}]},{"id":"667455358","answers":[{"choice_id":"4385138624"}]},{"id":"667455370","answers":[{"choice_id":"4385138702"}]},{"id":"667455395","answers":[{"choice_id":"4385138779"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139018"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139109"}]},{"id":"667455463","answers":[{"choice_id":"4385139236"}]},{"id":"667455466","answers":[{"choice_id":"4385139244"}]}]}]},"emitted_at":1674149672917} +{"stream":"survey_responses","data":{"id":"12731336744","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=jRZyZbcPITg018MLWZvCHAcG0IsxU_2BF2d4PQO0uZu8xhWEPv58hIqjKkEBTk1g1x","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731336744","total_time":27,"date_modified":"2021-06-10T10:56:40+00:00","date_created":"2021-06-10T10:56:13+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731336744","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138591"}]},{"id":"667455351","answers":[{"choice_id":"4385138596"}]},{"id":"667455358","answers":[{"choice_id":"4385138623"}]},{"id":"667455370","answers":[{"choice_id":"4385138702"}]},{"id":"667455395","answers":[{"choice_id":"4385138781"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139016"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139113"}]},{"id":"667455463","answers":[{"choice_id":"4385139234"}]},{"id":"667455466","answers":[{"choice_id":"4385139246"}]}]}]},"emitted_at":1674149672918} +{"stream":"survey_responses","data":{"id":"12731356183","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843442","survey_id":"307784863","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=j2Vv3hWWCKKX8TGm3kD6g4UQCdPiw0tyfJlXlm3Yr4aHlHW_2FZ_2FCSgfXWR8mLWGn0","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XGwAs0GsZ1qsocisThgUFPk0_3D?respondent_id=12731356183","total_time":28,"date_modified":"2021-06-10T11:04:28+00:00","date_created":"2021-06-10T11:04:00+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784863/responses/12731356183","pages":[{"id":"168830093","questions":[]},{"id":"168830094","questions":[{"id":"667455348","answers":[{"choice_id":"4385138593"}]},{"id":"667455351","answers":[{"choice_id":"4385138600"}]},{"id":"667455358","answers":[{"choice_id":"4385138621"}]},{"id":"667455370","answers":[{"choice_id":"4385138702"}]},{"id":"667455395","answers":[{"choice_id":"4385138782"}]}]},{"id":"168830108","questions":[{"id":"667455427","answers":[{"choice_id":"4385139018"}]},{"id":"667455439","answers":[{"choice_id":"4385139064"}]},{"id":"667455443","answers":[{"choice_id":"4385139110"}]},{"id":"667455463","answers":[{"choice_id":"4385139233"}]},{"id":"667455466","answers":[{"choice_id":"4385139244"}]}]}]},"emitted_at":1674149672919} +{"stream":"survey_responses","data":{"id":"12731028687","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=dUjh6A_2FaiaLmSiByVq0EnrrvhqLUItqI0TokJUP8jl9SbUi5cd6hNui1hNqGv56Z","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731028687","total_time":33,"date_modified":"2021-06-10T08:40:08+00:00","date_created":"2021-06-10T08:39:35+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731028687","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137907"}]},{"id":"667455240","answers":[{"choice_id":"4385137926"}]},{"id":"667455243","answers":[{"choice_id":"4385137932"}]},{"id":"667455245","answers":[{"choice_id":"4385137947"}]},{"id":"667455263","answers":[{"choice_id":"4385138061"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138109"}]},{"id":"667455272","answers":[{"choice_id":"4385138133"}]},{"id":"667455276","answers":[{"choice_id":"4385138157"}]},{"id":"667455290","answers":[{"choice_id":"4385138210"}]},{"id":"667455293","answers":[{"choice_id":"4385138240"}]}]}]},"emitted_at":1674149674733} +{"stream":"survey_responses","data":{"id":"12731036487","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=5ir6yV1yx1xcxnDqd5CbKT7hxkDCbqeG_2BHctWsXeZb015fsixx9pWXx0NgTuAnPh","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731036487","total_time":31,"date_modified":"2021-06-10T08:44:28+00:00","date_created":"2021-06-10T08:43:56+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731036487","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137911"}]},{"id":"667455240","answers":[{"choice_id":"4385137926"}]},{"id":"667455243","answers":[{"choice_id":"4385137935"}]},{"id":"667455245","answers":[{"choice_id":"4385137946"}]},{"id":"667455263","answers":[{"choice_id":"4385138064"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138110"}]},{"id":"667455272","answers":[{"choice_id":"4385138126"}]},{"id":"667455276","answers":[{"choice_id":"4385138156"}]},{"id":"667455290","answers":[{"choice_id":"4385138210"}]},{"id":"667455293","answers":[{"choice_id":"4385138243"}]}]}]},"emitted_at":1674149674733} +{"stream":"survey_responses","data":{"id":"12731050647","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=5b_2BmMZNzhREunXwy6FMGNiacjaGpQeXb3F9yW3dcaVweZLGQY8t0kgV3XBTUneNG","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731050647","total_time":31,"date_modified":"2021-06-10T08:52:13+00:00","date_created":"2021-06-10T08:51:41+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731050647","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137907"}]},{"id":"667455240","answers":[{"choice_id":"4385137926"}]},{"id":"667455243","answers":[{"choice_id":"4385137933"}]},{"id":"667455245","answers":[{"choice_id":"4385137949"}]},{"id":"667455263","answers":[{"choice_id":"4385138063"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138108"}]},{"id":"667455272","answers":[{"choice_id":"4385138126"}]},{"id":"667455276","answers":[{"choice_id":"4385138156"}]},{"id":"667455290","answers":[{"choice_id":"4385138216"}]},{"id":"667455293","answers":[{"choice_id":"4385138243"}]}]}]},"emitted_at":1674149674734} +{"stream":"survey_responses","data":{"id":"12731065101","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ivYcxChrgUjC39ad0me9CZw6BmVAkTQjhWy6e7bR1QV_2BZ7rOJIplHeJnM7IdV0ev","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731065101","total_time":31,"date_modified":"2021-06-10T08:59:55+00:00","date_created":"2021-06-10T08:59:24+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731065101","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137908"}]},{"id":"667455240","answers":[{"choice_id":"4385137925"}]},{"id":"667455243","answers":[{"choice_id":"4385137933"}]},{"id":"667455245","answers":[{"choice_id":"4385137949"}]},{"id":"667455263","answers":[{"choice_id":"4385138061"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138113"}]},{"id":"667455272","answers":[{"choice_id":"4385138131"}]},{"id":"667455276","answers":[{"choice_id":"4385138155"}]},{"id":"667455290","answers":[{"choice_id":"4385138216"}]},{"id":"667455293","answers":[{"choice_id":"4385138243"}]}]}]},"emitted_at":1674149674734} +{"stream":"survey_responses","data":{"id":"12731080861","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=3uxM3bC1ju6y0ZbYbgP_2BvgFNEF0MBf07Z1sR5msqxiFnqdE8BnFPnrip62Dyzq_2FJ","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731080861","total_time":31,"date_modified":"2021-06-10T09:07:39+00:00","date_created":"2021-06-10T09:07:07+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731080861","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137906"}]},{"id":"667455240","answers":[{"choice_id":"4385137924"}]},{"id":"667455243","answers":[{"choice_id":"4385137931"}]},{"id":"667455245","answers":[{"choice_id":"4385137944"}]},{"id":"667455263","answers":[{"choice_id":"4385138061"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138111"}]},{"id":"667455272","answers":[{"choice_id":"4385138129"}]},{"id":"667455276","answers":[{"choice_id":"4385138156"}]},{"id":"667455290","answers":[{"choice_id":"4385138209"}]},{"id":"667455293","answers":[{"choice_id":"4385138243"}]}]}]},"emitted_at":1674149674734} +{"stream":"survey_responses","data":{"id":"12731097254","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=zCaGCrPMhDj216XESYkQCRoFWd5JT94Z_2F_2Bns224Ht4yvHiBMzA0R869PAJ_2FrE_2F_2BS","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731097254","total_time":31,"date_modified":"2021-06-10T09:15:24+00:00","date_created":"2021-06-10T09:14:52+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731097254","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137904"}]},{"id":"667455240","answers":[{"choice_id":"4385137926"}]},{"id":"667455243","answers":[{"choice_id":"4385137936"}]},{"id":"667455245","answers":[{"choice_id":"4385137950"}]},{"id":"667455263","answers":[{"choice_id":"4385138062"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138110"}]},{"id":"667455272","answers":[{"choice_id":"4385138131"}]},{"id":"667455276","answers":[{"choice_id":"4385138155"}]},{"id":"667455290","answers":[{"choice_id":"4385138216"}]},{"id":"667455293","answers":[{"choice_id":"4385138239"}]}]}]},"emitted_at":1674149674735} +{"stream":"survey_responses","data":{"id":"12731113718","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=VoxvgtLVPESmmstl7tMZG_2BuMDM0Aa9E5fCEa86a_2BuXZa6pilvyY520S9G1tWgrRY","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731113718","total_time":31,"date_modified":"2021-06-10T09:23:02+00:00","date_created":"2021-06-10T09:22:30+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731113718","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137907"}]},{"id":"667455240","answers":[{"choice_id":"4385137925"}]},{"id":"667455243","answers":[{"choice_id":"4385137935"}]},{"id":"667455245","answers":[{"choice_id":"4385137949"}]},{"id":"667455263","answers":[{"choice_id":"4385138063"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138110"}]},{"id":"667455272","answers":[{"choice_id":"4385138130"}]},{"id":"667455276","answers":[{"choice_id":"4385138156"}]},{"id":"667455290","answers":[{"choice_id":"4385138210"}]},{"id":"667455293","answers":[{"choice_id":"4385138241"}]}]}]},"emitted_at":1674149674735} +{"stream":"survey_responses","data":{"id":"12731130369","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=z7UD89cfARngMPT8rraMXX6AgkCQ7ffFPZ0s_2BXsx7CQathuufUT_2FM9g_2B2Y8fjZzA","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731130369","total_time":31,"date_modified":"2021-06-10T09:30:44+00:00","date_created":"2021-06-10T09:30:13+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731130369","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137905"}]},{"id":"667455240","answers":[{"choice_id":"4385137927"}]},{"id":"667455243","answers":[{"choice_id":"4385137934"}]},{"id":"667455245","answers":[{"choice_id":"4385137947"}]},{"id":"667455263","answers":[{"choice_id":"4385138064"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138111"}]},{"id":"667455272","answers":[{"choice_id":"4385138130"}]},{"id":"667455276","answers":[{"choice_id":"4385138155"}]},{"id":"667455290","answers":[{"choice_id":"4385138213"}]},{"id":"667455293","answers":[{"choice_id":"4385138239"}]}]}]},"emitted_at":1674149674735} +{"stream":"survey_responses","data":{"id":"12731148248","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ju0hkPiuicpj80ml6Hl_2F22nPizQlWQLGiYwxc_2FDGxTXzgomNhfw66UPrCE0D636O","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731148248","total_time":33,"date_modified":"2021-06-10T09:38:28+00:00","date_created":"2021-06-10T09:37:55+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731148248","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137907"}]},{"id":"667455240","answers":[{"choice_id":"4385137927"}]},{"id":"667455243","answers":[{"choice_id":"4385137936"}]},{"id":"667455245","answers":[{"choice_id":"4385137949"}]},{"id":"667455263","answers":[{"choice_id":"4385138062"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138112"}]},{"id":"667455272","answers":[{"choice_id":"4385138130"}]},{"id":"667455276","answers":[{"choice_id":"4385138157"}]},{"id":"667455290","answers":[{"choice_id":"4385138214"}]},{"id":"667455293","answers":[{"choice_id":"4385138242"}]}]}]},"emitted_at":1674149674735} +{"stream":"survey_responses","data":{"id":"12731165533","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=CJNhekEYhzbzSqz1R0VHxVjTmJ866MvLYw4aVPGTNOnsy33BOg1S1_2F_2Faesq41w0h","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731165533","total_time":32,"date_modified":"2021-06-10T09:46:10+00:00","date_created":"2021-06-10T09:45:38+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731165533","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137909"}]},{"id":"667455240","answers":[{"choice_id":"4385137927"}]},{"id":"667455243","answers":[{"choice_id":"4385137932"}]},{"id":"667455245","answers":[{"choice_id":"4385137945"}]},{"id":"667455263","answers":[{"choice_id":"4385138062"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138110"}]},{"id":"667455272","answers":[{"choice_id":"4385138128"}]},{"id":"667455276","answers":[{"choice_id":"4385138156"}]},{"id":"667455290","answers":[{"choice_id":"4385138213"}]},{"id":"667455293","answers":[{"choice_id":"4385138240"}]}]}]},"emitted_at":1674149674736} +{"stream":"survey_responses","data":{"id":"12731183192","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=bEWAYVF9toetHEI2_2BOwwwWoYM7U4BuBikNpbjp7LRt5pr8geoSPYOEqTu3ySeLJ0","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731183192","total_time":35,"date_modified":"2021-06-10T09:54:12+00:00","date_created":"2021-06-10T09:53:36+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731183192","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137911"}]},{"id":"667455240","answers":[{"choice_id":"4385137924"}]},{"id":"667455243","answers":[{"choice_id":"4385137935"}]},{"id":"667455245","answers":[{"choice_id":"4385137949"}]},{"id":"667455263","answers":[{"choice_id":"4385138063"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138111"}]},{"id":"667455272","answers":[{"choice_id":"4385138127"}]},{"id":"667455276","answers":[{"choice_id":"4385138156"}]},{"id":"667455290","answers":[{"choice_id":"4385138216"}]},{"id":"667455293","answers":[{"choice_id":"4385138241"}]}]}]},"emitted_at":1674149674736} +{"stream":"survey_responses","data":{"id":"12731202203","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=cVfxg1YUnkHWG5xh95O_2FZH6JrXJKyH7dK1jz4klmqpr6kkJW4Nyg6pAF9RU6K8Yo","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731202203","total_time":33,"date_modified":"2021-06-10T10:02:33+00:00","date_created":"2021-06-10T10:02:00+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731202203","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137908"}]},{"id":"667455240","answers":[{"choice_id":"4385137925"}]},{"id":"667455243","answers":[{"choice_id":"4385137932"}]},{"id":"667455245","answers":[{"choice_id":"4385137947"}]},{"id":"667455263","answers":[{"choice_id":"4385138064"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138109"}]},{"id":"667455272","answers":[{"choice_id":"4385138133"}]},{"id":"667455276","answers":[{"choice_id":"4385138156"}]},{"id":"667455290","answers":[{"choice_id":"4385138214"}]},{"id":"667455293","answers":[{"choice_id":"4385138243"}]}]}]},"emitted_at":1674149674736} +{"stream":"survey_responses","data":{"id":"12731222304","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=YIMZ6ZxwVSC8E_2FINoIUPvqiJVxX2_2B7h72mIiWrB82xJdDZqY_2BGZdCN_2FCfsiwQr_2Bv","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731222304","total_time":31,"date_modified":"2021-06-10T10:10:21+00:00","date_created":"2021-06-10T10:09:50+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731222304","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137909"}]},{"id":"667455240","answers":[{"choice_id":"4385137925"}]},{"id":"667455243","answers":[{"choice_id":"4385137937"}]},{"id":"667455245","answers":[{"choice_id":"4385137948"}]},{"id":"667455263","answers":[{"choice_id":"4385138062"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138108"}]},{"id":"667455272","answers":[{"choice_id":"4385138131"}]},{"id":"667455276","answers":[{"choice_id":"4385138157"}]},{"id":"667455290","answers":[{"choice_id":"4385138209"}]},{"id":"667455293","answers":[{"choice_id":"4385138243"}]}]}]},"emitted_at":1674149674737} +{"stream":"survey_responses","data":{"id":"12731242020","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Qg5RZVMhJ6CDLIoNt_2Fdza6f_2FQJjxJXII1xxBSj3_2Fq6BnYaKChCZI73piSP5nhUtB","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731242020","total_time":31,"date_modified":"2021-06-10T10:18:19+00:00","date_created":"2021-06-10T10:17:48+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731242020","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137904"}]},{"id":"667455240","answers":[{"choice_id":"4385137924"}]},{"id":"667455243","answers":[{"choice_id":"4385137932"}]},{"id":"667455245","answers":[{"choice_id":"4385137948"}]},{"id":"667455263","answers":[{"choice_id":"4385138062"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138109"}]},{"id":"667455272","answers":[{"choice_id":"4385138127"}]},{"id":"667455276","answers":[{"choice_id":"4385138155"}]},{"id":"667455290","answers":[{"choice_id":"4385138211"}]},{"id":"667455293","answers":[{"choice_id":"4385138239"}]}]}]},"emitted_at":1674149674737} +{"stream":"survey_responses","data":{"id":"12731260237","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=mm7m2qJMFmTa3oybMk65fiRc3YyuaqIC4txcJF43fNUph71wneRBif0eIJvUBTcs","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731260237","total_time":31,"date_modified":"2021-06-10T10:25:55+00:00","date_created":"2021-06-10T10:25:23+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731260237","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137906"}]},{"id":"667455240","answers":[{"choice_id":"4385137926"}]},{"id":"667455243","answers":[{"choice_id":"4385137932"}]},{"id":"667455245","answers":[{"choice_id":"4385137948"}]},{"id":"667455263","answers":[{"choice_id":"4385138062"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138112"}]},{"id":"667455272","answers":[{"choice_id":"4385138126"}]},{"id":"667455276","answers":[{"choice_id":"4385138157"}]},{"id":"667455290","answers":[{"choice_id":"4385138211"}]},{"id":"667455293","answers":[{"choice_id":"4385138241"}]}]}]},"emitted_at":1674149674737} +{"stream":"survey_responses","data":{"id":"12731279578","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=FEjSAqhsmwQRvI0nIbXznSQrW_2Fs9Zok9WSmUIEpPh_2Ftrvxkif6aWXIcsv7S3npp4","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731279578","total_time":34,"date_modified":"2021-06-10T10:33:48+00:00","date_created":"2021-06-10T10:33:13+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731279578","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137911"}]},{"id":"667455240","answers":[{"choice_id":"4385137926"}]},{"id":"667455243","answers":[{"choice_id":"4385137934"}]},{"id":"667455245","answers":[{"choice_id":"4385137951"}]},{"id":"667455263","answers":[{"choice_id":"4385138062"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138113"}]},{"id":"667455272","answers":[{"choice_id":"4385138130"}]},{"id":"667455276","answers":[{"choice_id":"4385138156"}]},{"id":"667455290","answers":[{"choice_id":"4385138212"}]},{"id":"667455293","answers":[{"choice_id":"4385138241"}]}]}]},"emitted_at":1674149674738} +{"stream":"survey_responses","data":{"id":"12731299025","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=3IJV7_2FsHEFUvR3AFurcV71Uh5BITVe91sCc8NyxnqEaGN7SJCiiuPB87bmvoaGw1","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731299025","total_time":34,"date_modified":"2021-06-10T10:41:36+00:00","date_created":"2021-06-10T10:41:02+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731299025","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137905"}]},{"id":"667455240","answers":[{"choice_id":"4385137927"}]},{"id":"667455243","answers":[{"choice_id":"4385137936"}]},{"id":"667455245","answers":[{"choice_id":"4385137950"}]},{"id":"667455263","answers":[{"choice_id":"4385138062"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138109"}]},{"id":"667455272","answers":[{"choice_id":"4385138130"}]},{"id":"667455276","answers":[{"choice_id":"4385138157"}]},{"id":"667455290","answers":[{"choice_id":"4385138215"}]},{"id":"667455293","answers":[{"choice_id":"4385138239"}]}]}]},"emitted_at":1674149674738} +{"stream":"survey_responses","data":{"id":"12731319249","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=GlfLviGx8LUycI0kX0T8cF_2FFpkVAIQj5obyoRevuZv4czryRkMD2PZvND9Sb17Up","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731319249","total_time":33,"date_modified":"2021-06-10T10:49:44+00:00","date_created":"2021-06-10T10:49:11+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731319249","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137909"}]},{"id":"667455240","answers":[{"choice_id":"4385137924"}]},{"id":"667455243","answers":[{"choice_id":"4385137931"}]},{"id":"667455245","answers":[{"choice_id":"4385137944"}]},{"id":"667455263","answers":[{"choice_id":"4385138064"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138109"}]},{"id":"667455272","answers":[{"choice_id":"4385138133"}]},{"id":"667455276","answers":[{"choice_id":"4385138157"}]},{"id":"667455290","answers":[{"choice_id":"4385138210"}]},{"id":"667455293","answers":[{"choice_id":"4385138239"}]}]}]},"emitted_at":1674149674738} +{"stream":"survey_responses","data":{"id":"12731338028","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=H_2BVgWdKB0xr0jY94jPfEAo0VmKxhUUF4pufmYQx4fDmquorp1yOG5FlQBPgiHLrx","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731338028","total_time":31,"date_modified":"2021-06-10T10:57:15+00:00","date_created":"2021-06-10T10:56:44+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731338028","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137911"}]},{"id":"667455240","answers":[{"choice_id":"4385137927"}]},{"id":"667455243","answers":[{"choice_id":"4385137932"}]},{"id":"667455245","answers":[{"choice_id":"4385137950"}]},{"id":"667455263","answers":[{"choice_id":"4385138060"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138111"}]},{"id":"667455272","answers":[{"choice_id":"4385138131"}]},{"id":"667455276","answers":[{"choice_id":"4385138155"}]},{"id":"667455290","answers":[{"choice_id":"4385138215"}]},{"id":"667455293","answers":[{"choice_id":"4385138241"}]}]}]},"emitted_at":1674149674739} +{"stream":"survey_responses","data":{"id":"12731357558","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405829776","survey_id":"307784846","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=tfLWR7lVR8G3JC7jFc4srAqfLvwuFEvSW_2Ffbm1CZxKHZ6J8nad7_2FnXzcLHhgXchk","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG0D0cevwMQIvVNwWzg_2Bmm4o_3D?respondent_id=12731357558","total_time":31,"date_modified":"2021-06-10T11:05:04+00:00","date_created":"2021-06-10T11:04:32+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784846/responses/12731357558","pages":[{"id":"168830067","questions":[]},{"id":"168830068","questions":[{"id":"667455236","answers":[{"choice_id":"4385137904"}]},{"id":"667455240","answers":[{"choice_id":"4385137926"}]},{"id":"667455243","answers":[{"choice_id":"4385137932"}]},{"id":"667455245","answers":[{"choice_id":"4385137950"}]},{"id":"667455263","answers":[{"choice_id":"4385138060"}]}]},{"id":"168830074","questions":[{"id":"667455268","answers":[{"choice_id":"4385138108"}]},{"id":"667455272","answers":[{"choice_id":"4385138126"}]},{"id":"667455276","answers":[{"choice_id":"4385138155"}]},{"id":"667455290","answers":[{"choice_id":"4385138214"}]},{"id":"667455293","answers":[{"choice_id":"4385138240"}]}]}]},"emitted_at":1674149674739} +{"stream":"survey_responses","data":{"id":"12731029969","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=APV_2FZ7VTm09gZj5b0f0NUIlksURZJjTLWSe4fg4_2FRKA8y93l4UjzYAPkgAla3AIo","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731029969","total_time":32,"date_modified":"2021-06-10T08:40:52+00:00","date_created":"2021-06-10T08:40:19+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731029969","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138279"}]},{"id":"667455299","answers":[{"choice_id":"4385138286"}]},{"id":"667455301","answers":[{"choice_id":"4385138291"}]},{"id":"667455314","answers":[{"choice_id":"4385138316"}]},{"id":"667455318","answers":[{"choice_id":"4385138386"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138414"}]},{"id":"667455325","answers":[{"choice_id":"4385138427"}]},{"id":"667455328","answers":[{"choice_id":"4385138437"}]},{"id":"667455329","answers":[{"choice_id":"4385138442"}]},{"id":"667455332","answers":[{"choice_id":"4385138468"}]}]}]},"emitted_at":1674149675861} +{"stream":"survey_responses","data":{"id":"12731037636","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=iToNu2Xqp1PZ2VPT32fencmUbPumpf00lYTMhCdGbbG2LXZSZ277leTsfXYDwFtv","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731037636","total_time":32,"date_modified":"2021-06-10T08:45:07+00:00","date_created":"2021-06-10T08:44:34+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731037636","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138279"}]},{"id":"667455299","answers":[{"choice_id":"4385138286"}]},{"id":"667455301","answers":[{"choice_id":"4385138288"}]},{"id":"667455314","answers":[{"choice_id":"4385138315"}]},{"id":"667455318","answers":[{"choice_id":"4385138389"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138413"}]},{"id":"667455325","answers":[{"choice_id":"4385138424"}]},{"id":"667455328","answers":[{"choice_id":"4385138432"}]},{"id":"667455329","answers":[{"choice_id":"4385138446"}]},{"id":"667455332","answers":[{"choice_id":"4385138501"}]}]}]},"emitted_at":1674149675863} +{"stream":"survey_responses","data":{"id":"12731051876","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=QRhskGxFdS_2BJr5Lu32xTKbFyIMZUHZjCRh3x_2Bw039aa_2BRtw9tyy6pHa1Lf_2FC57ic","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731051876","total_time":32,"date_modified":"2021-06-10T08:52:52+00:00","date_created":"2021-06-10T08:52:19+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731051876","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138287"}]},{"id":"667455301","answers":[{"choice_id":"4385138294"}]},{"id":"667455314","answers":[{"choice_id":"4385138318"}]},{"id":"667455318","answers":[{"choice_id":"4385138386"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138416"}]},{"id":"667455325","answers":[{"choice_id":"4385138422"}]},{"id":"667455328","answers":[{"choice_id":"4385138439"}]},{"id":"667455329","answers":[{"choice_id":"4385138446"}]},{"id":"667455332","answers":[{"choice_id":"4385138500"}]}]}]},"emitted_at":1674149675865} +{"stream":"survey_responses","data":{"id":"12731066155","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=McbGtSUJW9mHgwplanqgtYWhK7utHcK1iZyh5FsyiMXjBFayK7UQxIRtfgwtM_2Bca","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731066155","total_time":31,"date_modified":"2021-06-10T09:00:33+00:00","date_created":"2021-06-10T09:00:01+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731066155","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138283"}]},{"id":"667455301","answers":[{"choice_id":"4385138293"}]},{"id":"667455314","answers":[{"choice_id":"4385138317"}]},{"id":"667455318","answers":[{"choice_id":"4385138386"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138414"}]},{"id":"667455325","answers":[{"choice_id":"4385138423"}]},{"id":"667455328","answers":[{"choice_id":"4385138438"}]},{"id":"667455329","answers":[{"choice_id":"4385138442"}]},{"id":"667455332","answers":[{"choice_id":"4385138502"}]}]}]},"emitted_at":1674149675866} +{"stream":"survey_responses","data":{"id":"12731082183","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=IG3sd3Y0qV_2FQGladjE04s9jje9y8SwVJC2bX5QbuekXXduCLZZ2TedtTVTZU5dGc","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731082183","total_time":32,"date_modified":"2021-06-10T09:08:18+00:00","date_created":"2021-06-10T09:07:46+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731082183","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138278"}]},{"id":"667455299","answers":[{"choice_id":"4385138284"}]},{"id":"667455301","answers":[{"choice_id":"4385138288"}]},{"id":"667455314","answers":[{"choice_id":"4385138318"}]},{"id":"667455318","answers":[{"choice_id":"4385138386"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138416"}]},{"id":"667455325","answers":[{"choice_id":"4385138423"}]},{"id":"667455328","answers":[{"choice_id":"4385138438"}]},{"id":"667455329","answers":[{"choice_id":"4385138446"}]},{"id":"667455332","answers":[{"choice_id":"4385138499"}]}]}]},"emitted_at":1674149675868} +{"stream":"survey_responses","data":{"id":"12731098436","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=MV4ZWqb4qCvpVsm9l8DE5bPr9uyUbMzuYGBxSnRcZ1REiHW2ugohyYyDG7vYEDPl","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731098436","total_time":31,"date_modified":"2021-06-10T09:16:00+00:00","date_created":"2021-06-10T09:15:28+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731098436","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138284"}]},{"id":"667455301","answers":[{"choice_id":"4385138291"}]},{"id":"667455314","answers":[{"choice_id":"4385138320"}]},{"id":"667455318","answers":[{"choice_id":"4385138389"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138414"}]},{"id":"667455325","answers":[{"choice_id":"4385138421"}]},{"id":"667455328","answers":[{"choice_id":"4385138439"}]},{"id":"667455329","answers":[{"choice_id":"4385138443"}]},{"id":"667455332","answers":[{"choice_id":"4385138501"}]}]}]},"emitted_at":1674149675869} +{"stream":"survey_responses","data":{"id":"12731115074","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=BHzC6lqHgVLzZ1lCVMXIDPuMoH8yVGnrQsGh6WbIIUI3nRO_2F6cMb_2BuTaApRu6hdt","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731115074","total_time":31,"date_modified":"2021-06-10T09:23:39+00:00","date_created":"2021-06-10T09:23:07+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731115074","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138287"}]},{"id":"667455301","answers":[{"choice_id":"4385138290"}]},{"id":"667455314","answers":[{"choice_id":"4385138318"}]},{"id":"667455318","answers":[{"choice_id":"4385138387"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138416"}]},{"id":"667455325","answers":[{"choice_id":"4385138422"}]},{"id":"667455328","answers":[{"choice_id":"4385138432"}]},{"id":"667455329","answers":[{"choice_id":"4385138441"}]},{"id":"667455332","answers":[{"choice_id":"4385138499"}]}]}]},"emitted_at":1674149675871} +{"stream":"survey_responses","data":{"id":"12731131693","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=WYN2n8yADqGUJHwNtkRzDB8UgTsiinkFRQKNlRO2tOl_2FgYSeg5AwgcAfpVBqPc9Z","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731131693","total_time":31,"date_modified":"2021-06-10T09:31:22+00:00","date_created":"2021-06-10T09:30:50+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731131693","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138278"}]},{"id":"667455299","answers":[{"choice_id":"4385138287"}]},{"id":"667455301","answers":[{"choice_id":"4385138292"}]},{"id":"667455314","answers":[{"choice_id":"4385138317"}]},{"id":"667455318","answers":[{"choice_id":"4385138387"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138414"}]},{"id":"667455325","answers":[{"choice_id":"4385138423"}]},{"id":"667455328","answers":[{"choice_id":"4385138438"}]},{"id":"667455329","answers":[{"choice_id":"4385138444"}]},{"id":"667455332","answers":[{"choice_id":"4385138503"}]}]}]},"emitted_at":1674149675872} +{"stream":"survey_responses","data":{"id":"12731149596","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=I4wWuuErezAO1McHSX4e_2FC_2BNPLPDMiVmc0o7Q21l2qpRsReL4GXorsYqqLman2mF","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731149596","total_time":31,"date_modified":"2021-06-10T09:39:04+00:00","date_created":"2021-06-10T09:38:32+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731149596","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138279"}]},{"id":"667455299","answers":[{"choice_id":"4385138286"}]},{"id":"667455301","answers":[{"choice_id":"4385138288"}]},{"id":"667455314","answers":[{"choice_id":"4385138319"}]},{"id":"667455318","answers":[{"choice_id":"4385138388"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138415"}]},{"id":"667455325","answers":[{"choice_id":"4385138422"}]},{"id":"667455328","answers":[{"choice_id":"4385138434"}]},{"id":"667455329","answers":[{"choice_id":"4385138444"}]},{"id":"667455332","answers":[{"choice_id":"4385138498"}]}]}]},"emitted_at":1674149675874} +{"stream":"survey_responses","data":{"id":"12731167001","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=oF11Z5EpZ0lcqLyzezPfZ7YyRd8_2FNkQHaVMTUl3_2B_2FvwfgV5z5JscZwGxgOXTCvE_2F","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731167001","total_time":32,"date_modified":"2021-06-10T09:46:50+00:00","date_created":"2021-06-10T09:46:17+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731167001","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138279"}]},{"id":"667455299","answers":[{"choice_id":"4385138282"}]},{"id":"667455301","answers":[{"choice_id":"4385138295"}]},{"id":"667455314","answers":[{"choice_id":"4385138320"}]},{"id":"667455318","answers":[{"choice_id":"4385138386"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138414"}]},{"id":"667455325","answers":[{"choice_id":"4385138426"}]},{"id":"667455328","answers":[{"choice_id":"4385138434"}]},{"id":"667455329","answers":[{"choice_id":"4385138441"}]},{"id":"667455332","answers":[{"choice_id":"4385138502"}]}]}]},"emitted_at":1674149675875} +{"stream":"survey_responses","data":{"id":"12731184662","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=2m4cTOSjC_2FTrSbvTeTRqC4CdH_2F10I0y0VrEPTPWCsU9zVgHoB7Jj9EFyjh7Eso8A","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731184662","total_time":35,"date_modified":"2021-06-10T09:54:53+00:00","date_created":"2021-06-10T09:54:17+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731184662","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138284"}]},{"id":"667455301","answers":[{"choice_id":"4385138292"}]},{"id":"667455314","answers":[{"choice_id":"4385138315"}]},{"id":"667455318","answers":[{"choice_id":"4385138386"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138412"}]},{"id":"667455325","answers":[{"choice_id":"4385138421"}]},{"id":"667455328","answers":[{"choice_id":"4385138438"}]},{"id":"667455329","answers":[{"choice_id":"4385138441"}]},{"id":"667455332","answers":[{"choice_id":"4385138498"}]}]}]},"emitted_at":1674149675877} +{"stream":"survey_responses","data":{"id":"12731204167","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=MDNWDmNrUDODNjQjATix_2BWBUiXJqVC8POKFh8fvebZujKwgJ_2B6XlCVEKCced6L16","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731204167","total_time":32,"date_modified":"2021-06-10T10:03:16+00:00","date_created":"2021-06-10T10:02:43+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731204167","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138279"}]},{"id":"667455299","answers":[{"choice_id":"4385138287"}]},{"id":"667455301","answers":[{"choice_id":"4385138292"}]},{"id":"667455314","answers":[{"choice_id":"4385138315"}]},{"id":"667455318","answers":[{"choice_id":"4385138388"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138414"}]},{"id":"667455325","answers":[{"choice_id":"4385138423"}]},{"id":"667455328","answers":[{"choice_id":"4385138432"}]},{"id":"667455329","answers":[{"choice_id":"4385138447"}]},{"id":"667455332","answers":[{"choice_id":"4385138499"}]}]}]},"emitted_at":1674149675878} +{"stream":"survey_responses","data":{"id":"12731223860","recipient_id":"","collection_mode":"default","response_status":"partial","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":["168830082","168830083","168830087"],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=cwttWQdofPxpfAkwREhinTUX2Ac_2BMviHT6jlan_2BWYlBpX3h0gEfYptMi_2F2sF_2FIut","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731223860","total_time":16,"date_modified":"2021-06-10T10:10:45+00:00","date_created":"2021-06-10T10:10:28+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731223860","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138279"}]},{"id":"667455299","answers":[{"choice_id":"4385138282"}]},{"id":"667455301","answers":[{"choice_id":"4385138292"}]},{"id":"667455314","answers":[{"choice_id":"4385138317"}]},{"id":"667455318","answers":[{"choice_id":"4385138388"}]}]},{"id":"168830087","questions":[]}]},"emitted_at":1674149675879} +{"stream":"survey_responses","data":{"id":"12731243435","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=kl6SOoj4lel7HllGtpDwHTPILQJujXr_2Bpkcndfg_2FPQpyHzOR6XWv1saPjDTiOeH4","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731243435","total_time":31,"date_modified":"2021-06-10T10:18:55+00:00","date_created":"2021-06-10T10:18:23+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731243435","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138283"}]},{"id":"667455301","answers":[{"choice_id":"4385138288"}]},{"id":"667455314","answers":[{"choice_id":"4385138317"}]},{"id":"667455318","answers":[{"choice_id":"4385138389"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138414"}]},{"id":"667455325","answers":[{"choice_id":"4385138426"}]},{"id":"667455328","answers":[{"choice_id":"4385138434"}]},{"id":"667455329","answers":[{"choice_id":"4385138441"}]},{"id":"667455332","answers":[{"choice_id":"4385138468"}]}]}]},"emitted_at":1674149675881} +{"stream":"survey_responses","data":{"id":"12731261675","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=5CaWLgB4g6FYPekVOqKYg2mpmDFcRgFD_2FvNGi7Xqozpk2f_2BA5WGRd_2F8q5jr1Jwan","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731261675","total_time":31,"date_modified":"2021-06-10T10:26:32+00:00","date_created":"2021-06-10T10:26:01+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731261675","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138282"}]},{"id":"667455301","answers":[{"choice_id":"4385138290"}]},{"id":"667455314","answers":[{"choice_id":"4385138315"}]},{"id":"667455318","answers":[{"choice_id":"4385138389"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138416"}]},{"id":"667455325","answers":[{"choice_id":"4385138423"}]},{"id":"667455328","answers":[{"choice_id":"4385138434"}]},{"id":"667455329","answers":[{"choice_id":"4385138445"}]},{"id":"667455332","answers":[{"choice_id":"4385138500"}]}]}]},"emitted_at":1674149675882} +{"stream":"survey_responses","data":{"id":"12731281414","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=q5Ky3UvnlTpc15S78mm8JQSFeuSBuv8iuZCnl9MZYl_2BB5nkG8L9uJmUl1JNNtwyv","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731281414","total_time":34,"date_modified":"2021-06-10T10:34:33+00:00","date_created":"2021-06-10T10:33:58+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731281414","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138279"}]},{"id":"667455299","answers":[{"choice_id":"4385138282"}]},{"id":"667455301","answers":[{"choice_id":"4385138293"}]},{"id":"667455314","answers":[{"choice_id":"4385138316"}]},{"id":"667455318","answers":[{"choice_id":"4385138388"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138412"}]},{"id":"667455325","answers":[{"choice_id":"4385138427"}]},{"id":"667455328","answers":[{"choice_id":"4385138439"}]},{"id":"667455329","answers":[{"choice_id":"4385138445"}]},{"id":"667455332","answers":[{"choice_id":"4385138468"}]}]}]},"emitted_at":1674149675884} +{"stream":"survey_responses","data":{"id":"12731300699","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ATEXrllobiYc9DU6PcEpkS_2F8617dJW0dLGMQupo4QwGEGwqFQJ7m6Bks7oWF7Rae","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731300699","total_time":34,"date_modified":"2021-06-10T10:42:18+00:00","date_created":"2021-06-10T10:41:43+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731300699","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138282"}]},{"id":"667455301","answers":[{"choice_id":"4385138295"}]},{"id":"667455314","answers":[{"choice_id":"4385138315"}]},{"id":"667455318","answers":[{"choice_id":"4385138386"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138416"}]},{"id":"667455325","answers":[{"choice_id":"4385138427"}]},{"id":"667455328","answers":[{"choice_id":"4385138433"}]},{"id":"667455329","answers":[{"choice_id":"4385138442"}]},{"id":"667455332","answers":[{"choice_id":"4385138503"}]}]}]},"emitted_at":1674149675885} +{"stream":"survey_responses","data":{"id":"12731320713","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=319qghptwfcFVSVtQrSzrw_2BQzR8BlHJbviMDirTnupaGrVddWmTDjhG7R3Tkvb5J","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731320713","total_time":31,"date_modified":"2021-06-10T10:50:19+00:00","date_created":"2021-06-10T10:49:48+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731320713","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138283"}]},{"id":"667455301","answers":[{"choice_id":"4385138293"}]},{"id":"667455314","answers":[{"choice_id":"4385138317"}]},{"id":"667455318","answers":[{"choice_id":"4385138386"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138415"}]},{"id":"667455325","answers":[{"choice_id":"4385138426"}]},{"id":"667455328","answers":[{"choice_id":"4385138433"}]},{"id":"667455329","answers":[{"choice_id":"4385138444"}]},{"id":"667455332","answers":[{"choice_id":"4385138499"}]}]}]},"emitted_at":1674149675886} +{"stream":"survey_responses","data":{"id":"12731339540","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=unN8NiMSyoHjiCeMXzhPxCruuBwPKAXbf1kk1TZxnnc04vi5qaipiErEFBUKU3Vw","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731339540","total_time":32,"date_modified":"2021-06-10T10:57:54+00:00","date_created":"2021-06-10T10:57:22+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731339540","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138287"}]},{"id":"667455301","answers":[{"choice_id":"4385138291"}]},{"id":"667455314","answers":[{"choice_id":"4385138318"}]},{"id":"667455318","answers":[{"choice_id":"4385138387"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138412"}]},{"id":"667455325","answers":[{"choice_id":"4385138426"}]},{"id":"667455328","answers":[{"choice_id":"4385138432"}]},{"id":"667455329","answers":[{"choice_id":"4385138444"}]},{"id":"667455332","answers":[{"choice_id":"4385138498"}]}]}]},"emitted_at":1674149675888} +{"stream":"survey_responses","data":{"id":"12731359116","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843460","survey_id":"307784856","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=t_2BHFU_2BkwbG0L8cOxkJuYSUIt0ArFixObCD15GpXjKrp4kEQv20jOpUIgPXB30R0f","analyze_url":"https://www.surveymonkey.com/analyze/browse/moGgts_2Bl1LYlJ1mbVw6XG6cfdBSOknoT0fzVp7iTUO4_3D?respondent_id=12731359116","total_time":32,"date_modified":"2021-06-10T11:05:43+00:00","date_created":"2021-06-10T11:05:11+00:00","href":"https://api.surveymonkey.com/v3/surveys/307784856/responses/12731359116","pages":[{"id":"168830082","questions":[]},{"id":"168830083","questions":[{"id":"667455297","answers":[{"choice_id":"4385138277"}]},{"id":"667455299","answers":[{"choice_id":"4385138284"}]},{"id":"667455301","answers":[{"choice_id":"4385138290"}]},{"id":"667455314","answers":[{"choice_id":"4385138319"}]},{"id":"667455318","answers":[{"choice_id":"4385138387"}]}]},{"id":"168830087","questions":[{"id":"667455323","answers":[{"choice_id":"4385138412"}]},{"id":"667455325","answers":[{"choice_id":"4385138426"}]},{"id":"667455328","answers":[{"choice_id":"4385138434"}]},{"id":"667455329","answers":[{"choice_id":"4385138441"}]},{"id":"667455332","answers":[{"choice_id":"4385138501"}]}]}]},"emitted_at":1674149675889} +{"stream":"survey_responses","data":{"id":"12731031048","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=oj7KuTDJShqSiV97LkSV6uvYXz_2BBmc1ocrvgJB_2F6EIN4dNLEz7QkUKli1frVW9z_2B","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731031048","total_time":32,"date_modified":"2021-06-10T08:41:28+00:00","date_created":"2021-06-10T08:40:56+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731031048","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172937"}]},{"id":"667461433","answers":[{"choice_id":"4385172950"}]},{"id":"667461439","answers":[{"choice_id":"4385172991"}]},{"id":"667461441","answers":[{"choice_id":"4385173023"}]},{"id":"667461444","answers":[{"choice_id":"4385173041"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173078"}]},{"id":"667461452","answers":[{"choice_id":"4385173088"}]},{"id":"667461454","answers":[{"choice_id":"4385173103"}]},{"id":"667461456","answers":[{"choice_id":"4385173115"}]},{"id":"667461462","answers":[{"choice_id":"4385173170"}]}]}]},"emitted_at":1674149677137} +{"stream":"survey_responses","data":{"id":"12731038731","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=NvnexeVe1TL2cbU10b8utpSHSxTK1HTwbsncQeCDCuIJKnwvRo58aul3yetztS1_2B","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731038731","total_time":31,"date_modified":"2021-06-10T08:45:43+00:00","date_created":"2021-06-10T08:45:11+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731038731","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172935"}]},{"id":"667461433","answers":[{"choice_id":"4385172953"}]},{"id":"667461439","answers":[{"choice_id":"4385172990"}]},{"id":"667461441","answers":[{"choice_id":"4385173021"}]},{"id":"667461444","answers":[{"choice_id":"4385173041"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173089"}]},{"id":"667461454","answers":[{"choice_id":"4385173104"}]},{"id":"667461456","answers":[{"choice_id":"4385173116"}]},{"id":"667461462","answers":[{"choice_id":"4385173170"}]}]}]},"emitted_at":1674149677139} +{"stream":"survey_responses","data":{"id":"12731053047","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=TWL1aXuGzW_2Bld3kwRCla449GewPFQF3JFwcpsO1LndH1s3tFfKtesgelUuLTCGR6","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731053047","total_time":31,"date_modified":"2021-06-10T08:53:29+00:00","date_created":"2021-06-10T08:52:57+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731053047","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172937"}]},{"id":"667461433","answers":[{"choice_id":"4385172948"}]},{"id":"667461439","answers":[{"choice_id":"4385172991"}]},{"id":"667461441","answers":[{"choice_id":"4385173020"}]},{"id":"667461444","answers":[{"choice_id":"4385173045"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173088"}]},{"id":"667461454","answers":[{"choice_id":"4385173105"}]},{"id":"667461456","answers":[{"choice_id":"4385173114"}]},{"id":"667461462","answers":[{"choice_id":"4385173168"}]}]}]},"emitted_at":1674149677141} +{"stream":"survey_responses","data":{"id":"12731067385","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=3aXaERIhrxNROtqwHMzJ7BQrVYzI9ua7E_2FxCsZfjUOxvEf88Av09k8zGLpOFLBw_2B","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731067385","total_time":31,"date_modified":"2021-06-10T09:01:09+00:00","date_created":"2021-06-10T09:00:37+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731067385","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172934"}]},{"id":"667461433","answers":[{"choice_id":"4385172953"}]},{"id":"667461439","answers":[{"choice_id":"4385172995"}]},{"id":"667461441","answers":[{"choice_id":"4385173022"}]},{"id":"667461444","answers":[{"choice_id":"4385173042"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173091"}]},{"id":"667461454","answers":[{"choice_id":"4385173104"}]},{"id":"667461456","answers":[{"choice_id":"4385173114"}]},{"id":"667461462","answers":[{"choice_id":"4385173168"}]}]}]},"emitted_at":1674149677143} +{"stream":"survey_responses","data":{"id":"12731083422","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=kmKEpAG_2FngBuSmfP0e49vf6Q2YDpzhvzQyHTBrwvk0ZeV8Na8b5Evuz7N4wEaQuN","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731083422","total_time":32,"date_modified":"2021-06-10T09:08:54+00:00","date_created":"2021-06-10T09:08:22+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731083422","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172932"}]},{"id":"667461433","answers":[{"choice_id":"4385172953"}]},{"id":"667461439","answers":[{"choice_id":"4385172990"}]},{"id":"667461441","answers":[{"choice_id":"4385173022"}]},{"id":"667461444","answers":[{"choice_id":"4385173042"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173078"}]},{"id":"667461452","answers":[{"choice_id":"4385173089"}]},{"id":"667461454","answers":[{"choice_id":"4385173105"}]},{"id":"667461456","answers":[{"choice_id":"4385173113"}]},{"id":"667461462","answers":[{"choice_id":"4385173169"}]}]}]},"emitted_at":1674149677144} +{"stream":"survey_responses","data":{"id":"12731099693","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=YgZuSogQMKDrPTmOoLetMqFtiUi_2BJHKxcATXloIoBnmzHLDvYmNSSoajIC4_2BX2qc","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731099693","total_time":31,"date_modified":"2021-06-10T09:16:36+00:00","date_created":"2021-06-10T09:16:04+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731099693","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172933"}]},{"id":"667461433","answers":[{"choice_id":"4385172951"}]},{"id":"667461439","answers":[{"choice_id":"4385172993"}]},{"id":"667461441","answers":[{"choice_id":"4385173023"}]},{"id":"667461444","answers":[{"choice_id":"4385173043"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173076"}]},{"id":"667461452","answers":[{"choice_id":"4385173090"}]},{"id":"667461454","answers":[{"choice_id":"4385173105"}]},{"id":"667461456","answers":[{"choice_id":"4385173113"}]},{"id":"667461462","answers":[{"choice_id":"4385173168"}]}]}]},"emitted_at":1674149677147} +{"stream":"survey_responses","data":{"id":"12731116372","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=w67tX9wQ238KZ8cKM0cnTSfg3hzhdt35TpCZfm6_2B7K6B_2F0VZpeEefqMTVZQXnuVe","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731116372","total_time":31,"date_modified":"2021-06-10T09:24:15+00:00","date_created":"2021-06-10T09:23:43+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731116372","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172932"}]},{"id":"667461433","answers":[{"choice_id":"4385172948"}]},{"id":"667461439","answers":[{"choice_id":"4385172990"}]},{"id":"667461441","answers":[{"choice_id":"4385173022"}]},{"id":"667461444","answers":[{"choice_id":"4385173046"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173089"}]},{"id":"667461454","answers":[{"choice_id":"4385173103"}]},{"id":"667461456","answers":[{"choice_id":"4385173117"}]},{"id":"667461462","answers":[{"choice_id":"4385173167"}]}]}]},"emitted_at":1674149677148} +{"stream":"survey_responses","data":{"id":"12731133155","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=KkixO6u45W2ICclAKrxKYNgJxrynUdDZxArXycLA_2FpZUBsG3FcMXHvqQmk3DsHGL","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731133155","total_time":31,"date_modified":"2021-06-10T09:31:58+00:00","date_created":"2021-06-10T09:31:27+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731133155","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172933"}]},{"id":"667461433","answers":[{"choice_id":"4385172948"}]},{"id":"667461439","answers":[{"choice_id":"4385172990"}]},{"id":"667461441","answers":[{"choice_id":"4385173022"}]},{"id":"667461444","answers":[{"choice_id":"4385173044"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173078"}]},{"id":"667461452","answers":[{"choice_id":"4385173090"}]},{"id":"667461454","answers":[{"choice_id":"4385173105"}]},{"id":"667461456","answers":[{"choice_id":"4385173118"}]},{"id":"667461462","answers":[{"choice_id":"4385173168"}]}]}]},"emitted_at":1674149677150} +{"stream":"survey_responses","data":{"id":"12731151051","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Ep0IYx019QcuhuuRrvANkBTw0Ti8WirkyKLpMo62qXxWHwkYGtgh9c143qYGmywG","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731151051","total_time":31,"date_modified":"2021-06-10T09:39:40+00:00","date_created":"2021-06-10T09:39:08+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731151051","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172937"}]},{"id":"667461433","answers":[{"choice_id":"4385172949"}]},{"id":"667461439","answers":[{"choice_id":"4385172993"}]},{"id":"667461441","answers":[{"choice_id":"4385173020"}]},{"id":"667461444","answers":[{"choice_id":"4385173046"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173076"}]},{"id":"667461452","answers":[{"choice_id":"4385173091"}]},{"id":"667461454","answers":[{"choice_id":"4385173105"}]},{"id":"667461456","answers":[{"choice_id":"4385173118"}]},{"id":"667461462","answers":[{"choice_id":"4385173169"}]}]}]},"emitted_at":1674149677151} +{"stream":"survey_responses","data":{"id":"12731168310","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=HS7SOSb9j2AarAA_2BdLKuhIUhWoas6e_2BtUPh9aNHRDTHOTwcnvASYUjIFJk2Aha4I","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731168310","total_time":31,"date_modified":"2021-06-10T09:47:26+00:00","date_created":"2021-06-10T09:46:54+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731168310","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172933"}]},{"id":"667461433","answers":[{"choice_id":"4385172955"}]},{"id":"667461439","answers":[{"choice_id":"4385172995"}]},{"id":"667461441","answers":[{"choice_id":"4385173020"}]},{"id":"667461444","answers":[{"choice_id":"4385173047"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173089"}]},{"id":"667461454","answers":[{"choice_id":"4385173106"}]},{"id":"667461456","answers":[{"choice_id":"4385173113"}]},{"id":"667461462","answers":[{"choice_id":"4385173168"}]}]}]},"emitted_at":1674149677153} +{"stream":"survey_responses","data":{"id":"12731186075","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Cc0IypCRFbsr7v94sQfKFHhIf_2FH89oCDUARL5wWkYsguNXp0zyA6DxHEdm_2BNMhJ_2F","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731186075","total_time":35,"date_modified":"2021-06-10T09:55:32+00:00","date_created":"2021-06-10T09:54:57+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731186075","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172932"}]},{"id":"667461433","answers":[{"choice_id":"4385172954"}]},{"id":"667461439","answers":[{"choice_id":"4385172992"}]},{"id":"667461441","answers":[{"choice_id":"4385173022"}]},{"id":"667461444","answers":[{"choice_id":"4385173041"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173078"}]},{"id":"667461452","answers":[{"choice_id":"4385173088"}]},{"id":"667461454","answers":[{"choice_id":"4385173104"}]},{"id":"667461456","answers":[{"choice_id":"4385173118"}]},{"id":"667461462","answers":[{"choice_id":"4385173169"}]}]}]},"emitted_at":1674149677155} +{"stream":"survey_responses","data":{"id":"12731205704","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=nuK5QZZCJUv9YoeVqOpq22Tt3VOETEzxSzV_2Fk4xjbEXXiwUUe6gMiDzLVDs1IWo_2F","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731205704","total_time":31,"date_modified":"2021-06-10T10:03:50+00:00","date_created":"2021-06-10T10:03:19+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731205704","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172933"}]},{"id":"667461433","answers":[{"choice_id":"4385172948"}]},{"id":"667461439","answers":[{"choice_id":"4385172995"}]},{"id":"667461441","answers":[{"choice_id":"4385173023"}]},{"id":"667461444","answers":[{"choice_id":"4385173045"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173090"}]},{"id":"667461454","answers":[{"choice_id":"4385173104"}]},{"id":"667461456","answers":[{"choice_id":"4385173115"}]},{"id":"667461462","answers":[{"choice_id":"4385173168"}]}]}]},"emitted_at":1674149677156} +{"stream":"survey_responses","data":{"id":"12731225522","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=E977wLXc6H_2BfVEbR4rzSs1q6JCgk1O_2BeQ5Sr2f_2BEeSGpDaPDGuslUALFqPRPlZDW","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731225522","total_time":31,"date_modified":"2021-06-10T10:11:38+00:00","date_created":"2021-06-10T10:11:06+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731225522","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172935"}]},{"id":"667461433","answers":[{"choice_id":"4385172951"}]},{"id":"667461439","answers":[{"choice_id":"4385172995"}]},{"id":"667461441","answers":[{"choice_id":"4385173022"}]},{"id":"667461444","answers":[{"choice_id":"4385173044"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173076"}]},{"id":"667461452","answers":[{"choice_id":"4385173091"}]},{"id":"667461454","answers":[{"choice_id":"4385173103"}]},{"id":"667461456","answers":[{"choice_id":"4385173118"}]},{"id":"667461462","answers":[{"choice_id":"4385173167"}]}]}]},"emitted_at":1674149677158} +{"stream":"survey_responses","data":{"id":"12731244870","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=3wY0IYE_2F0V4hMJO6Hd2YuVpnFpa2qt5soGs4KM6L3wgFb3k2BHMHLGtDGfFRCSfQ","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731244870","total_time":31,"date_modified":"2021-06-10T10:19:30+00:00","date_created":"2021-06-10T10:18:59+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731244870","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172932"}]},{"id":"667461433","answers":[{"choice_id":"4385172953"}]},{"id":"667461439","answers":[{"choice_id":"4385172993"}]},{"id":"667461441","answers":[{"choice_id":"4385173020"}]},{"id":"667461444","answers":[{"choice_id":"4385173040"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173091"}]},{"id":"667461454","answers":[{"choice_id":"4385173102"}]},{"id":"667461456","answers":[{"choice_id":"4385173116"}]},{"id":"667461462","answers":[{"choice_id":"4385173170"}]}]}]},"emitted_at":1674149677159} +{"stream":"survey_responses","data":{"id":"12731263131","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=StRkIgYeE5JwNLawW20wxeS_2FED8yP1J_2FHGw3CFhxGAXfN5lodZFoZ7n2CQYuFI4m","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731263131","total_time":31,"date_modified":"2021-06-10T10:27:08+00:00","date_created":"2021-06-10T10:26:37+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731263131","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172933"}]},{"id":"667461433","answers":[{"choice_id":"4385172951"}]},{"id":"667461439","answers":[{"choice_id":"4385172995"}]},{"id":"667461441","answers":[{"choice_id":"4385173021"}]},{"id":"667461444","answers":[{"choice_id":"4385173046"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173078"}]},{"id":"667461452","answers":[{"choice_id":"4385173089"}]},{"id":"667461454","answers":[{"choice_id":"4385173106"}]},{"id":"667461456","answers":[{"choice_id":"4385173118"}]},{"id":"667461462","answers":[{"choice_id":"4385173169"}]}]}]},"emitted_at":1674149677160} +{"stream":"survey_responses","data":{"id":"12731283031","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=J4cSx3UMmpoujky2cMr76AMl3Fslun9t7M7fr8ahVpWNGLwaW_2Bu8X3jQJkNttUcC","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731283031","total_time":34,"date_modified":"2021-06-10T10:35:10+00:00","date_created":"2021-06-10T10:34:36+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731283031","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172936"}]},{"id":"667461433","answers":[{"choice_id":"4385172948"}]},{"id":"667461439","answers":[{"choice_id":"4385172994"}]},{"id":"667461441","answers":[{"choice_id":"4385173021"}]},{"id":"667461444","answers":[{"choice_id":"4385173041"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173078"}]},{"id":"667461452","answers":[{"choice_id":"4385173090"}]},{"id":"667461454","answers":[{"choice_id":"4385173103"}]},{"id":"667461456","answers":[{"choice_id":"4385173118"}]},{"id":"667461462","answers":[{"choice_id":"4385173169"}]}]}]},"emitted_at":1674149677161} +{"stream":"survey_responses","data":{"id":"12731302340","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ILLNvXOj_2BrxmX_2By2ZRAmTpFslgCTd_2Feoso7P36bgr0_2FDMlf4kKul9iF6Ox4uTGnl","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731302340","total_time":34,"date_modified":"2021-06-10T10:42:56+00:00","date_created":"2021-06-10T10:42:22+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731302340","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172937"}]},{"id":"667461433","answers":[{"choice_id":"4385172951"}]},{"id":"667461439","answers":[{"choice_id":"4385172994"}]},{"id":"667461441","answers":[{"choice_id":"4385173022"}]},{"id":"667461444","answers":[{"choice_id":"4385173042"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173091"}]},{"id":"667461454","answers":[{"choice_id":"4385173105"}]},{"id":"667461456","answers":[{"choice_id":"4385173114"}]},{"id":"667461462","answers":[{"choice_id":"4385173167"}]}]}]},"emitted_at":1674149677162} +{"stream":"survey_responses","data":{"id":"12731322211","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=4UUhK9SRY_2FM3fA_2FqkLCL5mS8aBtccVCgcBQMTDfpX84us_2FZDOkgCVuCexjzjooNm","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731322211","total_time":31,"date_modified":"2021-06-10T10:50:54+00:00","date_created":"2021-06-10T10:50:23+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731322211","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172935"}]},{"id":"667461433","answers":[{"choice_id":"4385172950"}]},{"id":"667461439","answers":[{"choice_id":"4385172995"}]},{"id":"667461441","answers":[{"choice_id":"4385173023"}]},{"id":"667461444","answers":[{"choice_id":"4385173047"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173090"}]},{"id":"667461454","answers":[{"choice_id":"4385173102"}]},{"id":"667461456","answers":[{"choice_id":"4385173115"}]},{"id":"667461462","answers":[{"choice_id":"4385173170"}]}]}]},"emitted_at":1674149677163} +{"stream":"survey_responses","data":{"id":"12731341043","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=K51RB0BiJ39RT0TzevECB3iQ54AUAqtSYC5AGG_2Fb3JiEOIV74uOcQhGpP_2B9Xzumv","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731341043","total_time":32,"date_modified":"2021-06-10T10:58:30+00:00","date_created":"2021-06-10T10:57:58+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731341043","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172932"}]},{"id":"667461433","answers":[{"choice_id":"4385172949"}]},{"id":"667461439","answers":[{"choice_id":"4385172991"}]},{"id":"667461441","answers":[{"choice_id":"4385173020"}]},{"id":"667461444","answers":[{"choice_id":"4385173042"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173078"}]},{"id":"667461452","answers":[{"choice_id":"4385173088"}]},{"id":"667461454","answers":[{"choice_id":"4385173106"}]},{"id":"667461456","answers":[{"choice_id":"4385173114"}]},{"id":"667461462","answers":[{"choice_id":"4385173170"}]}]}]},"emitted_at":1674149677164} +{"stream":"survey_responses","data":{"id":"12731360608","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843624","survey_id":"307785388","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=joQxJxoDIf61JZdELXuIeomTgZquDM7T76ksdKdRUHFrgw1Him4UO_2BbCMcv0tXrC","analyze_url":"https://www.surveymonkey.com/analyze/browse/5QHdVgvFd_2Bn4fvmj_2F1aNtwM9q4oP_2B3VqXy_2BeJTiumoQ_3D?respondent_id=12731360608","total_time":31,"date_modified":"2021-06-10T11:06:19+00:00","date_created":"2021-06-10T11:05:47+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785388/responses/12731360608","pages":[{"id":"168831335","questions":[]},{"id":"168831336","questions":[{"id":"667461429","answers":[{"choice_id":"4385172934"}]},{"id":"667461433","answers":[{"choice_id":"4385172951"}]},{"id":"667461439","answers":[{"choice_id":"4385172991"}]},{"id":"667461441","answers":[{"choice_id":"4385173022"}]},{"id":"667461444","answers":[{"choice_id":"4385173040"}]}]},{"id":"168831340","questions":[{"id":"667461449","answers":[{"choice_id":"4385173077"}]},{"id":"667461452","answers":[{"choice_id":"4385173089"}]},{"id":"667461454","answers":[{"choice_id":"4385173103"}]},{"id":"667461456","answers":[{"choice_id":"4385173113"}]},{"id":"667461462","answers":[{"choice_id":"4385173167"}]}]}]},"emitted_at":1674149677165} +{"stream":"survey_responses","data":{"id":"12731032160","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=k5_2BoYr8L1JivcJuf1rH2GX_2BHMQI9F9YIVUvhVjaOj1ZaTr1AN4RrYerLAgE0dex5","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731032160","total_time":30,"date_modified":"2021-06-10T08:42:04+00:00","date_created":"2021-06-10T08:41:34+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731032160","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174702"}]},{"id":"667461777","answers":[{"choice_id":"4385174976"}]},{"id":"667461791","answers":[{"choice_id":"4385175058"}]},{"id":"667461794","answers":[{"choice_id":"4385175072"}]},{"id":"667461797","answers":[{"choice_id":"4385175099"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175117"}]},{"id":"667461805","answers":[{"choice_id":"4385175148"}]},{"id":"667461811","answers":[{"choice_id":"4385175199"}]},{"id":"667461833","answers":[{"choice_id":"4385175281"}]},{"id":"667461834","answers":[{"choice_id":"4385175295"}]}]}]},"emitted_at":1674149678650} +{"stream":"survey_responses","data":{"id":"12731039882","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=ueh4txTCmZOSY56GbXU_2BI53xrA9e5AOQ2EOFNrDgskH2E4ZDeJ4HcDXDLxDPUl8L","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731039882","total_time":29,"date_modified":"2021-06-10T08:46:16+00:00","date_created":"2021-06-10T08:45:47+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731039882","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174702"}]},{"id":"667461777","answers":[{"choice_id":"4385174972"}]},{"id":"667461791","answers":[{"choice_id":"4385175057"}]},{"id":"667461794","answers":[{"choice_id":"4385175072"}]},{"id":"667461797","answers":[{"choice_id":"4385175100"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175116"}]},{"id":"667461805","answers":[{"choice_id":"4385175148"}]},{"id":"667461811","answers":[{"choice_id":"4385175200"}]},{"id":"667461833","answers":[{"choice_id":"4385175283"}]},{"id":"667461834","answers":[{"choice_id":"4385175296"}]}]}]},"emitted_at":1674149678652} +{"stream":"survey_responses","data":{"id":"12731054183","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=6Utx9fT_2BqzHMlSdMksExZ0ph_2BvNfvb4CBc5S5YuvlA0kAV4HfmiM38IyZMLnHuoK","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731054183","total_time":29,"date_modified":"2021-06-10T08:54:02+00:00","date_created":"2021-06-10T08:53:33+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731054183","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174700"}]},{"id":"667461777","answers":[{"choice_id":"4385174971"}]},{"id":"667461791","answers":[{"choice_id":"4385175055"}]},{"id":"667461794","answers":[{"choice_id":"4385175070"}]},{"id":"667461797","answers":[{"choice_id":"4385175102"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175120"}]},{"id":"667461805","answers":[{"choice_id":"4385175152"}]},{"id":"667461811","answers":[{"choice_id":"4385175200"}]},{"id":"667461833","answers":[{"choice_id":"4385175284"}]},{"id":"667461834","answers":[{"choice_id":"4385175296"}]}]}]},"emitted_at":1674149678654} +{"stream":"survey_responses","data":{"id":"12731068596","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=Y_2BpA02_2Br_2B8t0cCK8Ua99SpTBk8YAUIPP5rIlV7TWE2bRQsxJ7Wy8nlQiPeSSH1Aj","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731068596","total_time":29,"date_modified":"2021-06-10T09:01:43+00:00","date_created":"2021-06-10T09:01:13+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731068596","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174700"}]},{"id":"667461777","answers":[{"choice_id":"4385174974"}]},{"id":"667461791","answers":[{"choice_id":"4385175058"}]},{"id":"667461794","answers":[{"choice_id":"4385175070"}]},{"id":"667461797","answers":[{"choice_id":"4385175102"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175117"}]},{"id":"667461805","answers":[{"choice_id":"4385175147"}]},{"id":"667461811","answers":[{"choice_id":"4385175200"}]},{"id":"667461833","answers":[{"choice_id":"4385175279"}]},{"id":"667461834","answers":[{"choice_id":"4385175296"}]}]}]},"emitted_at":1674149678656} +{"stream":"survey_responses","data":{"id":"12731084672","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=oDcOq8OB_2BpjrJzvV_2B78DTMP7bGXGg_2FFfY5m4CGX3bYG_2BHn3WUTPsqZIYhsLwynBU","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731084672","total_time":29,"date_modified":"2021-06-10T09:09:28+00:00","date_created":"2021-06-10T09:08:59+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731084672","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174702"}]},{"id":"667461777","answers":[{"choice_id":"4385174970"}]},{"id":"667461791","answers":[{"choice_id":"4385175057"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175097"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175115"}]},{"id":"667461805","answers":[{"choice_id":"4385175146"}]},{"id":"667461811","answers":[{"choice_id":"4385175200"}]},{"id":"667461833","answers":[{"choice_id":"4385175284"}]},{"id":"667461834","answers":[{"choice_id":"4385175294"}]}]}]},"emitted_at":1674149678658} +{"stream":"survey_responses","data":{"id":"12731100913","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=5kE4DYJKeO6DrzEs62N47RQ2rioxaIjqDc5G3RxsiNkZeZZ2L6PL09YQRzsKPf5P","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731100913","total_time":29,"date_modified":"2021-06-10T09:17:08+00:00","date_created":"2021-06-10T09:16:39+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731100913","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174701"}]},{"id":"667461777","answers":[{"choice_id":"4385174975"}]},{"id":"667461791","answers":[{"choice_id":"4385175058"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175102"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175121"}]},{"id":"667461805","answers":[{"choice_id":"4385175148"}]},{"id":"667461811","answers":[{"choice_id":"4385175202"}]},{"id":"667461833","answers":[{"choice_id":"4385175279"}]},{"id":"667461834","answers":[{"choice_id":"4385175295"}]}]}]},"emitted_at":1674149678659} +{"stream":"survey_responses","data":{"id":"12731117664","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=MK3EF7tVkhtzcIOL0XN0yqP2HY1_2Fqf1WCffD2MxDMDr4xww37ssvSgs9tAUezwLH","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731117664","total_time":29,"date_modified":"2021-06-10T09:24:48+00:00","date_created":"2021-06-10T09:24:19+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731117664","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174702"}]},{"id":"667461777","answers":[{"choice_id":"4385174977"}]},{"id":"667461791","answers":[{"choice_id":"4385175057"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175103"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175119"}]},{"id":"667461805","answers":[{"choice_id":"4385175147"}]},{"id":"667461811","answers":[{"choice_id":"4385175204"}]},{"id":"667461833","answers":[{"choice_id":"4385175279"}]},{"id":"667461834","answers":[{"choice_id":"4385175294"}]}]}]},"emitted_at":1674149678660} +{"stream":"survey_responses","data":{"id":"12731134542","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=vaKWu1zSFOcQlKfr2_2FhbI4n7QTTLkC4cwx4WG8fdzf9IVtI3MzE7e_2FRnH89alHIc","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731134542","total_time":29,"date_modified":"2021-06-10T09:32:32+00:00","date_created":"2021-06-10T09:32:03+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731134542","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174701"}]},{"id":"667461777","answers":[{"choice_id":"4385174973"}]},{"id":"667461791","answers":[{"choice_id":"4385175057"}]},{"id":"667461794","answers":[{"choice_id":"4385175070"}]},{"id":"667461797","answers":[{"choice_id":"4385175099"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175118"}]},{"id":"667461805","answers":[{"choice_id":"4385175149"}]},{"id":"667461811","answers":[{"choice_id":"4385175203"}]},{"id":"667461833","answers":[{"choice_id":"4385175284"}]},{"id":"667461834","answers":[{"choice_id":"4385175296"}]}]}]},"emitted_at":1674149678661} +{"stream":"survey_responses","data":{"id":"12731152328","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=IVs8i7sYR_2FPHAlgRFsF_2FqtmR8VKhb4HLvOemx_2F_2Bx31hPXV_2FqSHT1WSMqyx9fGWRv","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731152328","total_time":29,"date_modified":"2021-06-10T09:40:14+00:00","date_created":"2021-06-10T09:39:45+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731152328","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174702"}]},{"id":"667461777","answers":[{"choice_id":"4385174970"}]},{"id":"667461791","answers":[{"choice_id":"4385175056"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175103"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175116"}]},{"id":"667461805","answers":[{"choice_id":"4385175152"}]},{"id":"667461811","answers":[{"choice_id":"4385175204"}]},{"id":"667461833","answers":[{"choice_id":"4385175282"}]},{"id":"667461834","answers":[{"choice_id":"4385175295"}]}]}]},"emitted_at":1674149678662} +{"stream":"survey_responses","data":{"id":"12731169686","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=I6lNoZHdDu_2FqdBBrqWGXmuNL5Ezwzz6bS8n4LrSLKUFZ5_2FTaf8k7MnS_2FxWjh5UYN","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731169686","total_time":29,"date_modified":"2021-06-10T09:48:00+00:00","date_created":"2021-06-10T09:47:30+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731169686","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174701"}]},{"id":"667461777","answers":[{"choice_id":"4385174973"}]},{"id":"667461791","answers":[{"choice_id":"4385175056"}]},{"id":"667461794","answers":[{"choice_id":"4385175070"}]},{"id":"667461797","answers":[{"choice_id":"4385175102"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175116"}]},{"id":"667461805","answers":[{"choice_id":"4385175152"}]},{"id":"667461811","answers":[{"choice_id":"4385175200"}]},{"id":"667461833","answers":[{"choice_id":"4385175282"}]},{"id":"667461834","answers":[{"choice_id":"4385175295"}]}]}]},"emitted_at":1674149678663} +{"stream":"survey_responses","data":{"id":"12731187603","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=FiK9D4oAC52vzwBrNjbYa9wHiLT6nJc_2BvhbFVDpRqaS4N9_2FeTfbrKcUlu1iDPmLr","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731187603","total_time":32,"date_modified":"2021-06-10T09:56:10+00:00","date_created":"2021-06-10T09:55:38+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731187603","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174701"}]},{"id":"667461777","answers":[{"choice_id":"4385174970"}]},{"id":"667461791","answers":[{"choice_id":"4385175058"}]},{"id":"667461794","answers":[{"choice_id":"4385175070"}]},{"id":"667461797","answers":[{"choice_id":"4385175101"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175116"}]},{"id":"667461805","answers":[{"choice_id":"4385175150"}]},{"id":"667461811","answers":[{"choice_id":"4385175201"}]},{"id":"667461833","answers":[{"choice_id":"4385175281"}]},{"id":"667461834","answers":[{"choice_id":"4385175295"}]}]}]},"emitted_at":1674149678664} +{"stream":"survey_responses","data":{"id":"12731207265","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=DxJNIKLDsZB0jSdF3mQJziPzHSc1QhKVEAwTlaWxpmlfbYqie5vDH6pcFcXka8HP","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731207265","total_time":29,"date_modified":"2021-06-10T10:04:24+00:00","date_created":"2021-06-10T10:03:55+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731207265","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174700"}]},{"id":"667461777","answers":[{"choice_id":"4385174976"}]},{"id":"667461791","answers":[{"choice_id":"4385175055"}]},{"id":"667461794","answers":[{"choice_id":"4385175071"}]},{"id":"667461797","answers":[{"choice_id":"4385175102"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175121"}]},{"id":"667461805","answers":[{"choice_id":"4385175150"}]},{"id":"667461811","answers":[{"choice_id":"4385175203"}]},{"id":"667461833","answers":[{"choice_id":"4385175280"}]},{"id":"667461834","answers":[{"choice_id":"4385175296"}]}]}]},"emitted_at":1674149678665} +{"stream":"survey_responses","data":{"id":"12731227055","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=hifnhc2BvbuUJ2eC5tqTz1sgyzN6BVSqhHrOZMc67UAWrZ86iRSDesnY2EqLW3sf","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731227055","total_time":30,"date_modified":"2021-06-10T10:12:13+00:00","date_created":"2021-06-10T10:11:43+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731227055","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174702"}]},{"id":"667461777","answers":[{"choice_id":"4385174974"}]},{"id":"667461791","answers":[{"choice_id":"4385175057"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175096"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175121"}]},{"id":"667461805","answers":[{"choice_id":"4385175148"}]},{"id":"667461811","answers":[{"choice_id":"4385175202"}]},{"id":"667461833","answers":[{"choice_id":"4385175279"}]},{"id":"667461834","answers":[{"choice_id":"4385175295"}]}]}]},"emitted_at":1674149678666} +{"stream":"survey_responses","data":{"id":"12731246288","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=9TFIXzJKIgVd5dHU3k_2BM3i00wcrMbvDj3vBf1YYe_2FDh5Hv2kyiiZ13WyXCNq5Og9","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731246288","total_time":29,"date_modified":"2021-06-10T10:20:04+00:00","date_created":"2021-06-10T10:19:35+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731246288","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174700"}]},{"id":"667461777","answers":[{"choice_id":"4385174974"}]},{"id":"667461791","answers":[{"choice_id":"4385175057"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175098"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175117"}]},{"id":"667461805","answers":[{"choice_id":"4385175151"}]},{"id":"667461811","answers":[{"choice_id":"4385175198"}]},{"id":"667461833","answers":[{"choice_id":"4385175284"}]},{"id":"667461834","answers":[{"choice_id":"4385175294"}]}]}]},"emitted_at":1674149678667} +{"stream":"survey_responses","data":{"id":"12731264698","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=s1IbylETE10QgXtryui0Bdz_2Bj5IU5LzqBMHDbnhunQHBP5CedlG7l56df1BhmnL2","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731264698","total_time":29,"date_modified":"2021-06-10T10:27:44+00:00","date_created":"2021-06-10T10:27:15+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731264698","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174700"}]},{"id":"667461777","answers":[{"choice_id":"4385174977"}]},{"id":"667461791","answers":[{"choice_id":"4385175058"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175096"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175119"}]},{"id":"667461805","answers":[{"choice_id":"4385175146"}]},{"id":"667461811","answers":[{"choice_id":"4385175199"}]},{"id":"667461833","answers":[{"choice_id":"4385175281"}]},{"id":"667461834","answers":[{"choice_id":"4385175294"}]}]}]},"emitted_at":1674149678668} +{"stream":"survey_responses","data":{"id":"12731284644","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=gRmE1HF_2BBq7nrEqx2yWW8g0zVXXWYXVJ2u7ohGYqL6fyVTm6aN1WqlcfWrYGOvpl","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731284644","total_time":32,"date_modified":"2021-06-10T10:35:47+00:00","date_created":"2021-06-10T10:35:15+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731284644","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174700"}]},{"id":"667461777","answers":[{"choice_id":"4385174972"}]},{"id":"667461791","answers":[{"choice_id":"4385175055"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175098"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175116"}]},{"id":"667461805","answers":[{"choice_id":"4385175146"}]},{"id":"667461811","answers":[{"choice_id":"4385175202"}]},{"id":"667461833","answers":[{"choice_id":"4385175283"}]},{"id":"667461834","answers":[{"choice_id":"4385175296"}]}]}]},"emitted_at":1674149678668} +{"stream":"survey_responses","data":{"id":"12731303856","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=R15XZO_2FAOou8IYPELNzZWNvHyYHz5f2yg5XY9DyTPB_2F1F9zoalgsQcLiDzAzYgfp","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731303856","total_time":31,"date_modified":"2021-06-10T10:43:31+00:00","date_created":"2021-06-10T10:43:00+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731303856","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174700"}]},{"id":"667461777","answers":[{"choice_id":"4385174972"}]},{"id":"667461791","answers":[{"choice_id":"4385175056"}]},{"id":"667461794","answers":[{"choice_id":"4385175072"}]},{"id":"667461797","answers":[{"choice_id":"4385175101"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175115"}]},{"id":"667461805","answers":[{"choice_id":"4385175148"}]},{"id":"667461811","answers":[{"choice_id":"4385175198"}]},{"id":"667461833","answers":[{"choice_id":"4385175284"}]},{"id":"667461834","answers":[{"choice_id":"4385175296"}]}]}]},"emitted_at":1674149678669} +{"stream":"survey_responses","data":{"id":"12731323720","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=EiMwydLUjYosaJKqAS7XvTZYSRk1ONKVDTvKy287UbU9nHh4OUTunOiBk4lTOMIX","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731323720","total_time":29,"date_modified":"2021-06-10T10:51:27+00:00","date_created":"2021-06-10T10:50:58+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731323720","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174700"}]},{"id":"667461777","answers":[{"choice_id":"4385174977"}]},{"id":"667461791","answers":[{"choice_id":"4385175057"}]},{"id":"667461794","answers":[{"choice_id":"4385175071"}]},{"id":"667461797","answers":[{"choice_id":"4385175103"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175119"}]},{"id":"667461805","answers":[{"choice_id":"4385175152"}]},{"id":"667461811","answers":[{"choice_id":"4385175201"}]},{"id":"667461833","answers":[{"choice_id":"4385175282"}]},{"id":"667461834","answers":[{"choice_id":"4385175295"}]}]}]},"emitted_at":1674149678670} +{"stream":"survey_responses","data":{"id":"12731342570","recipient_id":"","collection_mode":"default","response_status":"completed","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":[],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=26PW15rB0RZChb0Db5YdoDywvKkwI95rERJAB_2BeZi_2F8EbRztchqEvwih9zygXayj","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731342570","total_time":30,"date_modified":"2021-06-10T10:59:05+00:00","date_created":"2021-06-10T10:58:35+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731342570","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174701"}]},{"id":"667461777","answers":[{"choice_id":"4385174971"}]},{"id":"667461791","answers":[{"choice_id":"4385175056"}]},{"id":"667461794","answers":[{"choice_id":"4385175073"}]},{"id":"667461797","answers":[{"choice_id":"4385175099"}]}]},{"id":"168831402","questions":[{"id":"667461801","answers":[{"choice_id":"4385175116"}]},{"id":"667461805","answers":[{"choice_id":"4385175146"}]},{"id":"667461811","answers":[{"choice_id":"4385175202"}]},{"id":"667461833","answers":[{"choice_id":"4385175283"}]},{"id":"667461834","answers":[{"choice_id":"4385175295"}]}]}]},"emitted_at":1674149678670} +{"stream":"survey_responses","data":{"id":"12731362003","recipient_id":"","collection_mode":"default","response_status":"partial","custom_value":"","first_name":"","last_name":"","email_address":"","ip_address":"91.242.192.88","logic_path":{},"metadata":{"contact":{}},"page_path":["168831392","168831393","168831402"],"collector_id":"405843634","survey_id":"307785415","custom_variables":{},"edit_url":"https://www.surveymonkey.com/r/?sm=LFmWWSa5B0YPzIswFuEpoIxYrVHHhorNICipbTUhp6Z3p5apUZsA3ENZGZbaPFH0","analyze_url":"https://www.surveymonkey.com/analyze/browse/BPAkhAawaMN8C17tmmNFxjZ0KOiJJ3FCQU4krShVQhg_3D?respondent_id=12731362003","total_time":19,"date_modified":"2021-06-10T11:06:42+00:00","date_created":"2021-06-10T11:06:23+00:00","href":"https://api.surveymonkey.com/v3/surveys/307785415/responses/12731362003","pages":[{"id":"168831392","questions":[]},{"id":"168831393","questions":[{"id":"667461690","answers":[{"choice_id":"4385174702"}]},{"id":"667461777","answers":[{"choice_id":"4385174976"}]},{"id":"667461791","answers":[{"choice_id":"4385175058"}]},{"id":"667461794","answers":[{"choice_id":"4385175071"}]},{"id":"667461797","answers":[{"choice_id":"4385175099"}]}]},{"id":"168831402","questions":[]}]},"emitted_at":1674149678671} +{"stream":"survey_pages","data":{"title":"sy4ara","description":"Сурвейманки жлобы","position":1,"question_count":13,"id":"165250506","href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506"},"emitted_at":1674149681286} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168831413","href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831413"},"emitted_at":1674149682414} +{"stream":"survey_pages","data":{"title":"xsgqdhdakh7x","description":"wlju6xsgkxyig0s1","position":2,"question_count":5,"id":"168831415","href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831415"},"emitted_at":1674149682415} +{"stream":"survey_pages","data":{"title":"ajsn8v0tvicgt7u063","description":"dcwmhxdx6p8buu","position":3,"question_count":5,"id":"168831437","href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831437"},"emitted_at":1674149682415} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168831459","href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831459"},"emitted_at":1674149683744} +{"stream":"survey_pages","data":{"title":"ijw0pw2tlfb0vd3","description":"k8tycaedxbl4","position":2,"question_count":5,"id":"168831461","href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831461"},"emitted_at":1674149683744} +{"stream":"survey_pages","data":{"title":"krd3l3bj7vaym6pc4","description":"oy458fugj0k","position":3,"question_count":5,"id":"168831467","href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831467"},"emitted_at":1674149683745} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168831344","href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831344"},"emitted_at":1674149684444} +{"stream":"survey_pages","data":{"title":"q4fuvltqc6","description":"7kfibw7aer8mr937a3ko","position":2,"question_count":5,"id":"168831345","href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831345"},"emitted_at":1674149684445} +{"stream":"survey_pages","data":{"title":"p5sdpb0pus6","description":"o9gbkpmfik2x","position":3,"question_count":5,"id":"168831352","href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831352"},"emitted_at":1674149684445} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168831357","href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831357"},"emitted_at":1674149685687} +{"stream":"survey_pages","data":{"title":"133nvr2cx99r","description":"shwtfx0edv","position":2,"question_count":5,"id":"168831358","href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831358"},"emitted_at":1674149685687} +{"stream":"survey_pages","data":{"title":"otgwn5b4wicdemu1q","description":"s3ndgrck3qr4898qwtgh","position":3,"question_count":5,"id":"168831365","href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831365"},"emitted_at":1674149685687} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168831381","href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831381"},"emitted_at":1674149686909} +{"stream":"survey_pages","data":{"title":"ooj54g8q2thh","description":"8hrryr258se","position":2,"question_count":5,"id":"168831382","href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831382"},"emitted_at":1674149686909} +{"stream":"survey_pages","data":{"title":"mva5ojqgmx6wnv62as","description":"wq6q460p143mi0","position":3,"question_count":5,"id":"168831388","href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831388"},"emitted_at":1674149686909} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168830049","href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830049"},"emitted_at":1674149687592} +{"stream":"survey_pages","data":{"title":"v3q97ckq2438fqkppcyn","description":"oforikk3wu4gin","position":2,"question_count":5,"id":"168830050","href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830050"},"emitted_at":1674149687593} +{"stream":"survey_pages","data":{"title":"t57ybjyll8fwgu39w","description":"ttlkuqp07ua6kpsh","position":3,"question_count":5,"id":"168830060","href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830060"},"emitted_at":1674149687594} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168831470","href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831470"},"emitted_at":1674149688355} +{"stream":"survey_pages","data":{"title":"q3wpp1ufpi5r058o","description":"ay91aymge2vuacmrl9co","position":2,"question_count":5,"id":"168831471","href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831471"},"emitted_at":1674149688356} +{"stream":"survey_pages","data":{"title":"m345ab1u6tjjo4nn3d","description":"ec22umvdkhxd0ne575","position":3,"question_count":5,"id":"168831478","href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831478"},"emitted_at":1674149688357} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168830093","href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830093"},"emitted_at":1674149689582} +{"stream":"survey_pages","data":{"title":"7t9dgejtlw5wsofbt","description":"mfqrejibgc831bp31","position":2,"question_count":5,"id":"168830094","href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830094"},"emitted_at":1674149689583} +{"stream":"survey_pages","data":{"title":"9kri0ao4fh8e3i0j2hms","description":"dh7qg9jc1k65x","position":3,"question_count":5,"id":"168830108","href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830108"},"emitted_at":1674149689583} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168830067","href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830067"},"emitted_at":1674149690505} +{"stream":"survey_pages","data":{"title":"9vpm4e5ecjis5hge0p","description":"r6e38n2fp33skkjrl","position":2,"question_count":5,"id":"168830068","href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830068"},"emitted_at":1674149690506} +{"stream":"survey_pages","data":{"title":"nvv6kl2njpt5b1l2p","description":"rd2j09sxv4ssu976g","position":3,"question_count":5,"id":"168830074","href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830074"},"emitted_at":1674149690506} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168830082","href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830082"},"emitted_at":1674149691681} +{"stream":"survey_pages","data":{"title":"v1yxmq6n1ix","description":"aeoyc3hiak9vui1hevm","position":2,"question_count":5,"id":"168830083","href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830083"},"emitted_at":1674149691682} +{"stream":"survey_pages","data":{"title":"g84sqoltkc2jen8iaj0","description":"ss2439kly1u4j1k1","position":3,"question_count":5,"id":"168830087","href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830087"},"emitted_at":1674149691682} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168831335","href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831335"},"emitted_at":1674149692346} +{"stream":"survey_pages","data":{"title":"k91l1laduo8","description":"4tmb1eke23bi1l2ev","position":2,"question_count":5,"id":"168831336","href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831336"},"emitted_at":1674149692347} +{"stream":"survey_pages","data":{"title":"gisj5ms868kxxv","description":"4g1iiqg0sa15pbk","position":3,"question_count":5,"id":"168831340","href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831340"},"emitted_at":1674149692348} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"168831392","href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831392"},"emitted_at":1674149693064} +{"stream":"survey_pages","data":{"title":"p71uerk2uh7k5","description":"92cb9d98j15jmfo","position":2,"question_count":5,"id":"168831393","href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831393"},"emitted_at":1674149693064} +{"stream":"survey_pages","data":{"title":"bqd6mn6bdgv5u1rnstkx","description":"e0jrpexyx6t","position":3,"question_count":5,"id":"168831402","href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831402"},"emitted_at":1674149693065} +{"stream":"survey_pages","data":{"title":"","description":"","position":1,"question_count":0,"id":"36710109","href":"https://api.surveymonkey.com/v3/surveys/510388524/pages/36710109"},"emitted_at":1674149694191} +{"stream":"survey_questions","data":{"id":"652286724","position":1,"visible":true,"family":"click_map","subtype":"single","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"Click on the area you like best about this product.","image":{"url":"https://surveymonkey-assets.s3.amazonaws.com/survey/306079584/20535460-8f99-41b0-ac96-b9f4f2aecb96.png"}}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286724","answers":{"rows":[{"position":1,"visible":true,"text":"Click 1","id":"4285525098"}]},"page_id":"165250506"},"emitted_at":1674149694470} +{"stream":"survey_questions","data":{"id":"652286725","position":2,"visible":true,"family":"click_map","subtype":"single","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"Click on the area you like least about this product.","image":{"url":"https://surveymonkey-assets.s3.amazonaws.com/survey/306079584/79215d25-9dbc-4870-91cd-3a36778aae52.png"}}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286725","answers":{"rows":[{"position":1,"visible":true,"text":"Click 1","id":"4285525102"}]},"page_id":"165250506"},"emitted_at":1674149694470} +{"stream":"survey_questions","data":{"id":"652286726","position":3,"visible":true,"family":"open_ended","subtype":"essay","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"Why did you make that selection?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286726","page_id":"165250506"},"emitted_at":1674149694471} +{"stream":"survey_questions","data":{"id":"652286715","position":4,"visible":true,"family":"single_choice","subtype":"vertical_two_col","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"What is your first reaction to the product?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286715","answers":{"choices":[{"position":1,"visible":true,"text":"Very positive","quiz_options":{"score":0},"id":"4285525063"},{"position":2,"visible":true,"text":"Somewhat positive","quiz_options":{"score":0},"id":"4285525064"},{"position":3,"visible":true,"text":"Neutral","quiz_options":{"score":0},"id":"4285525065"},{"position":4,"visible":true,"text":"Somewhat negative","quiz_options":{"score":0},"id":"4285525066"},{"position":5,"visible":true,"text":"Very negative","quiz_options":{"score":0},"id":"4285525067"}]},"page_id":"165250506"},"emitted_at":1674149694471} +{"stream":"survey_questions","data":{"id":"652286721","position":5,"visible":true,"family":"single_choice","subtype":"vertical_two_col","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"How would you rate the quality of the product?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286721","answers":{"choices":[{"position":1,"visible":true,"text":"Very high quality","quiz_options":{"score":0},"id":"4285525083"},{"position":2,"visible":true,"text":"High quality","quiz_options":{"score":0},"id":"4285525084"},{"position":3,"visible":true,"text":"Neither high nor low quality","quiz_options":{"score":0},"id":"4285525085"},{"position":4,"visible":true,"text":"Low quality","quiz_options":{"score":0},"id":"4285525086"},{"position":5,"visible":true,"text":"Very low quality","quiz_options":{"score":0},"id":"4285525087"}]},"page_id":"165250506"},"emitted_at":1674149694472} +{"stream":"survey_questions","data":{"id":"652286716","position":6,"visible":true,"family":"single_choice","subtype":"vertical_two_col","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"How innovative is the product?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286716","answers":{"choices":[{"position":1,"visible":true,"text":"Extremely innovative","quiz_options":{"score":0},"id":"4285525068"},{"position":2,"visible":true,"text":"Very innovative","quiz_options":{"score":0},"id":"4285525069"},{"position":3,"visible":true,"text":"Somewhat innovative","quiz_options":{"score":0},"id":"4285525070"},{"position":4,"visible":true,"text":"Not so innovative","quiz_options":{"score":0},"id":"4285525071"},{"position":5,"visible":true,"text":"Not at all innovative","quiz_options":{"score":0},"id":"4285525072"}]},"page_id":"165250506"},"emitted_at":1674149694473} +{"stream":"survey_questions","data":{"id":"652286718","position":7,"visible":true,"family":"single_choice","subtype":"vertical_two_col","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"When you think about the product, do you think of it as something you need or don’t need?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286718","answers":{"choices":[{"position":1,"visible":true,"text":"Definitely need","quiz_options":{"score":0},"id":"4285525078"},{"position":2,"visible":true,"text":"Probably need","quiz_options":{"score":0},"id":"4285525079"},{"position":3,"visible":true,"text":"Neutral","quiz_options":{"score":0},"id":"4285525080"},{"position":4,"visible":true,"text":"Probably don’t need","quiz_options":{"score":0},"id":"4285525081"},{"position":5,"visible":true,"text":"Definitely don’t need","quiz_options":{"score":0},"id":"4285525082"}]},"page_id":"165250506"},"emitted_at":1674149694474} +{"stream":"survey_questions","data":{"id":"652286722","position":8,"visible":true,"family":"single_choice","subtype":"vertical_two_col","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"How would you rate the value for money of the product?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286722","answers":{"choices":[{"position":1,"visible":true,"text":"Excellent","quiz_options":{"score":0},"id":"4285525088"},{"position":2,"visible":true,"text":"Above average","quiz_options":{"score":0},"id":"4285525089"},{"position":3,"visible":true,"text":"Average","quiz_options":{"score":0},"id":"4285525090"},{"position":4,"visible":true,"text":"Below average","quiz_options":{"score":0},"id":"4285525091"},{"position":5,"visible":true,"text":"Poor","quiz_options":{"score":0},"id":"4285525092"}]},"page_id":"165250506"},"emitted_at":1674149694474} +{"stream":"survey_questions","data":{"id":"652286717","position":9,"visible":true,"family":"single_choice","subtype":"vertical_two_col","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"If the product were available today, how likely would you be to buy the product?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286717","answers":{"choices":[{"position":1,"visible":true,"text":"Extremely likely","quiz_options":{"score":0},"id":"4285525073"},{"position":2,"visible":true,"text":"Very likely","quiz_options":{"score":0},"id":"4285525074"},{"position":3,"visible":true,"text":"Somewhat likely","quiz_options":{"score":0},"id":"4285525075"},{"position":4,"visible":true,"text":"Not so likely","quiz_options":{"score":0},"id":"4285525076"},{"position":5,"visible":true,"text":"Not at all likely","quiz_options":{"score":0},"id":"4285525077"}]},"page_id":"165250506"},"emitted_at":1674149694475} +{"stream":"survey_questions","data":{"id":"652286723","position":10,"visible":true,"family":"single_choice","subtype":"vertical_two_col","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"How likely are you to replace your current product with the product?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286723","answers":{"choices":[{"position":1,"visible":true,"text":"Extremely likely ","quiz_options":{"score":0},"id":"4285525093"},{"position":2,"visible":true,"text":"Very likely ","quiz_options":{"score":0},"id":"4285525094"},{"position":3,"visible":true,"text":"Somewhat likely","quiz_options":{"score":0},"id":"4285525095"},{"position":4,"visible":true,"text":"Not so likely","quiz_options":{"score":0},"id":"4285525096"},{"position":5,"visible":true,"text":"Not at all likely","quiz_options":{"score":0},"id":"4285525097"}]},"page_id":"165250506"},"emitted_at":1674149694475} +{"stream":"survey_questions","data":{"id":"652286714","position":11,"visible":true,"family":"matrix","subtype":"rating","layout":{"bottom_spacing":0,"col_width":80,"col_width_format":"percent","left_spacing":0,"num_chars":null,"num_lines":null,"position":"new_row","right_spacing":0,"top_spacing":0,"width":100,"width_format":"percent"},"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"How likely is it that you would recommend our new product to a friend or colleague?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286714","answers":{"rows":[{"position":1,"visible":true,"text":"","id":"4285525061"}],"choices":[{"position":1,"visible":true,"text":"Not at all likely - 0","id":"4285525050","is_na":false,"weight":-100,"description":"Not at all likely"},{"position":2,"visible":true,"text":"1","id":"4285525051","is_na":false,"weight":-100,"description":""},{"position":3,"visible":true,"text":"2","id":"4285525052","is_na":false,"weight":-100,"description":""},{"position":4,"visible":true,"text":"3","id":"4285525053","is_na":false,"weight":-100,"description":""},{"position":5,"visible":true,"text":"4","id":"4285525054","is_na":false,"weight":-100,"description":""},{"position":6,"visible":true,"text":"5","id":"4285525055","is_na":false,"weight":-100,"description":""},{"position":7,"visible":true,"text":"6","id":"4285525056","is_na":false,"weight":-100,"description":""},{"position":8,"visible":true,"text":"7","id":"4285525057","is_na":false,"weight":0,"description":""},{"position":9,"visible":true,"text":"8","id":"4285525058","is_na":false,"weight":0,"description":""},{"position":10,"visible":true,"text":"9","id":"4285525059","is_na":false,"weight":100,"description":""},{"position":11,"visible":true,"text":"Extremely likely - 10","id":"4285525060","is_na":false,"weight":100,"description":"Extremely likely"}]},"page_id":"165250506"},"emitted_at":1674149694476} +{"stream":"survey_questions","data":{"id":"652286719","position":12,"visible":true,"family":"open_ended","subtype":"essay","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"In your own words, what are the things that you like most about this new product?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286719","page_id":"165250506"},"emitted_at":1674149694476} +{"stream":"survey_questions","data":{"id":"652286720","position":13,"visible":true,"family":"open_ended","subtype":"essay","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"In your own words, what are the things that you would most like to improve in this new product?"}],"href":"https://api.surveymonkey.com/v3/surveys/306079584/pages/165250506/questions/652286720","page_id":"165250506"},"emitted_at":1674149694477} +{"stream":"survey_questions","data":{"id":"667461858","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"vprw9pgg3d xiygcvd0suru k7rews838g6qc ndsukv2 7sa31urnvoskixw c52sg4uoete874i"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831415/questions/667461858","answers":{"choices":[{"position":1,"visible":true,"text":"m5kpo9621yynjey kdt5w6pkkit yqyocxqf yw1p3uh2e5b 7gtmvs4 6em5ugqat x6pmhcfrvq4pit t67pif54aj jbgure","quiz_options":{"score":0},"id":"4385175366"},{"position":2,"visible":true,"text":"usdfft kvi9yqh1m38w3m 6uxryyvhrk1 nfxlt gnhjy826e rqks3jjuyj9hd 3y8755o","quiz_options":{"score":0},"id":"4385175367"},{"position":3,"visible":true,"text":"m6xv3yca7 up9u0qwx23h2skj 0cjlw19k5emypgm awi5tg l9atp kv4jrd73y9","quiz_options":{"score":0},"id":"4385175368"},{"position":4,"visible":true,"text":"todhc7 krw2v8qa rt2iu19vhxyw1dp x6oav54yak4vj yu4le2fc7 fksvl ejbr7x2u69 k9n9n7g3f","quiz_options":{"score":0},"id":"4385175369"}]},"page_id":"168831415"},"emitted_at":1674149694578} +{"stream":"survey_questions","data":{"id":"667461861","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"rl3uabslq46p mnwh0fle3xfs ejupx8e26q55va svfm11o"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831415/questions/667461861","answers":{"choices":[{"position":1,"visible":true,"text":"m6g15xqsuwpbh3 x0116lkpod 5vkgg7duiq23sp ot884xd67v6fv2q 1u2mpgo ttj3ehahbljf1j6 pwj46w1d","quiz_options":{"score":0},"id":"4385175380"},{"position":2,"visible":true,"text":"cuff7 mbn2k1hxd6n6 jg9kffdkccjh bpodqpt2wtxu 7x38qxmvg42ap qpv0cddfumvix s0vv161iytceelx","quiz_options":{"score":0},"id":"4385175381"},{"position":3,"visible":true,"text":"jm5q6yu4rn pl8wwv23lnxs ou5r8m3np4fis6 6wlatg yeh3kafns0 h8u0o8f yhqni064ev6","quiz_options":{"score":0},"id":"4385175382"}]},"page_id":"168831415"},"emitted_at":1674149694579} +{"stream":"survey_questions","data":{"id":"667461876","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"hn4xnf ox0joj4inoy6ja jh02428n qeqxm9nopevjca sccwladi v63ks6mdqf0h0 4pug94eya 5et1g3t4 exbryyy6hv9mvd"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831415/questions/667461876","answers":{"choices":[{"position":1,"visible":true,"text":"w6nvr mkrj8q1g 740smg3nda m3afibg8 224jb59fon975t w9t8ma","quiz_options":{"score":0},"id":"4385175447"},{"position":2,"visible":true,"text":"cerw942pk xv1wg4gk4l7jq q3grdgasaol 75ghj ppo6ivm3r hxodiktx9rxs","quiz_options":{"score":0},"id":"4385175448"},{"position":3,"visible":true,"text":"5os82a1jwgygye 61dhsf6v sgy0ui7ib78ws7f j3pymv","quiz_options":{"score":0},"id":"4385175449"}]},"page_id":"168831415"},"emitted_at":1674149694580} +{"stream":"survey_questions","data":{"id":"667461897","position":4,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"5a32s3dhl a967a54aoj3cr ttu0uk4hu4h1 r360wdohq1x9xu7 qvqpg1eb6qg3 01ogn ucbhive fpwstwi6hre0ynb xu3c3txpma7eoh3"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831415/questions/667461897","answers":{"choices":[{"position":1,"visible":true,"text":"6gngt 5w10n7fl47r07 68t8t79 66pqqth5urrw 1ve2kn385x0u9s 99vcfs08at","quiz_options":{"score":0},"id":"4385175533"},{"position":2,"visible":true,"text":"pnwrx dwj1dx dpdan1wpqs 9lhgks36 1w8a2utjbxas31t rlc1u51mdpjr 90tcj6i8ibicvxt q1ahtd2x doujpba kjjjdi0","quiz_options":{"score":0},"id":"4385175534"},{"position":3,"visible":true,"text":"wu74ewyb4grv fqb8h3yoldsn 0nxv5844yn0lpx jct7na y9sp3u ueq7vk83ix7g7sx f5sl73r2r29e84","quiz_options":{"score":0},"id":"4385175535"}]},"page_id":"168831415"},"emitted_at":1674149694581} +{"stream":"survey_questions","data":{"id":"667461902","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"sdek6wejcdn 82r223sfhy6xkm5 65gns2m7phi 0fx8dx5bp psvndjnn5b 5kki467 a8faadeid0gl13 x2t3e 03xco2 cf39nv9mdq3vj"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831415/questions/667461902","answers":{"choices":[{"position":1,"visible":true,"text":"nfiq0 d7gwft9 8bhinfrsv6r6 k3vylofokamx3 9hrik k2ageb5amyj89a toli0yrsq bqbrcp","quiz_options":{"score":0},"id":"4385175559"},{"position":2,"visible":true,"text":"8c5qdiklqb8tb 5uhc6w1a1o9 er8h4w0mf779o 14nsksqs65j10","quiz_options":{"score":0},"id":"4385175561"},{"position":3,"visible":true,"text":"5wpggsufojm 4decq179m5 0brpk1la0kyno e8ctqi fxa4j0uo9atp","quiz_options":{"score":0},"id":"4385175563"},{"position":4,"visible":true,"text":"5it4y4q 49im15osxk2j0 j8twpv8j nei1egowtm9a lyrigqwu0eby tpg5o7kuvgn34l spdu5icxlc 2f4qf qb55g 8si14ri4bdw1v72","quiz_options":{"score":0},"id":"4385175564"}]},"page_id":"168831415"},"emitted_at":1674149694582} +{"stream":"survey_questions","data":{"id":"667461933","position":1,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"4vnmxluvh7a l8s5r0i5ck pa7pckqf tnah7fan76p38n8 m1i5r ea9ib0t823amcn k98290k23wh7qn"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831437/questions/667461933","answers":{"choices":[{"position":1,"visible":true,"text":"aldwijo3p9mh3 v26dql0wbrctg0 98sqogqfmi2 558gsvip","quiz_options":{"score":0},"id":"4385175732"},{"position":2,"visible":true,"text":"c5fqe o43qm3oq9i 23qgoxg85 cg5hr5wj79469n 328j7ji1kugb 60jlwtbu4eoh63 alyho5","quiz_options":{"score":0},"id":"4385175733"},{"position":3,"visible":true,"text":"882jtclxvq15yk dgive oqhqdf a8a2rgxse4b8fw 87oeyfbk7 wcevsx 4mv1lyp6lyxysrm 3m8yayarq7wm 9bpmul9 el2j1j4yw","quiz_options":{"score":0},"id":"4385175734"},{"position":4,"visible":true,"text":"3so1buxa 88ypp61nq6bhi0 lwa2pfg6tg lra8e1r5bn4k umstgwdck9 wslq681gvn3g2f a20nr1eovr3 feo0p5bqbgrcvun np851e23cojfv1 uqlwg","quiz_options":{"score":0},"id":"4385175735"}]},"page_id":"168831437"},"emitted_at":1674149694582} +{"stream":"survey_questions","data":{"id":"667461934","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"k6ba3wdl 6c0nvj5es h0dttl3krobdcd va6klkdyf 79e2a lhmov"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831437/questions/667461934","answers":{"choices":[{"position":1,"visible":true,"text":"h8dywnj ithq4el 98e20manw xxyp0f9oike55 t56arby dhmmxh4pehs","quiz_options":{"score":0},"id":"4385175736"},{"position":2,"visible":true,"text":"14p6263c 7khx2y rpjy6432cy7kkr 0po0vol3uk1cuf 1oejmy viircj9b nyw76yqpf","quiz_options":{"score":0},"id":"4385175737"},{"position":3,"visible":true,"text":"vtdf2x 2kme3 vhpqi5s82k7v4 1mjr5r jp0ox03i6t d5ef5228du3ck 536btd7etv","quiz_options":{"score":0},"id":"4385175738"},{"position":4,"visible":true,"text":"yt2e6nk6 v2wl4k047h1n5 civs8 tjjr7lkeay9i3","quiz_options":{"score":0},"id":"4385175739"}]},"page_id":"168831437"},"emitted_at":1674149694583} +{"stream":"survey_questions","data":{"id":"667461936","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"u1jbhrxyrg30ra9 qs6b5m237lag 7tlvv 05okuge2imipht bg813 hixvf9bd9n10gk lwxdjnajbu9gsra uyh3fjd40bs"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831437/questions/667461936","answers":{"choices":[{"position":1,"visible":true,"text":"yl8yqqhtr9rxi 049x312 oogub1figyg4e tixix79g85hxi2l bin0fp5g goq3kwu2eaase x9mihu0erdhl9v4 4yausp34y2rgyx iwyfuo4b7yme8lr","quiz_options":{"score":0},"id":"4385175740"},{"position":2,"visible":true,"text":"gfqbxk8 3tosymacon00av uoxydvdy28 iuce5bjdvpg gwxdpkudg24ouk u2ns1u x10hujmiiy9l62i soln75a14nm8q0","quiz_options":{"score":0},"id":"4385175741"},{"position":3,"visible":true,"text":"j299iy64y804 k709a5kk9 yjsifyt4ksu b4fnp4a","quiz_options":{"score":0},"id":"4385175742"}]},"page_id":"168831437"},"emitted_at":1674149694584} +{"stream":"survey_questions","data":{"id":"667461937","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"06qgl j7f89g3 5ok0ilvhvpa ojcs6ixbovvf u6xympul0 o00vc 6bjg7jmvy9s 543ndxd jmugw njqhxa3phj4jd"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831437/questions/667461937","answers":{"choices":[{"position":1,"visible":true,"text":"5v1hangb7u0bj8 44xo3y4o inytm95s16m dvn5e2leb6sf7 hamaw8l538eph 6xuyp5030i538c 0ym6m831 duar0bo76 kl36ykf5w9ugh","quiz_options":{"score":0},"id":"4385175745"},{"position":2,"visible":true,"text":"3iiaxf5dgi tr6crqs i51ocgg ka1ri0ffd8xeh cv12807q5pq 7fmq8lxy7 5wuas7gcn4kln tv6mf3pqq4jm x3yfr sm7idq2nvoonk","quiz_options":{"score":0},"id":"4385175746"},{"position":3,"visible":true,"text":"mj5cmssx3htoni ld622ppaiqr uw63p1q4up3 lfxioj94gd3jky0 2tj631 5ql6116xsyp r5hwhy2","quiz_options":{"score":0},"id":"4385175747"},{"position":4,"visible":true,"text":"llb9oe7fk8v3w4q xpd66rgbyp9m 0opo19df7n6 scr70cg86pn o1qtr7rclqxjl kmpnf79790 6wmig6mjwflh2vq 1oe033jyd","quiz_options":{"score":0},"id":"4385175748"},{"position":5,"visible":true,"text":"pg851 mju7py cdp1jqcaeg66 3gv05ohwromt u0uot","quiz_options":{"score":0},"id":"4385175749"},{"position":6,"visible":true,"text":"mu0hn799v 4ch8i7j5o5tf8s 6rn9y0ft67mchc u5ds14s9 aj1qg26dwf41suc i1mdhdk","quiz_options":{"score":0},"id":"4385175750"},{"position":7,"visible":true,"text":"6w4xjejtc9j 50n12 u1cdbulvkqykvci x79sdq9y hmbem37x7 s7pwufdjnmn xo8qy81a3fjmv","quiz_options":{"score":0},"id":"4385175751"},{"position":8,"visible":true,"text":"k582dst vgjvse b2h3mxi dteo4p9lrtx m54ug","quiz_options":{"score":0},"id":"4385175752"}]},"page_id":"168831437"},"emitted_at":1674149694585} +{"stream":"survey_questions","data":{"id":"667461986","position":5,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"gjahy0fl7 fs6b3q6e7 rsvbmotgt9p7 w9l2l7 hvj8fhrqwc vays8 4yh7qch hjj5lx0 co6a5rqd 5pt79or0a7evc"}],"href":"https://api.surveymonkey.com/v3/surveys/307785429/pages/168831437/questions/667461986","answers":{"choices":[{"position":1,"visible":true,"text":"b7fbynqu hwhvtbqwbmxy 9bjgxs1 1e05mo toj685p5v w34e97j","quiz_options":{"score":0},"id":"4385175878"},{"position":2,"visible":true,"text":"n5e5yl9c6 yw12588olh swl7nwm1dl9n2l 9v7n8wursm6739 p67woq9u27w7p y3ge5y1iji819g7 uklmy7q8 7ocv68por","quiz_options":{"score":0},"id":"4385175879"},{"position":3,"visible":true,"text":"h08nyyi 1393hst fcdij6j yepfw2","quiz_options":{"score":0},"id":"4385175880"},{"position":4,"visible":true,"text":"rdme8pwwjl07 4ju4xn47ofvbj i31u4ty4f4 wteatx2 gc3nqgji pu9h7","quiz_options":{"score":0},"id":"4385175881"},{"position":5,"visible":true,"text":"jxkod8gx x8tcsxxle4f0lv4 vcmjicpk7v i19dxl3 3lvmmdkx","quiz_options":{"score":0},"id":"4385175882"}]},"page_id":"168831437"},"emitted_at":1674149694587} +{"stream":"survey_questions","data":{"id":"667462078","position":1,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"vrwr5e5qwxqu4 mn9jcdpf 0e5u3k ansge 2hwkipig u0wn3acc2sct xnv4y8 3irjcv i0cgva8762tfosw"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831461/questions/667462078","answers":{"choices":[{"position":1,"visible":true,"text":"55yvst1hihf4br ialhkcxm73fjln 1lelxuw93g0 nukml0","quiz_options":{"score":0},"id":"4385176721"},{"position":2,"visible":true,"text":"okdweedyn93 mua59r2l4haj orem637bgltyb 7jc2yral4o8qov j15ry fkkgjxdea rjd297yot eq57kefir4if3c 2l098 ech2y5fv","quiz_options":{"score":0},"id":"4385176722"},{"position":3,"visible":true,"text":"b3sgu7kkbjowg ux7qqyw41yb umfqpq6 dfgu4awr uy2i4j626 cb17jp5xal6","quiz_options":{"score":0},"id":"4385176723"},{"position":4,"visible":true,"text":"5igq4pw5ul la3i72sh30 uk24o0qi jh51hl9s3a43s 9tgq0ip8k1nev ar6it adgfobu491 f8qke95 o2f9u2ubb49t28c obyoj9cfsl","quiz_options":{"score":0},"id":"4385176724"},{"position":5,"visible":true,"text":"r73ge7qkd8mjfu d7kdhfmco d0pcoyqqyjrph4g 06xs83492x 5ajmrgy1 x4ev3aroh9q86r gwiu17g02i6h75c np3r62er4x5n 73hbkk43af 7f5b333hk7tkc","quiz_options":{"score":0},"id":"4385176725"},{"position":6,"visible":true,"text":"vo6u3 9gpy2s57xh u8dcib 4f8gbbng3wq0h36","quiz_options":{"score":0},"id":"4385176726"}]},"page_id":"168831461"},"emitted_at":1674149694691} +{"stream":"survey_questions","data":{"id":"667462079","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"6d3w2gqt8056 h5vl4u3kcuvlqc lk2ip62d kpkowwj"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831461/questions/667462079","answers":{"choices":[{"position":1,"visible":true,"text":"agvpu24j1 g51hr01jbjsk vw6gq cftg9oeklijpda qbibhtf35pl4gtq wu48wsd5 c6jifqlyt4e","quiz_options":{"score":0},"id":"4385176727"},{"position":2,"visible":true,"text":"4kbb46n 0vmm0c4we qwaiv1f731l y8iaiu3bkcb6 loqrsy","quiz_options":{"score":0},"id":"4385176728"},{"position":3,"visible":true,"text":"rwm2cgejb qc4g9 7y68obgewd fou0um xh7dkb89o bfosq3 v9bdp7s9450","quiz_options":{"score":0},"id":"4385176729"}]},"page_id":"168831461"},"emitted_at":1674149694692} +{"stream":"survey_questions","data":{"id":"667462082","position":3,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"dvpu842k yh6g475bbwk75 qtkq7f5yd01igo ixldsnn uqbpr ngarg6pf f6ueafaq 4ch8dhr nqsm5uydajns9"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831461/questions/667462082","answers":{"choices":[{"position":1,"visible":true,"text":"hfrp92k576cl 4yjdkhqj0vr9 qx16a oc86p8hhonp5xs fn4lo1wmewe5n7 sue7kinfb6 8qpyh auccq7xlw1b","quiz_options":{"score":0},"id":"4385176734"},{"position":2,"visible":true,"text":"lqon4mp qhj98iee7o 37f50nvkrs3va 18vxkbch636kh yn8ih 8jxqpq03v 6j5lurdu7c17 knmjb3 0868hyuu7","quiz_options":{"score":0},"id":"4385176735"},{"position":3,"visible":true,"text":"obj26 pb0pwmt gxvk8isp04c42 77ocbs1 y7jyxsbl vbbtsy d1t8el31vu7x6d r44iyhr2y810o0o","quiz_options":{"score":0},"id":"4385176736"},{"position":4,"visible":true,"text":"yebv8qvq dd5qeecs45k 2un02jrywfqf1 u96tcry54cxiyu mnbgr2mqe a43wm7 1rnggj b99hudv2g0kgor","quiz_options":{"score":0},"id":"4385176737"},{"position":5,"visible":true,"text":"b6v1txm65a40 h1sah8 84enie0e 57clim 2eew4","quiz_options":{"score":0},"id":"4385176738"},{"position":6,"visible":true,"text":"d88o04mls0oddci d61gj k4acpqp r3ugg2t1e55s ldb3ll5gjkn ruerq4w4w95j649 c3bea007si4t 4jp1ctllptvfao2 m78584fllehmi b9fpb","quiz_options":{"score":0},"id":"4385176739"}]},"page_id":"168831461"},"emitted_at":1674149694692} +{"stream":"survey_questions","data":{"id":"667462084","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"n6y1nnlv45movkl vkjge u5wp4unnsf cp6y14e"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831461/questions/667462084","answers":{"choices":[{"position":1,"visible":true,"text":"2ak2bbt6l 958nphvdetkv4 ycoevsx u49by0 eohbcorqyd2fk","quiz_options":{"score":0},"id":"4385176763"},{"position":2,"visible":true,"text":"6lnrx0h 8rtivmuwxpy8wv ebygucb3xu1m42 iyep7ijy4gu0mvl s1oco7cxc0","quiz_options":{"score":0},"id":"4385176764"},{"position":3,"visible":true,"text":"m5ysyahej9ffbl hiob9pqg7je5r oqyup1bmda i142y odbg2sgkibp5a5n","quiz_options":{"score":0},"id":"4385176765"},{"position":4,"visible":true,"text":"r56bqr7ts07qj7l 0odv2rxnmffpw ctmr30tp61ibr l64xab0cs nmqjd 21rw3b cy2xks0me55b05","quiz_options":{"score":0},"id":"4385176766"},{"position":5,"visible":true,"text":"wjnn6f 4at64hj rif45s1bu9asypf vmjw8wv55isa 87va6t705w","quiz_options":{"score":0},"id":"4385176767"}]},"page_id":"168831461"},"emitted_at":1674149694693} +{"stream":"survey_questions","data":{"id":"667462086","position":5,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ikhsonq7 fadyfis1w 1qmo7d2wgcq 5nht9h9j esydnd1m a5ehikxk6ypubk dtanss721p6"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831461/questions/667462086","answers":{"choices":[{"position":1,"visible":true,"text":"3p8dvrh6lr0 iejlsiah ch3n24c7d9tt 7w9rvdkxpqe8xh fo9jq7k8sa1 er31i44d633 xurs2ie khm8mmp5d8gc9 egn43 86jj22","quiz_options":{"score":0},"id":"4385176918"},{"position":2,"visible":true,"text":"r5qhjy06onu7loq n6htekeur 2xm1jh99 ibsp4oat8878fy 940xq9 n4tmuhn e5901s317nbq pevqvednus0ph8g","quiz_options":{"score":0},"id":"4385176919"},{"position":3,"visible":true,"text":"at4b6f9tud4tvpl uf1d5p jgci9m0u17qkj 8tmdkc9o lb7b63gth6 6ds89i5 uu91pd2ybc wwk60i ntwtf5enlg5h8o","quiz_options":{"score":0},"id":"4385176920"},{"position":4,"visible":true,"text":"ovrn2np gg0nxt88wji6fp ckphrf1l3 0um296qkhvgh","quiz_options":{"score":0},"id":"4385176921"}]},"page_id":"168831461"},"emitted_at":1674149694694} +{"stream":"survey_questions","data":{"id":"667462094","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"uhxc9mpgrh9c9aa 05iqvfqi y8rip1qcmmxh b8jj5k cavri2y5 1sqge 7ywuxm3awoh ddul9pvje6dcr kggd2y4"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831467/questions/667462094","answers":{"choices":[{"position":1,"visible":true,"text":"t30umxtof3b6e 9o88p i9hcrmm57pq42 16pnnhw idraibx70sby1i","quiz_options":{"score":0},"id":"4385176959"},{"position":2,"visible":true,"text":"xnxw9wa4fo 157vk4i0d 1m9fluu gmmy39m41 icu2b548yd9p3o 3yj0tyamvyjci1 1c19qkbuqb031r","quiz_options":{"score":0},"id":"4385176960"},{"position":3,"visible":true,"text":"ehjwxib3hha9 bjj11etv shhdikfh1iy0u nioigschrcpqi2 v7mgatm l98c4no7k9 bf2j11cmi1dgbt2 f8etga4g kg2w2yngt62","quiz_options":{"score":0},"id":"4385176961"},{"position":4,"visible":true,"text":"uyqt6g2o61rc wcwn8q7ohbhegr wtwkdefljgy uli9v6","quiz_options":{"score":0},"id":"4385176962"},{"position":5,"visible":true,"text":"7pg26slappuq1 aw3vsgc4317be eqe9a8v6s5whg0 dvrw9imoe o9wl91vi282 4h7f26","quiz_options":{"score":0},"id":"4385176963"},{"position":6,"visible":true,"text":"wjipnxgtewp8r ddtad8 yqo4rj5x657nge ykw2qghp3e r3tqrvk1m7l ir60pwi5g5 h7exqf4","quiz_options":{"score":0},"id":"4385176964"},{"position":7,"visible":true,"text":"aafwgbh80 ip6mgadg 8ls8v4ss2fk4y s19ti1jvfnaey g0v4qdn ifk0ve j2trlbjolhuc3 op07p93t1xsh0 kqiw7s ktofe9muryqxe","quiz_options":{"score":0},"id":"4385176965"}]},"page_id":"168831467"},"emitted_at":1674149694694} +{"stream":"survey_questions","data":{"id":"667462096","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"hh8r3c6evhaj2ug 34w4tpf8 b41jtyj tn7vh1hwl 7rrs5 p5rct6v9pg7k 7nw3etg9"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831467/questions/667462096","answers":{"choices":[{"position":1,"visible":true,"text":"4jlthohsbk gq1uy9yt 83htjom d5udup0g0jfsido a6nxtc2vkdn 7tfgt9 6e6wsq","quiz_options":{"score":0},"id":"4385176968"},{"position":2,"visible":true,"text":"nt9b0e1tk eq9ckgs2u2fiu probh n7929oe950jcs7c uvdxlffx66obu 6oschegtcq q2a7d hwp71gp7 s3b03f5p3g24h","quiz_options":{"score":0},"id":"4385176969"},{"position":3,"visible":true,"text":"u1p9r on01v021jli y4n4d2gpcbvk fe3y53pjwje6ms atckrpa2r44f 5lkaim1 coo8gs4mer wfbusogrereep 3r2i1qlkh6097d1","quiz_options":{"score":0},"id":"4385176970"},{"position":4,"visible":true,"text":"i4liv68323s xc5i56ba5pa osxulquad221n xbmov jnhv1ogkdw9","quiz_options":{"score":0},"id":"4385176971"},{"position":5,"visible":true,"text":"tlinp 6b4ig tcw2f9no5xm7stv qv6l4foeesgh","quiz_options":{"score":0},"id":"4385176972"},{"position":6,"visible":true,"text":"jfxlbnonc tee9khi75t0ah wr83dgnnsc0l pvyf5t266eq1ev","quiz_options":{"score":0},"id":"4385176973"},{"position":7,"visible":true,"text":"rv7aly5o19 y3hvj5byk uojji58u9thv w8dnv stba3pan 5yho9m1f3o097n7","quiz_options":{"score":0},"id":"4385176974"},{"position":8,"visible":true,"text":"0kmmyvxkq0ixg wmm2bnydk3xg nf2e5e3fn4e 0jd59 tu9bib d6i9t6 3ikku8yd42gnt 0uusc9kip2w","quiz_options":{"score":0},"id":"4385176975"}]},"page_id":"168831467"},"emitted_at":1674149694695} +{"stream":"survey_questions","data":{"id":"667462099","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"952l4noismh4 jwlr6yhgbpo 9waador5oikm xg4aqk0w5o08j 7bg3d02bw22df 84xdy6eq34snqhk h4ngqp6rpih4 9jevsisqvxcv"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831467/questions/667462099","answers":{"choices":[{"position":1,"visible":true,"text":"lknhasa3eu03sf p1uflsed0h3sr q1b0gmga v8swv5rbv","quiz_options":{"score":0},"id":"4385176976"},{"position":2,"visible":true,"text":"u6hdwwqb4cc84s8 8jo8vmqx7 klsxteic7f 9m3mg59ov s7npsi1 89i5dq8chb 919k2r7u0t","quiz_options":{"score":0},"id":"4385176977"},{"position":3,"visible":true,"text":"xjpll0bpay536 2ex024o9rd 7boywqww rktvkxinf9fmoh 7d9cb06es933e jm2hsgge2cjy5jj 1ecnm8shkp a3flgyb gcf1622ijpsj ydnun9wos44","quiz_options":{"score":0},"id":"4385176978"},{"position":4,"visible":true,"text":"n7q0ogrerpn8dl qmip86lbe sl1xjutnlap7 3bov7 5fihf81ek49s 9p0f4 r1rptp","quiz_options":{"score":0},"id":"4385176979"},{"position":5,"visible":true,"text":"kwdbb5 hi349arw9 r2f0df eee097e k5035hpewmi6 ky0f9 kh7oio2u0bilxue 5l0moimxob7fid oeno82n5rkplm6i","quiz_options":{"score":0},"id":"4385176980"},{"position":6,"visible":true,"text":"finhomjk 48ciiw7x1g2f c50x4 9kenej45r","quiz_options":{"score":0},"id":"4385176981"},{"position":7,"visible":true,"text":"e7ravpe7reoe5il 9kgwh794cl9x0w snp3wnpq1ryga p4vpk03q7","quiz_options":{"score":0},"id":"4385176982"},{"position":8,"visible":true,"text":"ao3rdw8o5r0xvy x07pd7op60cce ylfrtqpvu81e3u 3f7jtv448v mfoeywlt","quiz_options":{"score":0},"id":"4385176983"}]},"page_id":"168831467"},"emitted_at":1674149694695} +{"stream":"survey_questions","data":{"id":"667462100","position":4,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"onm04qqjiu e5hh4bm1nrm 4lql830cednt4y m4vd6n kk1rvup ghucvtc uw8xrjg6 u6giu1qxo oywqk5fc4elxs"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831467/questions/667462100","answers":{"choices":[{"position":1,"visible":true,"text":"n66vr4n4vn w57cw3jovcl9 9xhjvp8 mkuivep2954e71r","quiz_options":{"score":0},"id":"4385176986"},{"position":2,"visible":true,"text":"dncqrcm vkp1wf2u0d9j 9o2d4ag7rwt827i wo23d8v14j1e3p 8wty8ixwwhnc6 huw4we49ag40 fruxk5p9080lxhb hjvf468vja8rcxr","quiz_options":{"score":0},"id":"4385176987"},{"position":3,"visible":true,"text":"54u3kd450tpm i9jjwlr8r3xbduw 3k1ic1tg4 4tijdweafs ypprmy7wcpxeg yvvc4l19sd5p gmleu45","quiz_options":{"score":0},"id":"4385176988"},{"position":4,"visible":true,"text":"a1hrtqesu1ph 88spqcx6hyo7 dt64okx798gal cy3tbwljajmrr","quiz_options":{"score":0},"id":"4385176989"},{"position":5,"visible":true,"text":"ehg03 uyx121pwsyo 7rhvgcdfy2st8p 7ahaiboegtn5kd iu8bkj3imm3eo8d k2s2gg4g 2ys9hfx 8vpui26opm6n vsf5rfq6tqi2 jwxoe4suo4","quiz_options":{"score":0},"id":"4385176990"},{"position":6,"visible":true,"text":"c7lxx90luvc6y ogvbopnx 12v4swfg lofg3gcj dq1r6s8ptp5qho h04pqe67tbcnno xhyh0rp62kqkb dvtuwyu u89ppkdl876m","quiz_options":{"score":0},"id":"4385176991"}]},"page_id":"168831467"},"emitted_at":1674149694696} +{"stream":"survey_questions","data":{"id":"667462102","position":5,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"bwurewbkcd12 acvusgq 3u00c224nnv iyfj31 i9qtkl9tolx2fjr"}],"href":"https://api.surveymonkey.com/v3/surveys/307785444/pages/168831467/questions/667462102","answers":{"choices":[{"position":1,"visible":true,"text":"m6ihyhdpxt1 0xf9391 y8wvcnlw tfvxn6m 0bswb5w5p4","quiz_options":{"score":0},"id":"4385177002"},{"position":2,"visible":true,"text":"2kdjxc93o enx72tbxki oj43409eg90kt1 5fbnj d8rvo5c7a7vrgf 3c66h1 guo3c x6uv8kl qy0ttl 8r8dgqope","quiz_options":{"score":0},"id":"4385177003"},{"position":3,"visible":true,"text":"h3292 dtp4cjf11njvbhh huvgv1 onie86 tvdr09jg2lvp","quiz_options":{"score":0},"id":"4385177004"},{"position":4,"visible":true,"text":"16ua2fvav 75q7b2odhv fbw0xrnfn 2t3ivdrphr agrq241x d447hwdy rxa3g9gwe23","quiz_options":{"score":0},"id":"4385177005"},{"position":5,"visible":true,"text":"1dl0nhl0bx 7v1hc ooiv3gogf nxecupy","quiz_options":{"score":0},"id":"4385177006"},{"position":6,"visible":true,"text":"97geexnx4ussry4 s2x8sduenrfgwq y4s8f5v e6nrx0st23b f1xq1ax2xwl6yl c1to792d3i l0aq9 92s0aix8l31n5 qnnn38brgah","quiz_options":{"score":0},"id":"4385177007"},{"position":7,"visible":true,"text":"cg3w94v47ecgrik hviug 5xub14 808gw4 g0j3vn 5y58dv7vn8r5 xg72mp91 2l4ubwdo1wrw0t6","quiz_options":{"score":0},"id":"4385177008"},{"position":8,"visible":true,"text":"t92n3lmvuxaf5o5 29jh4afc h2wvqr9xf1q4w 27xf5d9ij1on qvbuiu7 8oghx0dt3nr5 g1mw6f9y6 muu0hhili","quiz_options":{"score":0},"id":"4385177009"}]},"page_id":"168831467"},"emitted_at":1674149694697} +{"stream":"survey_questions","data":{"id":"667461468","position":1,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"fn1i25upg io6aniuf yrrrp8vt07fo19 48d5ol09146s8m ldy0ebojp819g"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831345/questions/667461468","answers":{"choices":[{"position":1,"visible":true,"text":"t56ghqeix s9huggwiub4 7tqxa1m0h7kj5 yk8r2 0f65tvl3fnpo 0gebiihpxcovnht","quiz_options":{"score":0},"id":"4385173226"},{"position":2,"visible":true,"text":"5o75tse0c okpssn319qiklp 5uyby90fx7n slfgxco07i ejp0kn xmr7ghykkxbypc","quiz_options":{"score":0},"id":"4385173227"},{"position":3,"visible":true,"text":"qe6tkjiccorb lxdmlb30 jmh6j4d6p vces42b344ry gbgmssamx0tvcs 785dl brkbvpl3ctq4nj2 yjjy0hh9b4sr yq2v7lhwtje33x2 7pbqmqgul4gqg","quiz_options":{"score":0},"id":"4385173228"},{"position":4,"visible":true,"text":"lyn712e8uyrrar 0qvy855feo 5l3egg 6t5uin58qrj1hj","quiz_options":{"score":0},"id":"4385173229"}]},"page_id":"168831345"},"emitted_at":1674149694802} +{"stream":"survey_questions","data":{"id":"667461471","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"wcrsas 0v14j5i3e8eb2an ymydb45sqwsn g8j35s649o3rq g582wdp eoraxaf8dc7gf qtdw5a27iucmesj"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831345/questions/667461471","answers":{"choices":[{"position":1,"visible":true,"text":"nd18cy2gv u2bvpyki k0f38w8 qtlqut6ttsdyk83 pptqq84jmec6bfd a1aks3iy0i oykgg4gv0 busn0o8cc","quiz_options":{"score":0},"id":"4385173236"},{"position":2,"visible":true,"text":"mbd0ll7jes0qm 02w87s60 jslfxkj7yeh1 ol4yj 405yk1b kddsvxnk4hsw7 v1t7q9h8k26rt","quiz_options":{"score":0},"id":"4385173237"},{"position":3,"visible":true,"text":"jl49hsj6tjdf aq1njo56no2 f2gw9 eyqqekovg0c7ov kwwlc9b77 i4yu6aa7uxu","quiz_options":{"score":0},"id":"4385173238"},{"position":4,"visible":true,"text":"5v78pcotkwvvlr 7gvcf3xsd1s2 1y6oc8df 3n3f0 d3cg8ihr3ox9qdc rnyw7g 0lv7p6bka ia0p1tqjcew","quiz_options":{"score":0},"id":"4385173239"},{"position":5,"visible":true,"text":"xtha0tjj1 1j0vri su2xvilf9734 te51yhl03q558lc","quiz_options":{"score":0},"id":"4385173240"},{"position":6,"visible":true,"text":"w4st1 gljqfop06 2bu4fs7b fiia7kj22xl0i4v dl88vjnwo3pf","quiz_options":{"score":0},"id":"4385173241"},{"position":7,"visible":true,"text":"ivfna3y9ru jhxob vuncvdavfek1dsd 80ha2m2 8raod4lyb40 3r895onujni4onh xm9h0g6di g8e735xi ax62ju3eihf9a84","quiz_options":{"score":0},"id":"4385173242"}]},"page_id":"168831345"},"emitted_at":1674149694803} +{"stream":"survey_questions","data":{"id":"667461473","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"xc4wjnko0i6 g7p33u41n 1tjsntksw58hn4 ewweiwcgt 58rs9ek5qi1bgvx"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831345/questions/667461473","answers":{"choices":[{"position":1,"visible":true,"text":"t09fsskd08sl88r 36sh46a2jva sd91wxy 5dncy1vabsf yfkliw o2spc5k ud2oktdabb7bv l76he8ba3y6 1veap0sd vh2aeoqb5","quiz_options":{"score":0},"id":"4385173256"},{"position":2,"visible":true,"text":"fvdf828g92n4cr4 jt9qg8529uihyge n69seyn8haq ido6m3","quiz_options":{"score":0},"id":"4385173257"},{"position":3,"visible":true,"text":"4n2rpc6iv82cene b7pvp 9fakf0 qmfrbf3","quiz_options":{"score":0},"id":"4385173258"}]},"page_id":"168831345"},"emitted_at":1674149694804} +{"stream":"survey_questions","data":{"id":"667461476","position":4,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"wojs6fb lri4g 9cd8kjrhy9rd3 j9s5e32o8i l82xpfkqgwhj jma6htdue e1kk3u071rcef 9ivvnisv asaqww"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831345/questions/667461476","answers":{"choices":[{"position":1,"visible":true,"text":"j5lja4pu f0iq7pnkrk 9pra3hkah6abp 92wxt7ox6c dcukwklc k46geqe 2xk4g405p39t62 516tsgu xes5tkhjts","quiz_options":{"score":0},"id":"4385173268"},{"position":2,"visible":true,"text":"1l04q3mtxn75 t7ghyls2hqug j2hu42 uyoecoks6edsqns 57ya7vtyoyt u6k0gtnmf 1mm6wtektvp808 fkk89 qqprq k07oheboie1tfhs","quiz_options":{"score":0},"id":"4385173269"},{"position":3,"visible":true,"text":"9kvc37 gqyklsggws9 db070xge8y7fjr qmdym3ft1jp 5rh1txs","quiz_options":{"score":0},"id":"4385173270"},{"position":4,"visible":true,"text":"y9obh2bu8yk7e94 0ftyrjtcxhicd4 iobxi70wog4vf uokiplls1e ah0g8v mpsslhisijk lmomrov 07cfwh auqwaujyytig","quiz_options":{"score":0},"id":"4385173271"}]},"page_id":"168831345"},"emitted_at":1674149694805} +{"stream":"survey_questions","data":{"id":"667461498","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"0tljucg0y3kh l2fh1q1i umeldoo665wgb 92c0k ldeevedeust7pg icrfpt7m1cq l6sfwhhk3vtql qpue297bcaeb7 yrn4gauy007n8q"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831345/questions/667461498","answers":{"choices":[{"position":1,"visible":true,"text":"8lcirsh0a t4ydqb06w0pqv 54k3qmnrjdyf j3ebgxwih2m4wa calo6wrbt 88n96xatpw3 hxaq56r brlwuuymmm jc5psliso3joc aoa41qwdhm0inny","quiz_options":{"score":0},"id":"4385173412"},{"position":2,"visible":true,"text":"bxc3u7guumu w525yaov3om5 3n0ld61 bhlpnw e252afl6giiia 56ybyswiyivgqs s1svdd30gf9kqks 522nxgw3obgj","quiz_options":{"score":0},"id":"4385173413"},{"position":3,"visible":true,"text":"dc3t2djjjqkvmfi cu7osl pxtlaevr117irr ji3qcr","quiz_options":{"score":0},"id":"4385173414"},{"position":4,"visible":true,"text":"qqr9ksi gob32wx p01fp4yqobput39 fryunx r020wh2ctxg 7hxy9g8m9m nuqel75h vwr1mjecaopo1hi o9fc3o","quiz_options":{"score":0},"id":"4385173415"},{"position":5,"visible":true,"text":"cf6162qvdywm crcubxjk5m5ju 7vhy5q5kj4j2q 5b55n9h w9v6c9n r7m6xx","quiz_options":{"score":0},"id":"4385173416"}]},"page_id":"168831345"},"emitted_at":1674149694806} +{"stream":"survey_questions","data":{"id":"667461513","position":1,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"18i8lhabavlr 32wsccj5f rx8pvk4unsgm7r s5x7es2uepdb 96xgtjo7voy08d7 n4e9p fayts khd1nb8pow rpjp6"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831352/questions/667461513","answers":{"choices":[{"position":1,"visible":true,"text":"b0wj1y3wel57 ktqj3mdnpi dhr0k r3tasjvw 5mx1wclhjj","quiz_options":{"score":0},"id":"4385173452"},{"position":2,"visible":true,"text":"qott2n8w37qaai 1qn102yos4 imupcls4nm th4ob4","quiz_options":{"score":0},"id":"4385173453"},{"position":3,"visible":true,"text":"9uksb 862xwr8j1 6vxdyc4 goi32thkhq93 helvbkt266nnrw xvit2acd67olt pvvkx","quiz_options":{"score":0},"id":"4385173454"},{"position":4,"visible":true,"text":"ees3ivm7fphpd 9jj95pohh4 8sc972k8tyxk ge9j787 nxjkeee670jiec o36kcvbluxrp03 mb4e0et0qwqjxyc d13juonhq","quiz_options":{"score":0},"id":"4385173455"},{"position":5,"visible":true,"text":"294dtkjuyn ttbf6ikcy7s 84hmb t17hw 82aljhi8fwnf65 usuwl5d7ytrca x52ehyic447miq isobapv 3gkr1 2wphdit0p","quiz_options":{"score":0},"id":"4385173456"},{"position":6,"visible":true,"text":"nc1kush2rbxkqrr rhbdvjy xn4au2o0o94 xjq5ll","quiz_options":{"score":0},"id":"4385173457"},{"position":7,"visible":true,"text":"mh1igjt m7gteqlf8 q87g5gj n1g1w7s80","quiz_options":{"score":0},"id":"4385173458"},{"position":8,"visible":true,"text":"sfnq7n g13n21dx5cy aky2s t6h2y8j 5rbdufdcu7i ji8jgrcanxhxv piyrbdr72031gh6 7nna7 gn4gfqo3o 9tbatn8r","quiz_options":{"score":0},"id":"4385173459"}]},"page_id":"168831352"},"emitted_at":1674149694807} +{"stream":"survey_questions","data":{"id":"667461516","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"7gnta43 5s7jfw8axcw3tkf vkg8bmasyo6u 91wwhy c1pae9eu342 3tg0jl70wuoc9 yyxo4v8se myu4ls9xoaiqsep"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831352/questions/667461516","answers":{"choices":[{"position":1,"visible":true,"text":"qfjo9n 5a7yv16lp71 ow2bbt3n2ke 0jb1xfpxf51s1u f4k77hkwmu wprku4 55311lxm0wcpw0 c53g4v24","quiz_options":{"score":0},"id":"4385173473"},{"position":2,"visible":true,"text":"j4n9jfdyr4cgs gfc0c a8trns3c4m 5mem4dona y097q wxpm5 q4gqos2ukx ufjxck1lmi1nn1","quiz_options":{"score":0},"id":"4385173474"},{"position":3,"visible":true,"text":"4kb04jje8c8d m12jddaa1iljt fr4qqhj 579w6 6u57xdn gaduvgl0u3 887ffq2vq9b58 q4r02mfsjdx6 3v8yskph8uyu srpxeiuxm0ber3","quiz_options":{"score":0},"id":"4385173475"},{"position":4,"visible":true,"text":"biom7l20wjpvl la1rwpf51ia1ex 23gosg8xvae87 ev2iaj4bo c2581d1re2 93rl9 tmj3467ajulb","quiz_options":{"score":0},"id":"4385173476"},{"position":5,"visible":true,"text":"om88wcjqp6f 5fn54j nmdg9 1sriyr pt6p1h4cm vkdmgxanhh 96847e1mgp l8b2t jl8oxa ifs1c","quiz_options":{"score":0},"id":"4385173477"},{"position":6,"visible":true,"text":"l8bo1yes158 w294970vmw33c yp6x582 6sa834 j86xhb qfm2f2 tj7gt7g xkgtymut","quiz_options":{"score":0},"id":"4385173478"}]},"page_id":"168831352"},"emitted_at":1674149694808} +{"stream":"survey_questions","data":{"id":"667461517","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"uy1ifum6sjcimr he9dly7g it4v8exuhulo ffdod9aof90 9cdfum2phl11nin 5habw5hvuj9pqio ce6ftayekj"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831352/questions/667461517","answers":{"choices":[{"position":1,"visible":true,"text":"gd5221owwi1 tjya80m2al3k62t xq0sa9fp leyp52b5ahghpaa","quiz_options":{"score":0},"id":"4385173481"},{"position":2,"visible":true,"text":"lk1rk9 94xju3kfoc1w5 8dybd90 9qdq98 rxu5edq9gs99 kks85ifc03qye","quiz_options":{"score":0},"id":"4385173482"},{"position":3,"visible":true,"text":"ykpin7yh wv14vdjfwf0l 295s1en8cwa2 s6vafhu1fops 8k2vvkt9pftfc2 d1jxuoudjb 614hx251hr6fouy x3w49ql1 7b50ohc76","quiz_options":{"score":0},"id":"4385173483"},{"position":4,"visible":true,"text":"dewxv4aajhaw yij71ndhch8 76bjhg71csdc4w 5gn1l cmu7yo vdn7mtuy 6oplwmikjyvv1bi l3kw7j","quiz_options":{"score":0},"id":"4385173484"},{"position":5,"visible":true,"text":"kuoin09q0 lm3vqjykpb ji7lrp5ylkt58 qb0mhh86kcgm crjjoqq gvfejauprgj mlsjegwm 7psv8r4tc4365j8 98t96g2ifjm","quiz_options":{"score":0},"id":"4385173485"},{"position":6,"visible":true,"text":"5c8y8 f7droof ha5vfclhyivm6kl bfylm txvwxasx1j9l qpyifm4y qwhcsobdo 3ui2qts 97h9i1v5jv5g7","quiz_options":{"score":0},"id":"4385173486"}]},"page_id":"168831352"},"emitted_at":1674149694809} +{"stream":"survey_questions","data":{"id":"667461521","position":4,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"pgb7ltsb96ed dep0echkqixfc l4rcb230c wl14ohr2hre1o fn94g0r87nde"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831352/questions/667461521","answers":{"choices":[{"position":1,"visible":true,"text":"55yon1b4lyavl 6v6trvxwrc8 s1hwd2 d4hrxv9tbga9e0","quiz_options":{"score":0},"id":"4385173492"},{"position":2,"visible":true,"text":"x8ak4mn2 601o7cb6qnhxox2 k8q23 24nb8q6tx diuko kre6p82em vrf8yxch2 53klbp1xtber s29v8xwbiqm4s8 trwpy6qd1464q","quiz_options":{"score":0},"id":"4385173493"},{"position":3,"visible":true,"text":"s1pxp wsngl9et r2o40 18ltd3 r1b8qpyqskyx a94qup","quiz_options":{"score":0},"id":"4385173494"}]},"page_id":"168831352"},"emitted_at":1674149694810} +{"stream":"survey_questions","data":{"id":"667461526","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"q859nk 369qqyw7scs77jo 9ji0c9vow2uv yjucgiioytvwm x0x95w 222dyntjt8pue 1ndsg06k"}],"href":"https://api.surveymonkey.com/v3/surveys/307785394/pages/168831352/questions/667461526","answers":{"choices":[{"position":1,"visible":true,"text":"tnea3634 p2lnkyut0h yllu3g pufn062o 2etbix7jtgiqx4","quiz_options":{"score":0},"id":"4385173522"},{"position":2,"visible":true,"text":"0qf4fyco1ea itos8brey3wgkp xje8mlffe4m8wlv a9b44 jgmtf","quiz_options":{"score":0},"id":"4385173523"},{"position":3,"visible":true,"text":"hc4a1wgbqqryji 4x7enmw1nam8o1o yn3nxtni y7bwpr wm1oww66f5ox","quiz_options":{"score":0},"id":"4385173524"},{"position":4,"visible":true,"text":"0giuwu7l3v 5ufp8 u3mupcfr0 r8977cguqc2 hrfeq0ug7wo0 fjmkook g8up66tqb7shgg","quiz_options":{"score":0},"id":"4385173525"},{"position":5,"visible":true,"text":"xp5qsik ipf6q be83j63io 5kw68q bwb1mxf gt4l3besb ikfckl9f f3lgigcoib t8wa3hjgn00 csln5ikv2a","quiz_options":{"score":0},"id":"4385173526"},{"position":6,"visible":true,"text":"ai0mef32co1ohl qfwbhctboxq89ye u5v2kyq ebo7e 2u7q9yvlgd1oc 8uxx84l65n7lf0","quiz_options":{"score":0},"id":"4385173527"}]},"page_id":"168831352"},"emitted_at":1674149694811} +{"stream":"survey_questions","data":{"id":"667461529","position":1,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"5c2dy1fcqn80 athbhqoadncx3n v1lt9m7799 6s154slj6ga"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831358/questions/667461529","answers":{"choices":[{"position":1,"visible":true,"text":"rqa77mh3qxuc 6c5uywhchx1bgd f6or0t6s ds7hiuwb3bu9 u9x2d8hs 52pocgqntfeejo4 oaryhk woq1xb7akj","quiz_options":{"score":0},"id":"4385173536"},{"position":2,"visible":true,"text":"hxex6h1upkfw81 pad50wjl 8fo1fiqvtqfe 3xg4xms66g6l luckdtn1 udk8r284o iwpvh21 xotxpvww6p29 4gmqucj4 my8vynnaemow89q","quiz_options":{"score":0},"id":"4385173537"},{"position":3,"visible":true,"text":"jyb1qcl8o2gtte jlwtdhkxh65a9e q6xfymirg7g 24hkqyd0x0 9w4wb4dostk 6i8s8mh5 rxmq5y8ti r99xgye0urvl bdq2598nnha o6gaqqdvg5q","quiz_options":{"score":0},"id":"4385173538"},{"position":4,"visible":true,"text":"qtgjiim109 xoslnipbfe v28m271knt yquk8m2j96w6 xff8kw1 1jhr5l14","quiz_options":{"score":0},"id":"4385173539"},{"position":5,"visible":true,"text":"me39vca xqytbsfb 8uiad g1elq77xy1 tv88etyc gj1g8580e1lbmg4 bjnj4es","quiz_options":{"score":0},"id":"4385173540"}]},"page_id":"168831358"},"emitted_at":1674149694919} +{"stream":"survey_questions","data":{"id":"667461530","position":2,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"v2whrhb82ev kvvqlgl ek50nx1ar9 a7h4fo9xuaynt2"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831358/questions/667461530","answers":{"choices":[{"position":1,"visible":true,"text":"e8nxccvdcdm 6wfcehdl1 o7g5ce64yvs efob6e 9bj7ny6aipb 4dc2wsqwtr6u24 xsxa081k8 4fyis3oyl9t42 lmu0hhgj4ok24m6 fg0p0lt","quiz_options":{"score":0},"id":"4385173549"},{"position":2,"visible":true,"text":"a5cw9gn7fy95q 8ui6bhr1j0djvtl sr2o8a3 kojha7w 1itxl7twgq avmrl2q5jbwds9 gva3tqhpgk8y5 v4aylod k5ci4cngn6h44jv","quiz_options":{"score":0},"id":"4385173550"},{"position":3,"visible":true,"text":"s3s7w5clw y2uvtas6qhvbk qc1vwrlyi2bk goqfgfe1 1ayx9l73nb78dq a0ykwprnx8gxm1 xn695vlym9rt4mk","quiz_options":{"score":0},"id":"4385173551"},{"position":4,"visible":true,"text":"c4qwlt8a dgnsqhqut5cy iq1htk kitbw 5mwuqxv92w70s c8hxelnesk 75craldvy4w","quiz_options":{"score":0},"id":"4385173552"},{"position":5,"visible":true,"text":"qp2pgo2f63 wmlcuryftjwedj yq0xo a1n5ayjf jikmqnf4mdbw 02r05wsu14a146b","quiz_options":{"score":0},"id":"4385173553"},{"position":6,"visible":true,"text":"ootl4 kp8ae6ggbjabg hgusbwsla83 rnl7dnuqo","quiz_options":{"score":0},"id":"4385173554"}]},"page_id":"168831358"},"emitted_at":1674149694920} +{"stream":"survey_questions","data":{"id":"667461549","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"sn8gp1r0uc1og wobjh 6x0e6t4wug m6466nxyawm k81p20 883oi8u wgeeiqdcmxwa1rt mc0fnojb"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831358/questions/667461549","answers":{"choices":[{"position":1,"visible":true,"text":"wy826 0uog090ox923 2m3arldq 9v6wr7xwvxfk lbxye5v0svm7 93ji5 vkfvxgr7iy 1r09yxnkpjm23 0bbktk3rfg0bscf","quiz_options":{"score":0},"id":"4385173656"},{"position":2,"visible":true,"text":"krqy1l9f dj0wppa p93gk rvffc v6cfo0 o1areevq8 jbhm4t gcc224tu 3thelsk2","quiz_options":{"score":0},"id":"4385173657"},{"position":3,"visible":true,"text":"f1cpwqowl4ju9 43sdy2 qdqyqw17lxw2v enee166iohhy kq5khb6s r3pucoufnsh hrhcpt q4ukten6scjuvg ldvapiy bg61mb0pf8ofd5i","quiz_options":{"score":0},"id":"4385173658"},{"position":4,"visible":true,"text":"eq2hnewfaec e9jxrip xrrkl1wh3rbcx7 23t2bp5535o2e qwjbhf5051mi iqgykvmdvsbqr 8s3wwn8tqc513c 4q3a2gr6uhdvlc 7dr6m","quiz_options":{"score":0},"id":"4385173659"},{"position":5,"visible":true,"text":"jth67q sto4nhh23s op593ly6lw4p1o gxwnyfr4m99nbvc dplgcarhd m24hy6i1d n28tg7mytetk","quiz_options":{"score":0},"id":"4385173660"},{"position":6,"visible":true,"text":"rlo3t 7ppem2 bx29gt ucqxmy0 jm67u2dynhq iqfpiyufxif 8lm6ydc9u16rj y7ombxa0meqr2","quiz_options":{"score":0},"id":"4385173661"},{"position":7,"visible":true,"text":"vijhvdm7x6h6 4swh9tom vcr06ugp1hl6 50al5 3ndajrt9ilers 2gnm8il0h ry9dtv jqpu16b0ukt qsb5rqrnmglh arno84j1kroy3","quiz_options":{"score":0},"id":"4385173662"},{"position":8,"visible":true,"text":"3ujkb4krosaln 4lk1ckhounns7qy ap07a65ruvnjed vygxbabompj8dn op8annyrush8v p6t0nd2qi w4pp18y4x lljwuc ubknhjf31m6l1tu","quiz_options":{"score":0},"id":"4385173663"}]},"page_id":"168831358"},"emitted_at":1674149694920} +{"stream":"survey_questions","data":{"id":"667461551","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"jf7fw46e14 vd9x8vs6f0av npyn7 ymxbaq24mqtvj bci1xcln9ch6302 eeghuyauh mjkw9hkx0oooduf 0ui0l93x 6m5tbpl yoplf8cqmbl"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831358/questions/667461551","answers":{"choices":[{"position":1,"visible":true,"text":"rwk1x rtfy9upgpmj xkawlfe0vo8 3ounnnx3e9rl2d4 e8pqns3nwx pr5st9qy o6yi4klar9onlp innrgi2ua3f","quiz_options":{"score":0},"id":"4385173675"},{"position":2,"visible":true,"text":"pcupu8t3iodmw34 67g78ktu6rmr6nq 8nph4ohmv 9xtmtr2a7p9 6rb6h6","quiz_options":{"score":0},"id":"4385173676"},{"position":3,"visible":true,"text":"m6xlaj5xutmgw l08mgyjovq 6vk9sibk r9am0kbr 9qmm4d18mxnx u1sw4to 3a8ek ekp479980 hbuxaj2bf sbio7yw7","quiz_options":{"score":0},"id":"4385173677"}]},"page_id":"168831358"},"emitted_at":1674149694921} +{"stream":"survey_questions","data":{"id":"667461553","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"uue1b3 s4rj4 dawj4ao j5xhorntprj5p9s obfe7 y47vcjc s2gp2fh6 oysg9o5"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831358/questions/667461553","answers":{"choices":[{"position":1,"visible":true,"text":"bf1i44 xxi5e2h7orevv2 d737wgpt4pu3 pmbeixrmvw1 ya3ww2x gpvmeo04nh5 sx2a7ey cv9ldq57qkus","quiz_options":{"score":0},"id":"4385173678"},{"position":2,"visible":true,"text":"ocmcxbjsqw o1vr3t 8fhpimedvui rn1hqm5m559bcq kw3138dxm77 vsdor8m v55p3f tn721 l4w4a6j3c","quiz_options":{"score":0},"id":"4385173679"},{"position":3,"visible":true,"text":"sme3nthgos 7c5bv0n80ymsa7 x02op26 jjum7w0s7lt2ll6","quiz_options":{"score":0},"id":"4385173680"},{"position":4,"visible":true,"text":"3p2mj4nlrsgu4d 8rygmmsqqxm2pl6 yshbvwq l5mcc5a kdpqvuul","quiz_options":{"score":0},"id":"4385173681"},{"position":5,"visible":true,"text":"o7ehnkg 134kywmgi wm8jcrpnl45if j86ffs6jfgcp 2e25qvayvwj18pp 3rduk lqjqyar2 xhq7yxb8i9ef6u","quiz_options":{"score":0},"id":"4385173682"},{"position":6,"visible":true,"text":"axh7312qg827nk s7tl78iwcr h1b6pv7hn6 o51sbag","quiz_options":{"score":0},"id":"4385173683"},{"position":7,"visible":true,"text":"onu50gtox9de40 v638eyavt886 mu6y85 6a54r1n9","quiz_options":{"score":0},"id":"4385173684"},{"position":8,"visible":true,"text":"0on3vhb3 94ujem74f4 0git5 fr73t6hds rfc4iyd4gwc","quiz_options":{"score":0},"id":"4385173685"}]},"page_id":"168831358"},"emitted_at":1674149694921} +{"stream":"survey_questions","data":{"id":"667461555","position":1,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"8nym349ifndc4 1ergxvcs rg8nxji7wngvfo ha1fx7qgh0p4m 3tkgf"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831365/questions/667461555","answers":{"choices":[{"position":1,"visible":true,"text":"r7wm8q65rf0ed wj7kk61hjpqrt nkjjva6busq fuhp9098sc6 8ro2p6ww","quiz_options":{"score":0},"id":"4385173711"},{"position":2,"visible":true,"text":"wjxlbkjgaps2 sep73b5ia8yj5 a9wr0gq 9o2wqf7du1v0tl 81u2apxnt ww3588h","quiz_options":{"score":0},"id":"4385173712"},{"position":3,"visible":true,"text":"8r7tkvpljdu 8a667c88iw vtasj a5vacvo6pbxwsw 8in6kb nv2yeug1x 3lv9de7rw8rtq","quiz_options":{"score":0},"id":"4385173713"},{"position":4,"visible":true,"text":"obyau9nl8c9 jj7tk8n3wv1gb qmiuhuql 1m01qx26c213r6 aj6u9iw459er mxax2id3o8iv riondp2tea3 ay77ba gpl30307 440clb21coauy","quiz_options":{"score":0},"id":"4385173714"},{"position":5,"visible":true,"text":"0wm0f2w wykr4 9lcofhvrxdiwlp0 u8yf3 p1bwwa","quiz_options":{"score":0},"id":"4385173715"}]},"page_id":"168831365"},"emitted_at":1674149694922} +{"stream":"survey_questions","data":{"id":"667461558","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"0wjijbi1kwvxt h19om9 kjvx4 jqeprmna15i bwqfaihmlk0"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831365/questions/667461558","answers":{"choices":[{"position":1,"visible":true,"text":"q7y7hkgfgi1plk s1nwdd 0d7dt14f q604qs 47cwawfbo m1mmdsyi3fsp3l r0qma8q f5buoh","quiz_options":{"score":0},"id":"4385173727"},{"position":2,"visible":true,"text":"sn5hskkfn0ykw if30ikcbmfjsxj g6u5fay eauotfitd2 9cg6qkon 9t0l88ops7633","quiz_options":{"score":0},"id":"4385173728"},{"position":3,"visible":true,"text":"c678ymx 92bxd icea1i4p cjdl771k u37cuw rnjvrihdi89s2x a1vef","quiz_options":{"score":0},"id":"4385173729"},{"position":4,"visible":true,"text":"uqlmm5yk5 1v12y59qw hv82bo91a0leef 111gmwav8pnwe np5mfx6nsq6 cxgilxkmtvmm2kw 8mb5wiet5q wdbyo993 uh7kcfhy59 sebg3lik","quiz_options":{"score":0},"id":"4385173730"},{"position":5,"visible":true,"text":"uq2uqj20gchd ly2k4d4goq1 ehe66mwx ei0a0d4ggv0al9a 744s2h u254g40o5m 0i9o7dqjdkrtys","quiz_options":{"score":0},"id":"4385173731"},{"position":6,"visible":true,"text":"nyy288shht 3eibqfcm69se94 de2u01w0k5o 342ouq sb68ogkspj61j3p blbhcqok 8vdd2u7b2 su21c5iwou qgi1dj","quiz_options":{"score":0},"id":"4385173732"},{"position":7,"visible":true,"text":"fkidasstba rfn3erxiv282 vy0fqx 3acgtlyka1 mykyngnc 8u2kws4tp 35wst9aglv2 chbms5wm974 ajaygp8vjkhq","quiz_options":{"score":0},"id":"4385173733"},{"position":8,"visible":true,"text":"lmp71nc3bt 6eic0k8kacvx 17ititl v9u25fh1x78 vgfpglqvf6j ajv15gaccdsa elo40oe8ht75c","quiz_options":{"score":0},"id":"4385173734"}]},"page_id":"168831365"},"emitted_at":1674149694922} +{"stream":"survey_questions","data":{"id":"667461561","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"su1ullpk4 t553g unva8lk6wfw7 ipvkkika"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831365/questions/667461561","answers":{"choices":[{"position":1,"visible":true,"text":"j463gx5a 1n4fa1q94 x4yw9ack6xoh u5l2fmvwlvktyw7 kpgulj5y49q d03pdq 0bl58ibk39hpe g6m66xw y8ajm5qk2uyu 02pbmuywb7h9m","quiz_options":{"score":0},"id":"4385173755"},{"position":2,"visible":true,"text":"4w8kyesurm3674 est71dh9qi23fw jbowojvmon40p jeggkq5soym 4dgqd70 6fx65rd2f94b5t lnsm1pjg0bypfv jt7d9jj","quiz_options":{"score":0},"id":"4385173756"},{"position":3,"visible":true,"text":"atun8p07f006myd wotd669048pp4 j2wa6v97pbj d7uvpqvrv7omvxw p8ef7giw88ft04 rgn3uwqgx08 rhe5yu0hg16b tdaflfh 2jpl4e","quiz_options":{"score":0},"id":"4385173757"}]},"page_id":"168831365"},"emitted_at":1674149694923} +{"stream":"survey_questions","data":{"id":"667461580","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"in0q9d6e580p28o 65hh3n3rbth4000 jowj89wgvpem9u lc918vs7s pt2r8mt n5t61mrm1nw i64uqjqjxw jhpgayjd"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831365/questions/667461580","answers":{"choices":[{"position":1,"visible":true,"text":"d1k3kg doxgp648opvyvwx o6xwbacsy2nvo oglkc2p5fegn l7cfksxmkd3ekk es7rvcb8t8v243","quiz_options":{"score":0},"id":"4385174059"},{"position":2,"visible":true,"text":"tc374t uo4de jkgh56fi 7ttvi102i5fbjw 78i6rml o5gekwgh5r rtxw6mrnqi9","quiz_options":{"score":0},"id":"4385174060"},{"position":3,"visible":true,"text":"mfwrrhume d5c5kcy7n32d ovt2xo d3cm1 shv19 r339qbp","quiz_options":{"score":0},"id":"4385174061"},{"position":4,"visible":true,"text":"l4pnl52o9gc 6q4ufrpc7q bw16kqt 6bagaclfl21f9 x92gg7slb2h gs7qxwmj6mg o81ntc46r8q3 3tkbuhrp0","quiz_options":{"score":0},"id":"4385174062"},{"position":5,"visible":true,"text":"9nbdwy6f06wn g2tdvcsqsg 74jmcd ulao4 i4f5y r3yn39fp vsxqmxocm59s10d 9l98r8lp7554 eek3weuw","quiz_options":{"score":0},"id":"4385174063"},{"position":6,"visible":true,"text":"l7am7i8hxiy u3ylucwt8lvms bl5ftdk19mxheie gt5x6 4eiq6 7an0oa731ay2p a9gyy1qsjse xif4ton3b hu5v6cg kuasc8ce9ihbjxi","quiz_options":{"score":0},"id":"4385174064"},{"position":7,"visible":true,"text":"iw5t0k3fr7tv454 lmsbkhfkfx6 vq5ds3yhq20b2 jom26vaad fu7w8 f0t9nanj2","quiz_options":{"score":0},"id":"4385174065"},{"position":8,"visible":true,"text":"18u6s9r5 na05j55lqd i6its t96py9n9q h03ueyjkfewy rhiv9a8nxh 3adtql0ksc9l2s","quiz_options":{"score":0},"id":"4385174066"}]},"page_id":"168831365"},"emitted_at":1674149694923} +{"stream":"survey_questions","data":{"id":"667461598","position":5,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"fg2ok1k5x73j xi2i2leb9xip0jl nbjab ut48risbmg0 cmxjg1y14a b350n2yl90sq r2fpg 9u3fc44vd"}],"href":"https://api.surveymonkey.com/v3/surveys/307785402/pages/168831365/questions/667461598","answers":{"choices":[{"position":1,"visible":true,"text":"6ia2cfy435ajc4 qwja8 186ntjx 8jshqf5 i32esbjh08 yhf12enewt5 8shld76x18d18 qw01jndxbuhj50 4mtgy6fbn7nfbs","quiz_options":{"score":0},"id":"4385174182"},{"position":2,"visible":true,"text":"e5phn4tqfq 5xee0uu5x v4lw52 hkhk8lpakvb 304yi j23bhqyat9h5c j52nrstj5cqo3q5","quiz_options":{"score":0},"id":"4385174183"},{"position":3,"visible":true,"text":"swapu0ru 89dqkvum0e2 ybf7xmg d0atxxfgpb3ag ylnjkwaufdj8 rj6dedrfte xkc6hqtimwg","quiz_options":{"score":0},"id":"4385174184"},{"position":4,"visible":true,"text":"n4l9n4wq5yas blbdmjmr nkhx7l gh95jmffy0p69j 8kg39ic3a05l41 dmjd7","quiz_options":{"score":0},"id":"4385174185"},{"position":5,"visible":true,"text":"du734l u98n1d5ovgxe 1i94woho8w2k u16an6dw ha0sc8v11aeep 1p9pawo5f6v 9s6ysd nv3v3","quiz_options":{"score":0},"id":"4385174186"}]},"page_id":"168831365"},"emitted_at":1674149694924} +{"stream":"survey_questions","data":{"id":"667461606","position":1,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"f9jgr myr928nokvyw5jg fqoan6w aqdnfas0gapwd 9hobof x7d7vy7xd9il kh6cd dteve1vnaoq6o uccii826ldkj1c"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831382/questions/667461606","answers":{"choices":[{"position":1,"visible":true,"text":"1ak71apsl1lb2 dtgtym8ftk 52syq wtnfautgqxev t2sp9icu3465pll i4rhctmtx rh5yifue1 k91tlt","quiz_options":{"score":0},"id":"4385174252"},{"position":2,"visible":true,"text":"3t2uxb my2rtujx8njmbtm a2cyspuk yvfub6ofm8a9 819o7h8o eac0xea","quiz_options":{"score":0},"id":"4385174253"},{"position":3,"visible":true,"text":"4t3bj1jwi5bo ofhe7 cg6nbcys7lu v2qv7q11u48 7oowwv12fndqe","quiz_options":{"score":0},"id":"4385174254"},{"position":4,"visible":true,"text":"7etbg4thd4k k6d0nlv 02cobf bby0p2i","quiz_options":{"score":0},"id":"4385174255"}]},"page_id":"168831382"},"emitted_at":1674149695048} +{"stream":"survey_questions","data":{"id":"667461628","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"fx8h961tahe na1oufba ybjyqi qm6girwad8b1xq"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831382/questions/667461628","answers":{"choices":[{"position":1,"visible":true,"text":"lakrew7c6qd wsih7a2nkq0no4 94gtxvs36 87wp1kbadg1l 1hkmpi6 2g1juofi5a fmmygrjehmcuygi 0bs6ka 2pj0gvmjpd6b","quiz_options":{"score":0},"id":"4385174360"},{"position":2,"visible":true,"text":"jjsfl l1sxtcih8fyeeof 6m9lk94qqmuaegl ki7wf11a9i93 xypqh9bjq1av7d1","quiz_options":{"score":0},"id":"4385174361"},{"position":3,"visible":true,"text":"eb4np f3xpqwjcv ypljmiu0y337 lu913m i9uet4t 6dvp7afcy3uqh 1xiu25 1qqn7cyv","quiz_options":{"score":0},"id":"4385174362"}]},"page_id":"168831382"},"emitted_at":1674149695048} +{"stream":"survey_questions","data":{"id":"667461630","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"576vlo18en3 1bxycqddfhn6v rsbd7a1e4bbyf ugieqgvywq4 g3qltn1jy8 0ebdn 78lxt9iwu1jx rbdjre1cujgtsq"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831382/questions/667461630","answers":{"choices":[{"position":1,"visible":true,"text":"5k5p528j2o b9frywomc0 aukxrjdqt wiuvud9asln2f3w 6a4mdsa22mygo bnwh1sv 5l5s9ae rbo5hecsrd w0x40 6a86lloan5","quiz_options":{"score":0},"id":"4385174370"},{"position":2,"visible":true,"text":"o8jtnh4keupcl6 ff77c s862cc89 avdo6n25pw","quiz_options":{"score":0},"id":"4385174371"},{"position":3,"visible":true,"text":"vq7kbm97 p8svkwom2lo dg91j0 i570c 7gve09y 9xn2svsiu 22oh8ub7crysocm","quiz_options":{"score":0},"id":"4385174372"}]},"page_id":"168831382"},"emitted_at":1674149695049} +{"stream":"survey_questions","data":{"id":"667461651","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"799t8 uw9o03 89r6ndohi8r8bvs gv887i 14be70qd88w qgux0yh3"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831382/questions/667461651","answers":{"choices":[{"position":1,"visible":true,"text":"dtvq3u jyp1h165k86n y0rkc4ich02nw qshv8da ppf7j9x raeq9k abqfxgd","quiz_options":{"score":0},"id":"4385174481"},{"position":2,"visible":true,"text":"i2muubbwbuf 3ffi5361bv wdoq2xkw2hsgpkj t45p9rr5mhi 8xwetg9 gc9u9p4hpmkkev do1ik5y 1439x s9k4vbcj4uaay8","quiz_options":{"score":0},"id":"4385174482"},{"position":3,"visible":true,"text":"0bwq2juhggn68 d2ioj rs8ybqs07gxkcri pgqiiha ir4cb94rbh71q u5mssukw nsyithmc5ismqc fyjxgqjx48fsdp dcua4s9spewq63","quiz_options":{"score":0},"id":"4385174483"},{"position":4,"visible":true,"text":"t3298cfyqx7toco rvkbw4338qk9 k5vd0u42if tkkkkm hfxufgj1i3f7vm8 69yd8hxcl5 swv8ipasty 4g6qsfyb0hdpa mx6s5tmxs","quiz_options":{"score":0},"id":"4385174484"},{"position":5,"visible":true,"text":"o7itx tcbcw8snyw 6jmor7biu7 x59bcw2hwr t94tgt axflfvftpmd0h 46td0yk 67ydkpti6t m3v2de7","quiz_options":{"score":0},"id":"4385174485"},{"position":6,"visible":true,"text":"u7s76bgo3nsbob i7yi958x br6wqw77f3mv b4f5yubeq q7ubaeju1t x5t0cx1bc25jhy acvms2 pggajefpr6 c7prvy9 6ain0uox3g3rd95","quiz_options":{"score":0},"id":"4385174486"}]},"page_id":"168831382"},"emitted_at":1674149695050} +{"stream":"survey_questions","data":{"id":"667461652","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ske92t16t19co1u 3qou5xj75ksuy 1rfxe q5tbfl9xa6dx"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831382/questions/667461652","answers":{"choices":[{"position":1,"visible":true,"text":"gn0e03jdsij ops28 wxpn34 o9q6o9otb uxw5rwr5xh g855ayu37wsg","quiz_options":{"score":0},"id":"4385174493"},{"position":2,"visible":true,"text":"6yft8d7xv vwn2h vrlpr8r7ppbnfr vtvgbje916jf5 kv7g2ax 292bgj62fdk","quiz_options":{"score":0},"id":"4385174494"},{"position":3,"visible":true,"text":"iicugnyhyj 0t742iccrlgnc olaw2v e67g2xd1etgcq","quiz_options":{"score":0},"id":"4385174495"},{"position":4,"visible":true,"text":"55ganyc qk6vvo 1gfswk294 t4qxy0nirv3a y1wr6vmvd","quiz_options":{"score":0},"id":"4385174496"},{"position":5,"visible":true,"text":"5hjxv2qf8jr svkm4b90cs6n7u 44ewbk0getyk g6hhmaqvlcdj9g7 if6lqdknx rr5abg5ylw7ho2f rabuvef2t0k5x 0a7x5oqof9xhi8 o8tv6ke3ev7r","quiz_options":{"score":0},"id":"4385174497"},{"position":6,"visible":true,"text":"sy4uf cxu4rsabrlmaw kdov7 hx6ta8d4c0x290","quiz_options":{"score":0},"id":"4385174498"}]},"page_id":"168831382"},"emitted_at":1674149695051} +{"stream":"survey_questions","data":{"id":"667461666","position":1,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ssubl 48hjj9vj31v omr18dpic pp65f94 j35xxoh u04pidx8dp7i bo1ae4ptsntu3 o6v99q"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831388/questions/667461666","answers":{"choices":[{"position":1,"visible":true,"text":"04s0qv msoghfkw0fr4hmq kdv92tuo2 l8htirpt 4h2nxjcla5rjor n1wy2w5","quiz_options":{"score":0},"id":"4385174598"},{"position":2,"visible":true,"text":"64o6m jya4p7twvvs ls75jv9lvf 8gr7y35au5hcqfq","quiz_options":{"score":0},"id":"4385174599"},{"position":3,"visible":true,"text":"x6ijo4tj5qrljkh dk5dmknmhn 3rm63 kdym4 bxjsru9kvh1 g2vp966a8nkh 6dhh6k99a88gt 9b7emois0ldfr swbnqor4k66","quiz_options":{"score":0},"id":"4385174600"},{"position":4,"visible":true,"text":"4uhchfo7n2wmrtx e211emk0v53w a7ckw5lg40n qrx8pw0r5xrph q8ndfdm5g08tex8","quiz_options":{"score":0},"id":"4385174601"}]},"page_id":"168831388"},"emitted_at":1674149695052} +{"stream":"survey_questions","data":{"id":"667461670","position":2,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"lbje0ppud4so8xk ax7vnbef0l3fv7j alcnsi48jehkf8c 9fghb3uop 8qfnul9 w8d6lma9 ejcm4j9x604p t7b7dk"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831388/questions/667461670","answers":{"choices":[{"position":1,"visible":true,"text":"i6exa76ck98 9pkrhl37j88s 8k6dvdhxg5axw3q 0dtn8xt6 ji1gm0qu 9pie3iotb","quiz_options":{"score":0},"id":"4385174620"},{"position":2,"visible":true,"text":"knjsfkea66j bp5sxiba qa1yvg m3vul 96hgbjtin7ux7","quiz_options":{"score":0},"id":"4385174621"},{"position":3,"visible":true,"text":"jf90cc rc80q71mvp1 8f3qlcc4pls wvixh60l7b","quiz_options":{"score":0},"id":"4385174622"},{"position":4,"visible":true,"text":"u8275ses4k sq0bax8 vbpfs7qwh yhbborapj3ai t6eo1n6o9rf uitrqawsi p2oe4x5ie","quiz_options":{"score":0},"id":"4385174623"}]},"page_id":"168831388"},"emitted_at":1674149695053} +{"stream":"survey_questions","data":{"id":"667461674","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"7xuudm hd85d2fbd49 hxo4gmsnhaxn53y r3oo0piiij5 hvifmm5 mfep196v1yi q9o6w9gksyedtgs o3y01cyw4ca91"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831388/questions/667461674","answers":{"choices":[{"position":1,"visible":true,"text":"7h3hoeucihjd41o 4la76h8i8 8dgl2v5eub 962jah6wws8 qdtm85x9t3y96w5 mkq9yvj 81nsju0 koqkfhpe7pw","quiz_options":{"score":0},"id":"4385174634"},{"position":2,"visible":true,"text":"vpmf8jyppptscjq 3ujxkee7dye ggqm9tg9svjgx ashilo1ffin","quiz_options":{"score":0},"id":"4385174635"},{"position":3,"visible":true,"text":"nselknrgymf vq2vd1efu 3a9b7whs2k7bj5 nujxdbcbg8qcjp 2va7wdag r0k00wo6 bd5u5 btk0p","quiz_options":{"score":0},"id":"4385174636"}]},"page_id":"168831388"},"emitted_at":1674149695053} +{"stream":"survey_questions","data":{"id":"667461676","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"0g353xw0tmg9uj yjpp4gp6d kkvtb90xqw7se5s 1rtjhd"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831388/questions/667461676","answers":{"choices":[{"position":1,"visible":true,"text":"qi3ml trfm3r0 hij01mx6lt6 olgi265lrg7a45","quiz_options":{"score":0},"id":"4385174643"},{"position":2,"visible":true,"text":"sip0lix7kpf g1vjmce6cj u3qgbnitdp2w3 gxgg5cc 53rn81g6mr 008agselt2cfwmo","quiz_options":{"score":0},"id":"4385174644"},{"position":3,"visible":true,"text":"29qp4n5j92gre bwkmqp821xab2ri kyqdft g46vvp19jlvq1k 2sgm90q2b6 1ewvm 8491gfakn3p esqiug2cxmg6ka gb9cdrtlc9qs","quiz_options":{"score":0},"id":"4385174645"},{"position":4,"visible":true,"text":"mcijdsetfwvx 9b6tmxv phlw18ap37 20s5wv","quiz_options":{"score":0},"id":"4385174646"},{"position":5,"visible":true,"text":"3g748xwkq6o 2ut8g nb63dyj stbl5wm 2dkk61h6 29bjrer dxet33 v6f36uqes9qu vgqoxu1nmi5lm gtuqaph","quiz_options":{"score":0},"id":"4385174647"},{"position":6,"visible":true,"text":"j5p31 t1ltv5rpt 85q5tlwq2sfsv3l bh4a2e rev7lbj7 2qwf83ylrc3n fiufpgf h3fp2fd0y5o uw3phwkrek ihy0faqy9s1rsp","quiz_options":{"score":0},"id":"4385174648"},{"position":7,"visible":true,"text":"prd59 gqs7t8tmls 633ujsd7d9ni u1fkx5a6mx318w k71rc82lydu43 orkxf utbtip9c1ky72","quiz_options":{"score":0},"id":"4385174649"},{"position":8,"visible":true,"text":"dc5yl63yj6lv jqeok71lte 4leao9ms1xu3oh 0fdb4m50ip t31tl6q57jjpmh v2osljafdca1x6","quiz_options":{"score":0},"id":"4385174650"}]},"page_id":"168831388"},"emitted_at":1674149695054} +{"stream":"survey_questions","data":{"id":"667461686","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"987ob 7kiuo4teh1 8s7deqmvpopsp txo4fxjj5e 8eqdafh1k7yjhwf 889ll 0s23juj5vyyq99g 7390ddsh565 lpni4hn1bi0"}],"href":"https://api.surveymonkey.com/v3/surveys/307785408/pages/168831388/questions/667461686","answers":{"choices":[{"position":1,"visible":true,"text":"1vdqk14 sjvrskliu ejn42p38f ougj5qtxi6k5q 6d2ccy9073i9","quiz_options":{"score":0},"id":"4385174676"},{"position":2,"visible":true,"text":"b0yc27 c3v3i nhneas7k4y dqth374wqfs9hqf eg6g53l03g 8fg7266kcffpx7 6i9d7rffvncy s0f2on","quiz_options":{"score":0},"id":"4385174677"},{"position":3,"visible":true,"text":"k2kv88vnieg5pk fxdpcorngy bmidk g2lb58 qkbeew82lmprw","quiz_options":{"score":0},"id":"4385174678"}]},"page_id":"168831388"},"emitted_at":1674149695055} +{"stream":"survey_questions","data":{"id":"667455128","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"21b2d1nm vcduxp396s3f vrgn9riooeu 2w1y9r0lhe5j0po cfv6aya xsek4vnv4"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830050/questions/667455128","answers":{"choices":[{"position":1,"visible":true,"text":"1cqki1ijt cnkrfpewyh hloep tun23aq fm2hlturu wp1hn1005","quiz_options":{"score":0},"id":"4385137324"},{"position":2,"visible":true,"text":"8q54jh807g67 0chem4m32w 6g6cg4kfbpyp48 wgbo0l1 3ivc27 h1g0jagebgvj36d loo7agxubx imfmbchanx4w47p o4rfv9","quiz_options":{"score":0},"id":"4385137325"},{"position":3,"visible":true,"text":"axjh0ev2g5g0s01 d1f1ekg41aq 1r7fcho4 adaclkcgj0ra1h5 obp9ot rak96hmu bx3804jjlr5vg wruubenes3g4p h41e18dufrs40kb 9t34k1uad6g2a0y","quiz_options":{"score":0},"id":"4385137326"},{"position":4,"visible":true,"text":"0rvnqa934hd356 yx0p7kab01kubvj yuy2tik0o6t 3854yf6up2mgfc kqn54h6qvfoj jecuuxm0d9s u5d8y0hmv5bcww eumwsigjumvc543","quiz_options":{"score":0},"id":"4385137327"},{"position":5,"visible":true,"text":"sutsvkyg7 x3pr1f8 gnn8yg 32ls0it6m8c5c3 5xhh23hb0bck c5kbcphdgm 8n1839 8oe5f4wdsxv oyijcnki143a","quiz_options":{"score":0},"id":"4385137328"},{"position":6,"visible":true,"text":"a14e7gtqqbrm ei6h8ynhoi92vs dq0oj6m rulpoxmdtew b1cnc7v 8pxkgtbq6vu0o","quiz_options":{"score":0},"id":"4385137329"}]},"page_id":"168830050"},"emitted_at":1674149695180} +{"stream":"survey_questions","data":{"id":"667455130","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"9no46q bgj8bu9 qbwy78onx0sp5df 1s2n38k6ly8xo5 xanlhf0dqvej htj1rl0wp ip01j7fb6qm"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830050/questions/667455130","answers":{"choices":[{"position":1,"visible":true,"text":"7dpysnial1 w484xmm33rpralf fsb2j19 r599iaw30wgp gk8tit5i681m 14lsb5gmddkr qrncp46 vp0lw srtca1i587dq","quiz_options":{"score":0},"id":"4385137340"},{"position":2,"visible":true,"text":"0yflf5ua3 5l5tu93l 45fu03hrvt kii5twmbs6n uqppc ca18nfpevvny 8od85fpdw gc9isqks5ou7","quiz_options":{"score":0},"id":"4385137341"},{"position":3,"visible":true,"text":"uuv580b3 ejgygxa3nxuod qx2s8cx85l1vu c96g3513rcjdmuv 161c5f mrclx05fg2o 9r8lk172","quiz_options":{"score":0},"id":"4385137342"},{"position":4,"visible":true,"text":"8jhq2vl1hj6 dvnvp6su wshwoa9 unbnfs wjkm9w4w5w glupwsmbjeb3 26q9svrti 21b4potlf4d","quiz_options":{"score":0},"id":"4385137343"},{"position":5,"visible":true,"text":"y1xu41qdgnk hw9yooajs6n xhaqwoc8 hxi6ioaqcnf3 le1ein6yt","quiz_options":{"score":0},"id":"4385137344"},{"position":6,"visible":true,"text":"y7vgshrq086w 18x5gdxg0 ibct5mdxqm78py aq9lw3kx kq3rfwnnod q4a8qk7q 2mytdfvtgxe q7w14xsgcfsw4","quiz_options":{"score":0},"id":"4385137345"}]},"page_id":"168830050"},"emitted_at":1674149695181} +{"stream":"survey_questions","data":{"id":"667455161","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"8piluvv5gm y4fyg bdn90lnhlw hlp49ut5by 1wcskj bo4qich35bkbh84 9s7n4art qxh35"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830050/questions/667455161","answers":{"choices":[{"position":1,"visible":true,"text":"7v9pb77j2u5h8lq fjdckl44c6tdi oxtly8metbj35c7 2coi267okn 772jt3x4 8pdrkhod14i eeyu3ox bkl79rtci65 0jt9nxkpamu5","quiz_options":{"score":0},"id":"4385137468"},{"position":2,"visible":true,"text":"w13utk5t7u98 ltxgdnhqgh3 tv729vqrf2g8 a3kf9ym ddp3yd ryqfnhyyshm","quiz_options":{"score":0},"id":"4385137469"},{"position":3,"visible":true,"text":"4o86igx uap6ssaxn rej7oi49j4nj g1afe aj0rahjii gdy2ygm yrq0r33ljaqav","quiz_options":{"score":0},"id":"4385137470"},{"position":4,"visible":true,"text":"ywmratfmy ko10n3cmegap9f vor9gwdvwevpi2 7oid9t72lp yc37r5pssxrm d9fdyo6kj9g5","quiz_options":{"score":0},"id":"4385137471"},{"position":5,"visible":true,"text":"l1ei3wav57twf yn5mmi2almiidx7 gdkyhn 3npig9sip","quiz_options":{"score":0},"id":"4385137472"},{"position":6,"visible":true,"text":"rr84y ht7saym46 rqxpn8 qix3c","quiz_options":{"score":0},"id":"4385137473"},{"position":7,"visible":true,"text":"dtaeau8 wv5ay39bjtph6 uxvtv8 bfa13j2 t1cxi9sgxs9u wh5it","quiz_options":{"score":0},"id":"4385137474"}]},"page_id":"168830050"},"emitted_at":1674149695182} +{"stream":"survey_questions","data":{"id":"667455172","position":4,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"f4i385t8gi2y iukko6gtimv6 2ljnv 3s7mawxra ueavu x4pl1nkyt1s0b abfab7bvxtkmrw d4843lq j5n0c7"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830050/questions/667455172","answers":{"choices":[{"position":1,"visible":true,"text":"5dkq8pnhf1gag8 u73xqg mej8lwdqo qs1tuihyc heabchr403srhq0 51c5ipel70a csfc3dwuxn9mt9m m9j6t37f xe547smil yy8ji7kgqx","quiz_options":{"score":0},"id":"4385137485"},{"position":2,"visible":true,"text":"q02a6wo56w 6fc33b k7d7a9n7grsgt n7j84b6552eyy58 xapgm1 xxxxklio 1m6q53gxh23a sl0kn09v kdw23flh1k9ss 1kfm8tao","quiz_options":{"score":0},"id":"4385137486"},{"position":3,"visible":true,"text":"d3482iajo1udye ian1i2sop8y5 6j6u9vi h2flbi3mhh 8bo3d4b7wnwto x7dlap9vcos","quiz_options":{"score":0},"id":"4385137487"},{"position":4,"visible":true,"text":"ytjtpqs9tcdnb 5pxact7wjjdtx filtao5oyv w02h42un1hxtd5h dbagrj511v8 d2k7wxlw","quiz_options":{"score":0},"id":"4385137488"}]},"page_id":"168830050"},"emitted_at":1674149695184} +{"stream":"survey_questions","data":{"id":"667455179","position":5,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"orgitaiw xmkvjmfm ev9wjtt7jn r1c6c1a2w01 axiagkpsr7 n6shk7sv7miuqa cjsunx5lysasx7"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830050/questions/667455179","answers":{"choices":[{"position":1,"visible":true,"text":"v2fci0n3 q922d8hp kc1mka6c9 9hkt1vtlsv nx48ppjd kaisn r586rs 5awcm 1y8b5ew","quiz_options":{"score":0},"id":"4385137492"},{"position":2,"visible":true,"text":"fv4rhyxgmweyo1r g2yoh7nm88 ubgo22v 8e2ukol","quiz_options":{"score":0},"id":"4385137493"},{"position":3,"visible":true,"text":"6b1kwthm24uw054 42yns43d9d2 9aelxhek6m9cer 1scie9 ob3erxdvkvv 5bccusj 9pwd586","quiz_options":{"score":0},"id":"4385137494"},{"position":4,"visible":true,"text":"0x7t0 engoyj qcv0e ta9rgyjcob sqj1y247 2f6nqh0s4e9qtbb o3q661emk54yvlq am4wkqctn26fblr 4yd280s9dpbyq","quiz_options":{"score":0},"id":"4385137495"},{"position":5,"visible":true,"text":"1mm0gylkc8tpmj vpmvo0eme0 9kriqmlb dm300brkw7certk 096rh8ts1ll 4j1pr","quiz_options":{"score":0},"id":"4385137496"}]},"page_id":"168830050"},"emitted_at":1674149695185} +{"stream":"survey_questions","data":{"id":"667455202","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"tius10di41k9wls fmdlvphlmbl4fd 8t41mn pkss9 f7qg4uouq15l 9al8qjnu8lg4c d62wfnkbe4mx5"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830060/questions/667455202","answers":{"choices":[{"position":1,"visible":true,"text":"pxw0w9ui9m4oc inicqftdpfe dyp4ai vn1pmsp6 6cm2gr9b 0ruklaf8 xhb0a8q","quiz_options":{"score":0},"id":"4385137700"},{"position":2,"visible":true,"text":"p28lapcj xmelobuak9wnfe k0ilacxb575 54eam 96ng7","quiz_options":{"score":0},"id":"4385137701"},{"position":3,"visible":true,"text":"gw913n4emtltob sqr3rxe9q alm4u96n5dbp 79stl7bky bseq17ndb ibhcv2mf06av","quiz_options":{"score":0},"id":"4385137702"}]},"page_id":"168830060"},"emitted_at":1674149695186} +{"stream":"survey_questions","data":{"id":"667455205","position":2,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"o5429bwk bdk9efwp y207rta 5ir7a m3btvu7doifx o2as6uky bmp4untymjr 2qx7e254wxygi pwf681dh3l"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830060/questions/667455205","answers":{"choices":[{"position":1,"visible":true,"text":"ihqtbuwrc7tkk t8rxgekiec q546dffi6yo7ato ip17xm5fe","quiz_options":{"score":0},"id":"4385137740"},{"position":2,"visible":true,"text":"ithl3 gl2tfo1dl uuiy7ls5 7wkeslse","quiz_options":{"score":0},"id":"4385137741"},{"position":3,"visible":true,"text":"ul101be 6w0o3urllk5o4rc m6ttbhcts3nrpq cd93g3j6","quiz_options":{"score":0},"id":"4385137742"},{"position":4,"visible":true,"text":"keye6y0 vxjehf4oga975i hh0hwvp20y0 hmvp1i de9i0gf 309gv73vahw5tv6 b7th25myd dl56yk9tjsnwbkg nlwrih","quiz_options":{"score":0},"id":"4385137743"}]},"page_id":"168830060"},"emitted_at":1674149695187} +{"stream":"survey_questions","data":{"id":"667455210","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ccus8ci s30ote6pf5enhkv 3xw226wx0r4r soqp6i56rx7p"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830060/questions/667455210","answers":{"choices":[{"position":1,"visible":true,"text":"ror4u04bm535i fajv10 ji7v3kn9 nu7pljg4qd vtkx1s","quiz_options":{"score":0},"id":"4385137775"},{"position":2,"visible":true,"text":"5xjy8qckk 6w20pov 9ductfhj r469e wem8w rc0jks9hwv","quiz_options":{"score":0},"id":"4385137776"},{"position":3,"visible":true,"text":"difesvxw9al ygl163e5w9dv6 x2glb8m5g6fxm eiibhejl","quiz_options":{"score":0},"id":"4385137777"},{"position":4,"visible":true,"text":"tnfsnewa16k155 klbxdolp it7hi 3bwcsq4kxfs6ag y4rjmghck8fb1 kbr64tikluwhtsh m6uwesc5861 tdfj8p qrf7oe2ydofs vy2xx8qsmcvubj","quiz_options":{"score":0},"id":"4385137778"},{"position":5,"visible":true,"text":"w4u167 jcxljoenbixyu2 xmxki pnigr00vdimxddq","quiz_options":{"score":0},"id":"4385137779"},{"position":6,"visible":true,"text":"s4ksxp4wgiv24 jd0h5q9cdqbaf2 at9rhpltsnm9e 9vvcvfubdxoda 3dr2s4l bcvpvk5qq","quiz_options":{"score":0},"id":"4385137780"},{"position":7,"visible":true,"text":"p0nngm2a15gos i48053r8tp2si 5c356fdw 7lwo3016oo2u ysdomx7ts utp4qqa6","quiz_options":{"score":0},"id":"4385137781"},{"position":8,"visible":true,"text":"hjopydw3jidvpdk opbjs2sr 86c6g94l 1045p9imdm h0ewun d0ki3w4t li53wdcc9 v0m8nd0q8rim c9kuoh 986j08boiew4s","quiz_options":{"score":0},"id":"4385137782"}]},"page_id":"168830060"},"emitted_at":1674149695188} +{"stream":"survey_questions","data":{"id":"667455212","position":4,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ycd70f 3tlkc9fg5 uhsj13x 3fy1deg e3x8xxtprtx 35w2t0fb0kt 3c7sp4a9l vekf5fhta3agc tqtiua55"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830060/questions/667455212","answers":{"choices":[{"position":1,"visible":true,"text":"3nd2k 12iqy qcy1q78egxti b88f20djp60v 6orn1h44 xb2fsut8p63fd spd9rybvtlrx6 p79lf27l","quiz_options":{"score":0},"id":"4385137792"},{"position":2,"visible":true,"text":"w6va3wm5af u5earys3j7d2w0 aigku 8mhkw6l24gftb lj78ittnu2lhxct","quiz_options":{"score":0},"id":"4385137793"},{"position":3,"visible":true,"text":"1vjpoerlc8kf lnqycklqdoe yt06t24brl aoqrq","quiz_options":{"score":0},"id":"4385137794"},{"position":4,"visible":true,"text":"syf9d5k3axfjhqx f1un5ergu68m7h hf5by9f1 0qf94 docxia9h qcda6u ja83rjw7gdm","quiz_options":{"score":0},"id":"4385137795"},{"position":5,"visible":true,"text":"al4dbwow9is7xut pif50a9 434fsto nh16xfiu34c0eld beshoy","quiz_options":{"score":0},"id":"4385137796"},{"position":6,"visible":true,"text":"q9ufu06kh4d 4oogck630yox 7wsoh 0l2dsb3 8noi1cwam8ukth","quiz_options":{"score":0},"id":"4385137797"},{"position":7,"visible":true,"text":"3e5ijt o0m3chiw3pitxr8 4hciaiuh9c gpc5q4olp3cib 0bhsd3payjog 562gi7o4647qe 39j8aa4ptw jbydrqc7ujb iqlxnqn4uea","quiz_options":{"score":0},"id":"4385137798"}]},"page_id":"168830060"},"emitted_at":1674149695189} +{"stream":"survey_questions","data":{"id":"667455215","position":5,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"0qm15jfh tv1ui2w edoha95n wbhjp4 rui3rtv6xf4n5 v920f2a1hrd 5d7gj7guq r7ljcjdk2f8t jv5iocm9mv7pg cmow0h6"}],"href":"https://api.surveymonkey.com/v3/surveys/307784834/pages/168830060/questions/667455215","answers":{"choices":[{"position":1,"visible":true,"text":"sewil7695q3 nu4xd9w cr1qqpg4h9qlr ktchj5oeb4 1ns6cdqbjex5f w2y8iflb52 kpkid 1f8unrp e17xh5 qn47cr","quiz_options":{"score":0},"id":"4385137810"},{"position":2,"visible":true,"text":"q21t3nuf 71sfp kag1g9kes bx74gjdj1 uvk0chaofja60","quiz_options":{"score":0},"id":"4385137811"},{"position":3,"visible":true,"text":"nkbskl7xaxqbh76 pgggq5trhj3t isut5qlmwmxnbw apxr23h4v0l","quiz_options":{"score":0},"id":"4385137812"},{"position":4,"visible":true,"text":"jotjdok64gv ya4g5j b0w379 riavnfi10mu3bm 739xph torva74 9dcgi9ns8qlnho","quiz_options":{"score":0},"id":"4385137813"}]},"page_id":"168830060"},"emitted_at":1674149695190} +{"stream":"survey_questions","data":{"id":"667462113","position":1,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"xvodyrmsj8o5 vqjqrurdq h74609w5o8cj kpy303cf 5qyfp1flg hpfvhtg412qu bwhmup tfxwjcltbmp"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831471/questions/667462113","answers":{"choices":[{"position":1,"visible":true,"text":"x5gvnnvh 39thim64p k3naeh9 ebx5et8ci8vnjwq mwfb0867jts36 lq8ghnv8c23c86i","quiz_options":{"score":0},"id":"4385177065"},{"position":2,"visible":true,"text":"5atgqxr5w uk3ussdg7 29qlw s20qfx0w1u1d cdx47v m76g66t1j x9wuj hyv5095ipd9ly","quiz_options":{"score":0},"id":"4385177066"},{"position":3,"visible":true,"text":"yqvo5j rojr27j6ww 5k0ra1y96j6 vbd70ncr0 wdoxqqhkv a283r7g tshidt7i0jw 70gxqa3 d1wh0y 8q2x4yu5u3tcga","quiz_options":{"score":0},"id":"4385177067"},{"position":4,"visible":true,"text":"53838lqaxys gt190mgek1r2r llxh86fi38xyyb puwhs54wnxa8m5r cb8w1f312hts1 80gh5hrp0o 9a6siov 5i3l99eiefhoq","quiz_options":{"score":0},"id":"4385177068"}]},"page_id":"168831471"},"emitted_at":1674149695299} +{"stream":"survey_questions","data":{"id":"667462114","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"r5gme6gxar 540ixc g0a32bjvkgg4lh 9n8hpb qor7i9od6r max0ae1vu08"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831471/questions/667462114","answers":{"choices":[{"position":1,"visible":true,"text":"tk3pmts41 aw7w4y8e5 65iplksmu5wa0o 9ve8f0vgh eiy8hki8e3 5vbwg fa3nnnvu3uq c43makf6i","quiz_options":{"score":0},"id":"4385177095"},{"position":2,"visible":true,"text":"3kvwm3v j0x7vrrpnxmtcub 7h9g43wg71ppkn 71nswd5eq ocqpss07r05dej4 7ln0vdgw0a","quiz_options":{"score":0},"id":"4385177096"},{"position":3,"visible":true,"text":"07td1maptf9wde nrlxmvshy dgpasbrawvpndo id9yjt2tsi mkm0ri7epkw5d poj8pv8m4lu0hc 2xh0i62g5j wxokec50ps52h8 d6uqtrf td70pitsu","quiz_options":{"score":0},"id":"4385177097"},{"position":4,"visible":true,"text":"ccw6cg wd5s85rpk dqlppdkh wpqg1t9vhdq8c","quiz_options":{"score":0},"id":"4385177098"},{"position":5,"visible":true,"text":"8b85ql72lufp 3r2k118 vy5uh6mnntsq5 x49hvqp19g 3oc9laa75hjxwn7 a77dw8 aiskfi350fyh5w 2h7ra ry4mj i2el2","quiz_options":{"score":0},"id":"4385177099"}]},"page_id":"168831471"},"emitted_at":1674149695300} +{"stream":"survey_questions","data":{"id":"667462122","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"0wpcptufvllj 4yjhb78a bxn0uwh wxberovodxawinb 414fl1hatnpl 6tdxbt dpieidpjnqba9r"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831471/questions/667462122","answers":{"choices":[{"position":1,"visible":true,"text":"c7nxl 3qrbcjg tddcypx5j63ne1 ebrs5911s ilsx5w8mvfs s24oodbw hbah99rw65wt7i","quiz_options":{"score":0},"id":"4385177138"},{"position":2,"visible":true,"text":"1lx4btr3s0pqq63 y93x5lqe xmyta126vo 07q0rnh 4f2bxvoc441 wcnvx ytjeo8g5a wjqrg 134n2q fgobl","quiz_options":{"score":0},"id":"4385177139"},{"position":3,"visible":true,"text":"t9hwm2nyw se2sl72a t70iepatjw0rsh kq6ta 6mhce jgfjh52 w3ivi m0sxg2i4 pup4tsn7a18","quiz_options":{"score":0},"id":"4385177140"},{"position":4,"visible":true,"text":"j6w78imo yhv9sgxs64ii ep2ckum1ge3 3d8gcbsuw j0b95oqfwn","quiz_options":{"score":0},"id":"4385177141"},{"position":5,"visible":true,"text":"5gn4d25al 29tdmvxhe1 svxcxt7qsq pbnlphkoa xvotqve1o79","quiz_options":{"score":0},"id":"4385177142"},{"position":6,"visible":true,"text":"sexvxfmqb jp6xina8q 3gsyu2jfgvpag d2wcp0k5ukuk igg5ecqj rtkd5j 485nmxjd tjodfsyhu5","quiz_options":{"score":0},"id":"4385177143"}]},"page_id":"168831471"},"emitted_at":1674149695301} +{"stream":"survey_questions","data":{"id":"667462126","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"5r90gmyyy 1eaacbfag0g4dtj 4rlwnt3r jxg5ruhn tkkml hhlu8r79jma"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831471/questions/667462126","answers":{"choices":[{"position":1,"visible":true,"text":"vln5gpqjq tglcfbuxu7b dob43c qnisv2 td55l7hc91pd00q 8gig93a5h 7hrhg6drxsxy bj0oldpxa33by1 4q9mx98wbi p0wb03eabrt87q","quiz_options":{"score":0},"id":"4385177153"},{"position":2,"visible":true,"text":"fj0a0nfwmfjrong q38px84nyk rvqmj 2sv0x6n9a hm88jqn87kvws","quiz_options":{"score":0},"id":"4385177154"},{"position":3,"visible":true,"text":"ms6ilfpbca 8ota11f 1qvg0ellfxis pfyvkkuujjjg qih57geu 366h9cnbrnny9 4sx4q0hbgu","quiz_options":{"score":0},"id":"4385177155"},{"position":4,"visible":true,"text":"si9tpsg54u 13dds2djq4kh kra03y5p43 j8rej5mv d0tkvig6","quiz_options":{"score":0},"id":"4385177156"},{"position":5,"visible":true,"text":"k5ijfpctrn flm2q7kn5t4jf xkjec55tbfsgsn7 r61gy346sxt","quiz_options":{"score":0},"id":"4385177157"},{"position":6,"visible":true,"text":"v9u400dqc fii651ftc 29rn2dffioa0 1m22amm42b qhs0wpth5 mva3eqo09hvo7x 5od22d7a 7m4606e271a6yk","quiz_options":{"score":0},"id":"4385177158"}]},"page_id":"168831471"},"emitted_at":1674149695302} +{"stream":"survey_questions","data":{"id":"667462130","position":5,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"a8ibp46e09n3ae uwv4r3pbpla uxqx8 8nlfqe2ekyj6b1u ju2o3ts 29q5blc7t5m225x rgcjb uek905hycm3 8nkpkppcdm4s vfcx6c63bfppfk"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831471/questions/667462130","answers":{"choices":[{"position":1,"visible":true,"text":"xkuphh 9sloeexwdfla qyx58xq9u ne6p3x","quiz_options":{"score":0},"id":"4385177171"},{"position":2,"visible":true,"text":"83uko6624m otef3go 1ba21xa3 6k24mmw t82m7my9ipep","quiz_options":{"score":0},"id":"4385177172"},{"position":3,"visible":true,"text":"ke2gqx614f p7y9pi89 asll5jaju89e1g vgrj3wbe x815bgx 67md1tfhviy9v","quiz_options":{"score":0},"id":"4385177173"},{"position":4,"visible":true,"text":"w5raj381jcgffq 9o1b73 0jnat47bs8bq9e 41ffc wcmivj410jtu19 njxb3v7 gurti qsjowjls niwyt2clulpdpa fe0skx96v529ui","quiz_options":{"score":0},"id":"4385177174"}]},"page_id":"168831471"},"emitted_at":1674149695302} +{"stream":"survey_questions","data":{"id":"667462135","position":1,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ictucjn9av1 hqjkdsl56q dw9ouny 3wbjmkmik8m pxirnbm7f jq31e0w572q61j le5ke3if 8wkwmox1ow fsu8b5 ci0ot"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831478/questions/667462135","answers":{"choices":[{"position":1,"visible":true,"text":"k4q8hnwb0uticgy kx7rcy sp8nvx036 u552gi 1icsxiqmdmects 0c1d69aee soiye","quiz_options":{"score":0},"id":"4385177200"},{"position":2,"visible":true,"text":"bolb3i7f7 5d7y5 n7il93or tb2599 wlr1hh88d5bjpr vu3v5uudajbgoa s7kmwnhqpph","quiz_options":{"score":0},"id":"4385177201"},{"position":3,"visible":true,"text":"ve8olc60hjdia ake87 4iv5po m484jgkaut 5e285a0hgsrirjm qtnofl05rdtx","quiz_options":{"score":0},"id":"4385177202"},{"position":4,"visible":true,"text":"1pix5bfrx 9pncw4rp5g xf1sm2qr c474c1s67jgcrw trxj2k huiccx1kxt1 l13mo1hij12","quiz_options":{"score":0},"id":"4385177203"},{"position":5,"visible":true,"text":"kf0u04jlsopl 1b4xnt0g 3ehjhwg d9465xfy24uisef 0xv77xfgm7x","quiz_options":{"score":0},"id":"4385177204"}]},"page_id":"168831478"},"emitted_at":1674149695303} +{"stream":"survey_questions","data":{"id":"667462136","position":2,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"c4f5ohh3sr2w xoto95lot 7lykuivbhs078b h524lu75 mvss35agi"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831478/questions/667462136","answers":{"choices":[{"position":1,"visible":true,"text":"1blqraty 6uddh9u imhcfci dho72p k7feqgqqqr3jm7a 8y7drc4m8m8f1l0","quiz_options":{"score":0},"id":"4385177210"},{"position":2,"visible":true,"text":"cnxmsuqasj3g gm6e1da2102igu c3w07jugiuro afj54 kpoom7 n11yf","quiz_options":{"score":0},"id":"4385177211"},{"position":3,"visible":true,"text":"82nkl1jumcnc6y3 raogw1xp84nswty h77x7 f26dju09o2 ajgbdjdjne6i","quiz_options":{"score":0},"id":"4385177212"},{"position":4,"visible":true,"text":"dukxs7vo kj6j0x kjsmang 6g8vgh t9ymo1h2hfln6 iyuklw ou0uq6","quiz_options":{"score":0},"id":"4385177213"}]},"page_id":"168831478"},"emitted_at":1674149695304} +{"stream":"survey_questions","data":{"id":"667462138","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"jvr1s akb7hxxk2ptt1q jhgxvvgirs2d9 rae88p7 b54u3m1g1 vflgmpv75w5q fauxphpa8bxdutx"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831478/questions/667462138","answers":{"choices":[{"position":1,"visible":true,"text":"jnkfpiwx3ye b6osvfmkkn eek8p036ayn rt6k5em681q78c 8j9brp8e2qsa 3wu71v85le4x65g","quiz_options":{"score":0},"id":"4385177214"},{"position":2,"visible":true,"text":"oriu3pl31qd r6u7isqu2p1 s6lrtm ybawl9g3oafvxx9 sw16llmo3dpc2xx v0r4lrj serixtbxt sy64a2vcyjf f8mhp","quiz_options":{"score":0},"id":"4385177215"},{"position":3,"visible":true,"text":"v0j4ixrd gxjah4rsf03mhtt selnh 311w2 80liajkb9v2h8 m7aggx9 kmjjabnan kk3g4y8jiuv n15toj tt60bhmd","quiz_options":{"score":0},"id":"4385177216"},{"position":4,"visible":true,"text":"vmvi1nlvkd1vy 13gv0qjxtri sty84 df77l wwh82kck3x0 7jer7beg 8x6vcrnh9qiaf3 nhl5ref5v5bud dol9qivxsg8owna xsw7e0s1","quiz_options":{"score":0},"id":"4385177217"},{"position":5,"visible":true,"text":"a2fdw9jbcytl8ok 0ir460hfwm8 rqecrtla vyi4l3tpv eyhkdh47w2uixp","quiz_options":{"score":0},"id":"4385177218"},{"position":6,"visible":true,"text":"yvusg0ns7jw9tt nadlph4 0ur0o5dhan 9jlq9878999lbf","quiz_options":{"score":0},"id":"4385177219"},{"position":7,"visible":true,"text":"48eqbvdq1ubpvyk 5f4pwr438ik81xj x7ioyubgl90808k 12tr703dg0s 9xpyni000c9sbr","quiz_options":{"score":0},"id":"4385177220"}]},"page_id":"168831478"},"emitted_at":1674149695305} +{"stream":"survey_questions","data":{"id":"667462170","position":4,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"csowuuey o93r9336 qf9fym8wbog1q l48c9"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831478/questions/667462170","answers":{"choices":[{"position":1,"visible":true,"text":"0k0agd84ev s54c44f90gaj pol5dlpg9t fa5trrngfu cvrd4cmtmq","quiz_options":{"score":0},"id":"4385177381"},{"position":2,"visible":true,"text":"9egly8imf1 9k1iapox y80fk4 58nrajt2 swkm1na","quiz_options":{"score":0},"id":"4385177382"},{"position":3,"visible":true,"text":"se2mcirb6lt5ty qqt53dn jpg4b3wk0c7 91onwco8d7ll0 e7y4mwxa ojs5nky 6u7am","quiz_options":{"score":0},"id":"4385177383"}]},"page_id":"168831478"},"emitted_at":1674149695305} +{"stream":"survey_questions","data":{"id":"667462172","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ypxnp3k6 708jao1b5ok671 cv8x263j0f nk1a0a5cm 7y4r2bclg2rgkd7 alax412w9y76"}],"href":"https://api.surveymonkey.com/v3/surveys/307785448/pages/168831478/questions/667462172","answers":{"choices":[{"position":1,"visible":true,"text":"dil7s3hpsuf ms76n abih45plj 9bw5noujg c759tcfvo7t3e","quiz_options":{"score":0},"id":"4385177392"},{"position":2,"visible":true,"text":"okltv66m4qav 88ijt vcq7k5m xcpwi9e4v7 ujqbg24ap g715rctpafkm0g","quiz_options":{"score":0},"id":"4385177393"},{"position":3,"visible":true,"text":"vev8vhb11 dc5mn3colgaea8g jflk5j niy1qt8onj788","quiz_options":{"score":0},"id":"4385177394"},{"position":4,"visible":true,"text":"hq1wbebc2gleq tj2vf867 n1aqc afpekt91re 89guq9pn9rrww 0bgvg74","quiz_options":{"score":0},"id":"4385177395"},{"position":5,"visible":true,"text":"bxkr18qipct gp9wcqfk n69e6ai66xmy01w xlh7s17hlsbcyt o16ecq6vf42q crmh6p ykbam9mxc37ah2 ii40872r6mws 2xobrm","quiz_options":{"score":0},"id":"4385177396"},{"position":6,"visible":true,"text":"x18wk 3k4tt8ae kkrj0xjbf krc0uyrj2u 0qq68","quiz_options":{"score":0},"id":"4385177397"},{"position":7,"visible":true,"text":"fkx0pjep58wx jpxs8a7vfnf bq2hlx3vhqsn qv4d1evms x64h8k3e tqaeb3mc a1yiqm7qjgi8 cnaw9173k6js msisp4d7bf12 qan9ffq3sv","quiz_options":{"score":0},"id":"4385177398"},{"position":8,"visible":true,"text":"tdjr97it3qvsl 8pfqjvhuo91 mp8kdeymnwv9f 8apy9eshudwhq veo63l6q9np w18s0102tvjru 6lckytkggn6 ncdlx68","quiz_options":{"score":0},"id":"4385177399"}]},"page_id":"168831478"},"emitted_at":1674149695306} +{"stream":"survey_questions","data":{"id":"667455348","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"se3rt7c 9l8d9rig3sk jk791y4nv9qp2 nof9xr8 6irr0mr2uv73g4 rmv1ko9gx2 qievxp819lc o9jbr n1vrq"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830094/questions/667455348","answers":{"choices":[{"position":1,"visible":true,"text":"6sudul87 6605b94 w6ubg6a7p0v ufh3d5da nyic6pot11a64v9 awpjgnn22pdgup aidahk8krd 0vhentor51fp ujasxxx1srf","quiz_options":{"score":0},"id":"4385138588"},{"position":2,"visible":true,"text":"08yvwmw 441si6svo1bkxm o85tbsa3k wlkn3","quiz_options":{"score":0},"id":"4385138589"},{"position":3,"visible":true,"text":"uvmasd gagqr6qlswnr af0hp3nfg2vucd vbtkx8vssxlvg6k 5g3rhca48m2 y8gwlm2","quiz_options":{"score":0},"id":"4385138590"},{"position":4,"visible":true,"text":"mrjr3x0 57yyh77a3cmlcmj mmwked8tvqnt5 bwe0hh5dqp1sn3 pia1tu u7ujusnwtvt be24cc8s5olebg 5n65mmu5nki2b","quiz_options":{"score":0},"id":"4385138591"},{"position":5,"visible":true,"text":"k3wcw3bjn hq24e21 f5vvmq0kipi 1smhqty4 p8x2xxy0obkxv qsa4cuvmy81r7s 651b5hlw 2ej3xrm289eqd2 ugnf354v90h 92mk44ghps6cm","quiz_options":{"score":0},"id":"4385138592"},{"position":6,"visible":true,"text":"k8yajsxquuu 94uubd5wo9 piwa122aeek 3fhrq5gvwh14jho 6n8k5a54q7nf rnoqwd82y1 tkhxop blr0p2l7utyydd 7eto449ipd","quiz_options":{"score":0},"id":"4385138593"}]},"page_id":"168830094"},"emitted_at":1674149695413} +{"stream":"survey_questions","data":{"id":"667455351","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"dni8kmob8f47ly 92hb1pg6lvuklf f3hvi6 yjiq3bvv yys743quapbmwm 9xclo63 ydxt59b89 iwks1mdba9iuje vmaq243f75y4m 8cqcf54w"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830094/questions/667455351","answers":{"choices":[{"position":1,"visible":true,"text":"9e7yu 2366vw4sa3 rhhgm0 yg8p9f9","quiz_options":{"score":0},"id":"4385138595"},{"position":2,"visible":true,"text":"1ldfxfr k0hnmi dcjdiaquo0xyac remaba5g8 9pslek2fmlvxf7 vn4gl8yjs10up4d b4i21994 78q3d","quiz_options":{"score":0},"id":"4385138596"},{"position":3,"visible":true,"text":"aq8d89iqk6 ytv9mg39tq5 lb5gtx1kdm5a 7scilf5j73g580i tr22c460a1vu dvpernw oy2j9qqnhhbpia9 ufy7twqsl2ovj","quiz_options":{"score":0},"id":"4385138597"},{"position":4,"visible":true,"text":"dlt857wic34l 5y0sijl8 1jmsvy9r e7psvexn8rj0nw ioo4ka04w vtk0ihmg27ac bm60oah9 chljr8vrnt8adx1","quiz_options":{"score":0},"id":"4385138598"},{"position":5,"visible":true,"text":"mk4nh6bnddk1ph 63551586l v0d3vhn w9s7xmbbm3 cbddi6vgmddb se5grc1xr2ycuu bmk1yr7kq3e","quiz_options":{"score":0},"id":"4385138599"},{"position":6,"visible":true,"text":"ob4dd4 r36mdre p96uaag57ld7vo yeqwbn7w2tgi4sj wcgvpd0 4jq0nh42ev8 23i0ye5x 4vuki","quiz_options":{"score":0},"id":"4385138600"}]},"page_id":"168830094"},"emitted_at":1674149695414} +{"stream":"survey_questions","data":{"id":"667455358","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"79kmj4p2d 3sbolhwfrs ioe6b93hwr70jt7 679dpby y4mxy 1pr869ii"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830094/questions/667455358","answers":{"choices":[{"position":1,"visible":true,"text":"mqjitf64d0 k83dvyn 227nrf 7a5bulp 0jvp9hmiew umwdpysrqbgp he3hkvoxi8d t0ekmaqml bniybp7","quiz_options":{"score":0},"id":"4385138620"},{"position":2,"visible":true,"text":"ocaqjvupc or8s5on 2txbvlu6e20 8uxgb ll6ktjtk gnwy7knkeeev y2t9cah46lu7 rkmxywsr 8qgmy6gm3fd84 eko2r","quiz_options":{"score":0},"id":"4385138621"},{"position":3,"visible":true,"text":"3kjxifk f8vld xx9lg2ejtf3ccwx 1rfll3376hrm xwaevy7i2krc 93h2fggv1nak vvo0hqr0n 27qcal0ao","quiz_options":{"score":0},"id":"4385138622"},{"position":4,"visible":true,"text":"qqsv99lam uidx4csd1npsc nccxm6ueer 2ihx3c5ysd","quiz_options":{"score":0},"id":"4385138623"},{"position":5,"visible":true,"text":"3ooy243l5h usutwf3do32na0o t5vo8vggvjl pp44k52k3dw swg9bvhtl v4mn5goadw4 9g9jefyf6qhsijc 2j1bmvuu83brk","quiz_options":{"score":0},"id":"4385138624"},{"position":6,"visible":true,"text":"fnme6flca1yfyo kj1q1j tsfq15e2iam8 tyny80 fjb3nf p0mtkwgteciioq p5b79nk1a44d0re lwpwx8wu0e2 at5p0nbaqbp 67tqasnk0lb9dr","quiz_options":{"score":0},"id":"4385138625"},{"position":7,"visible":true,"text":"8n8el8 it06oap6nv fapkjmk yxemrfihr61i heif6anfb o9nel86ws 2t1vpytr","quiz_options":{"score":0},"id":"4385138626"}]},"page_id":"168830094"},"emitted_at":1674149695414} +{"stream":"survey_questions","data":{"id":"667455370","position":4,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"lqroep8etllsp 3o8w6vilbyqlwkm b5velmro8 b4ylvv9kkt"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830094/questions/667455370","answers":{"choices":[{"position":1,"visible":true,"text":"4bdsyi00551 hsh1woqfmclyma sslfhk y11rdswosp4l 2my277i74fedi lool7","quiz_options":{"score":0},"id":"4385138700"},{"position":2,"visible":true,"text":"qdn040 3tljs j7juh9xjucx 31royj9xs6q lg56gf8c81s","quiz_options":{"score":0},"id":"4385138701"},{"position":3,"visible":true,"text":"ytndri0sy3noxx p2d3euo 4d2jqiygj8jwasr 38lf63x39sxb irlep2 cgi9pr 4pcvga t64nykcc4gn tv9xfejs41 er8a8pw","quiz_options":{"score":0},"id":"4385138702"},{"position":4,"visible":true,"text":"n2hd3mf5 7gg2j7cn55e77 1j1ijenv62 ntd44byw6 g86vqe62ogytk qcodrayuwmht5tn ix3qc42ybhqd 76ry3 goorkieate s2dofir","quiz_options":{"score":0},"id":"4385138703"},{"position":5,"visible":true,"text":"ct0y2yaibh 5hhaeb2u5jmncca ibf7eql6h w3k37s","quiz_options":{"score":0},"id":"4385138704"},{"position":6,"visible":true,"text":"w9647 j2wq2eisb85rlu js474wesi1j 1d7eiqq 3o7ubmmvsbl4","quiz_options":{"score":0},"id":"4385138705"},{"position":7,"visible":true,"text":"deheetxt3hlox 8e4hd76i 517ltrj0v dgi0r19ud5srqj 1qdru4f sl8p3 7gxolfxkhlc5x cm0seo7wroouww","quiz_options":{"score":0},"id":"4385138706"},{"position":8,"visible":true,"text":"4xv8h753xoo8n1 9atxgj8 5eaohgaugpu3in ybq32s67 atg5l7u4aotebk1 0asuiahw4 dyakwm kpqe9vu81dkfvcf","quiz_options":{"score":0},"id":"4385138707"}]},"page_id":"168830094"},"emitted_at":1674149695415} +{"stream":"survey_questions","data":{"id":"667455395","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"0qnmuchico4fa8q dfvkni 15mwj2a8 1c8qh1 y3dml65 yfodif0 uik9a vja72b"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830094/questions/667455395","answers":{"choices":[{"position":1,"visible":true,"text":"k9cwqyrhvt6t2y lijf97ywdxctyr nahqrqwo o73wy4r13r","quiz_options":{"score":0},"id":"4385138779"},{"position":2,"visible":true,"text":"0dtp7umdw2tn 3qerkatyyrcndup s70sgadrf0pjwna 13cc30nv 3fku5vgj5","quiz_options":{"score":0},"id":"4385138780"},{"position":3,"visible":true,"text":"8vwwlvlx3 rl3x4l r3itwqo 2uiml2j417 p0x4d9pxyhs bdyo06b oyuo333qq","quiz_options":{"score":0},"id":"4385138781"},{"position":4,"visible":true,"text":"ua5rn0o lgn9qrvh a3xi82nkmd9s2d sdhqh3q8m yu21i9gn3 u4wyck8efnu 47ubnif60vxre wfs92q1c84 qyyup","quiz_options":{"score":0},"id":"4385138782"}]},"page_id":"168830094"},"emitted_at":1674149695415} +{"stream":"survey_questions","data":{"id":"667455427","position":1,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"bja345d 7gmh5 u335j3ifd bmn2iwulckt qbbgde6 4l86ghgt3bnplod fsq6qpqp ogqqnp01j gycd6318in4xl s7sxc7ric"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830108/questions/667455427","answers":{"choices":[{"position":1,"visible":true,"text":"h1f77hud lvvbp8566vit8 eij3l1f6m86rt9 658f6 auhky2x 1qb9805ptcl4yvs","quiz_options":{"score":0},"id":"4385139013"},{"position":2,"visible":true,"text":"82ow11qv0ewplb iipebne7de pccthtsby8y 87tn87egsum9nd 41xopta 65fhf560c 326vjb4pp4mtdvx 4eqmo8viakl pmuv626kfxaqr 9laiyqibgse9","quiz_options":{"score":0},"id":"4385139014"},{"position":3,"visible":true,"text":"8prnel y3ygc5kxmjbxfc hdd0bos b9w3a1gfm1sm6 8wwao s6j2lw5ennapne 6psoe bxyxi pp141xm uatdplo5f60et","quiz_options":{"score":0},"id":"4385139015"},{"position":4,"visible":true,"text":"yejw4cxbnjeup 9war0kp9wl ngag1wd y6quyhtcv lhai6 6fo022bo2 0y9e1wuj sm9c4jui n9udx","quiz_options":{"score":0},"id":"4385139016"},{"position":5,"visible":true,"text":"o9i4r2ej 825mg 5rifxtuu83ox y3nhp","quiz_options":{"score":0},"id":"4385139017"},{"position":6,"visible":true,"text":"3vukbvawqxox yxo374n8xcpw s6ai05vb64 gld3jyi97 auhaq08 sl5tt43hgv n549d7mf0n7cr2q 44x9v5o31yor0 oel767u6o1evo5 knipqna","quiz_options":{"score":0},"id":"4385139018"}]},"page_id":"168830108"},"emitted_at":1674149695416} +{"stream":"survey_questions","data":{"id":"667455439","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"yvl318t7lj 7wdmc8mttupa 2g7ogtjr976g lm77fy59yrhs4 tb928lr2 kiug5rc d4hq6y1"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830108/questions/667455439","answers":{"choices":[{"position":1,"visible":true,"text":"du6tsy5k rhhm4v540es3mo oqkt8crv5wvgvj s00kbxja5h 6kmpu","quiz_options":{"score":0},"id":"4385139062"},{"position":2,"visible":true,"text":"b52dpf uy6exuyx l6ugq4ki qkl8h9l 8ptnm 2jwismc2by8 ls428u","quiz_options":{"score":0},"id":"4385139063"},{"position":3,"visible":true,"text":"86bpwgdk1q0 4iigbk1xjrm hncx3xkk5lj e75h213rkrpjg cku6p9no3qv rn1dvjp5hmtbfar 694ly6v9m ue5ad4q xomxi5c69o6pqm f75mwyy5nd","quiz_options":{"score":0},"id":"4385139064"}]},"page_id":"168830108"},"emitted_at":1674149695416} +{"stream":"survey_questions","data":{"id":"667455443","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"6myggi xgx2lptp oxfg8bgavhkxd h8586wxt2vv7 tba2bd 07altrm 2vmmtgfir gchrhk6kdw"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830108/questions/667455443","answers":{"choices":[{"position":1,"visible":true,"text":"5acyluby8j u7jbf p5x8foahy k5uk8ubi0 ov4ouretpl lxrf3 ufct467j99f2hfl 7dlgr8eo","quiz_options":{"score":0},"id":"4385139109"},{"position":2,"visible":true,"text":"vpcmt6klp47b0 q3o6j96 3mm9gebofu1n2 jq7dq","quiz_options":{"score":0},"id":"4385139110"},{"position":3,"visible":true,"text":"r1wmg0i0ae892 acmd77ws2k 0pk531 pb5k6xev ury0cf","quiz_options":{"score":0},"id":"4385139111"},{"position":4,"visible":true,"text":"0hemigqnwym5f0j vn57ess p5vjtn nylhr7","quiz_options":{"score":0},"id":"4385139112"},{"position":5,"visible":true,"text":"gl7otpnp 0b43hto2wr0o tnavjwnce9lc5d 7j6hs ca3qbj70t b1nc7q4 7j0696hum k6ytijiprdmdvd","quiz_options":{"score":0},"id":"4385139113"}]},"page_id":"168830108"},"emitted_at":1674149695417} +{"stream":"survey_questions","data":{"id":"667455463","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"pjksyv7o2s qtssl1k83 r6ypxm 30krmk4j0e bp8y6m0or"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830108/questions/667455463","answers":{"choices":[{"position":1,"visible":true,"text":"olpxel7n8ktrjx l0x3kfm fg4f96cpv60w2 kpp8waqc9j1y6 2bjrk4f v33tofsgnbg s6gcg386 kcubx22oev1ju i3n5l7veb","quiz_options":{"score":0},"id":"4385139230"},{"position":2,"visible":true,"text":"jkdmotc7gfb43b2 4cfkvtut 6w3ys rn3v7u17ccsx 0gyynlvql xgsrdfrtffvr","quiz_options":{"score":0},"id":"4385139231"},{"position":3,"visible":true,"text":"7ngjrf1wlkv1 wox4shhjp4 yivmg3epgwl5d 11tfmviaf7pv59s 14c6b1vudh brl9d3b799gibr fknowr6c fi6k91n34pm270","quiz_options":{"score":0},"id":"4385139232"},{"position":4,"visible":true,"text":"o8r5r32univvk5 dhx2tc7hbbgl63n bxhmmoi6vk 1ynu42 8goapcp gh1gr8dab p1iik6y eud8jxcg jilsond0434xp77 g1s9ydwgrd6y5tb","quiz_options":{"score":0},"id":"4385139233"},{"position":5,"visible":true,"text":"p9xp9x7yepqx wg9w4q8 9f8n1maik5weupa 9s5nnuan5i co88w9s89g2pfq lxrdlybm6 fl702pf2x7 xsp9xl8yrrg m8xre7g s61if4ojul0qlm0","quiz_options":{"score":0},"id":"4385139234"},{"position":6,"visible":true,"text":"5k001wyjow 9rfq00sg6vcytu yxddli0wkif3wk1 vxk0kcy6l80jfc a06swtlqbdg 2lk8kytqeeqs 81w3s8","quiz_options":{"score":0},"id":"4385139235"},{"position":7,"visible":true,"text":"ia4knoy0u1vku io2wydrh90d6 52j9qii2gcgc9fk tx7409a0o59ffk0","quiz_options":{"score":0},"id":"4385139236"}]},"page_id":"168830108"},"emitted_at":1674149695417} +{"stream":"survey_questions","data":{"id":"667455466","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"17ks2i1p 1roi7n8j p21kn jkrvnckxot 3nkruc3e ugsatu9qx7wsw qsttqci3i03e4"}],"href":"https://api.surveymonkey.com/v3/surveys/307784863/pages/168830108/questions/667455466","answers":{"choices":[{"position":1,"visible":true,"text":"n1ic8gxnyrf1 5qacyxsh ixbp7b33rq4kigy 2rdbf2a4 rfms8di taxqa3oc","quiz_options":{"score":0},"id":"4385139244"},{"position":2,"visible":true,"text":"i4kx3k5s1t 3qw1r6n two72xjft yvu2k2 lywg4w3xhffbwrv pu20atqyr5g 34tsp4wk nwadhm3qirol8y o5x91 755w2suug91yywd","quiz_options":{"score":0},"id":"4385139245"},{"position":3,"visible":true,"text":"2xl9i1c4 11w3fsb78 bfoj2 4rmfw06mn2lxpjo wfijsno52y90 wxuik4 70c6ioht","quiz_options":{"score":0},"id":"4385139246"}]},"page_id":"168830108"},"emitted_at":1674149695418} +{"stream":"survey_questions","data":{"id":"667455236","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ibdmqewlt gbp5yhhp c8i5s75wwg 0xosr1devp 2ijbswdblw0bjko k6httw7 kfr0tk"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830068/questions/667455236","answers":{"choices":[{"position":1,"visible":true,"text":"3nj2ikx od392yg7 akufy84 6gw9q axmbaw59fn nfc8xe410jg 6allsd7jg7u 3wyrciq0uje8rn0","quiz_options":{"score":0},"id":"4385137904"},{"position":2,"visible":true,"text":"cb0o3tqf5 ijxi31vsg1 i0ga1cu10vmcgry gfmk6","quiz_options":{"score":0},"id":"4385137905"},{"position":3,"visible":true,"text":"i4frvbso f2k3tyww70ehqkp 5qy73 21lpebsil0fwspd kbx0uypchk wqdb8j0a0 8dr1nvs 592s2coha4r0v","quiz_options":{"score":0},"id":"4385137906"},{"position":4,"visible":true,"text":"lmg2vsbrw180cm otp0wq1e2 530jnetga2dp88 e2uploqajl","quiz_options":{"score":0},"id":"4385137907"},{"position":5,"visible":true,"text":"p0gqg3u03 11u6b6 xdb1lqr bxjqwc48sis 5dd68pfpw lxtumpinwgj vwdyg0uw4u wlvjnya7n7fr","quiz_options":{"score":0},"id":"4385137908"},{"position":6,"visible":true,"text":"74mma6 8c3o4 sjp4tg uagi32nfox489p 33m8i9q2t g1ecllv3xjnumg w3i1p26o789 3g8l35xh9m33","quiz_options":{"score":0},"id":"4385137909"},{"position":7,"visible":true,"text":"217g3m8t fdh1g7f6sng3r nt3u7d6n8j1d5 k8hwfegvg4i3xhs 6wung qmv6ilblwpg4t4c r04g9x2 ra26624 hl1gnkjlcu3pn","quiz_options":{"score":0},"id":"4385137910"},{"position":8,"visible":true,"text":"hc8vkvc9 yd3dll3x 2mo5ol4vkqru4k ubqgf odk7ghioir7gc lm0je2 4q3r0 ks32ix ra4rjxv2d9","quiz_options":{"score":0},"id":"4385137911"}]},"page_id":"168830068"},"emitted_at":1674149695519} +{"stream":"survey_questions","data":{"id":"667455240","position":2,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"6vdliabstjs pjq6v4ea sux2ll21xwm7h qt6k4qflxuslj ig5xnx aqyngvnivqhi63 k7trhm7s9n yc1uiij"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830068/questions/667455240","answers":{"choices":[{"position":1,"visible":true,"text":"n59jsjeq v4yp5kweu77pjd 6dsaj62 f51922ixg bfy1tdx0ajmwq sq2g2ca6t1ag t91oetm","quiz_options":{"score":0},"id":"4385137924"},{"position":2,"visible":true,"text":"miou6 s74ictupiv15j a1ojxwpxsc 24wjut22cino3li 3nef4p8a1onycu s2iku aluhi 78a20fa","quiz_options":{"score":0},"id":"4385137925"},{"position":3,"visible":true,"text":"96wygu4eqjryyr vft0o 1omksgrj4e4u hov2cmxl xryqlb9qe5s 69bf1gxp prv2hpeebouh","quiz_options":{"score":0},"id":"4385137926"},{"position":4,"visible":true,"text":"80jv70rswm80ng s3yupsiahmmfxf 0qerhyspf y1shqteym hu7hk9dkpo 58idxrntiwiqc h36nn","quiz_options":{"score":0},"id":"4385137927"}]},"page_id":"168830068"},"emitted_at":1674149695520} +{"stream":"survey_questions","data":{"id":"667455243","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"1lmh6obuf8d67h 9f7639oxptfr pgb8r ud5359op7klll"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830068/questions/667455243","answers":{"choices":[{"position":1,"visible":true,"text":"ht5dtccv20hfamc 6m2dk7 edktxyp 9bpptvmpf 76dv4sin8ps33ac","quiz_options":{"score":0},"id":"4385137931"},{"position":2,"visible":true,"text":"m1e1sw2b xk8ujpclrw rnv8g5qtu04 g1hy75 887fxgre","quiz_options":{"score":0},"id":"4385137932"},{"position":3,"visible":true,"text":"8iqn4b9 ico6j1l7h b44vd6d3383m0 rkm2tqhsi00qy 5hso1f919pq 5yyhjb5h7 dhhsrml5g6kiefx apd2weqls w4hg7 p1rwc2o7pko","quiz_options":{"score":0},"id":"4385137933"},{"position":4,"visible":true,"text":"erh5b0d 47uxrflw 23r21lf24iwf bb8yqiqs79 3y8eb7le7y2ocb8 juni8","quiz_options":{"score":0},"id":"4385137934"},{"position":5,"visible":true,"text":"x32489wko4ns f0ob7be3j pmc9ui3s6qp0 08kfm8yaqcanw 8aot5prgvkqyseo q4vp4n656gj57g xygwva 96gw2r2npb2","quiz_options":{"score":0},"id":"4385137935"},{"position":6,"visible":true,"text":"sjsfbmxa97 xq0084k5hm3 hivfs05sfir 40dj15utx bo9mx1yu0","quiz_options":{"score":0},"id":"4385137936"},{"position":7,"visible":true,"text":"jrb1fu2j x90bw8mlv85gpl0 xfo84sk0jy6 l3392k bucd4nmlc7yj jdj3x2clsir95 uw9dhluee e9ai5v8pm5 4eufmbvvi","quiz_options":{"score":0},"id":"4385137937"}]},"page_id":"168830068"},"emitted_at":1674149695520} +{"stream":"survey_questions","data":{"id":"667455245","position":4,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"h3en3q3evla 6eye52o9ijuo 078omcsgacycjn9 a76ryw2wl 5ejj2a399 r62c2jrxj2x7y"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830068/questions/667455245","answers":{"choices":[{"position":1,"visible":true,"text":"90t457 4q172 f4kmgq3 vc09o 7hqxmsg9jx6 7fenorkuyq ov1kus876aiv0p rrmrq5qlittb6y","quiz_options":{"score":0},"id":"4385137944"},{"position":2,"visible":true,"text":"9aii09 2r9oaqs23 j2x9qy94cnxfgn jrlxnqn9n","quiz_options":{"score":0},"id":"4385137945"},{"position":3,"visible":true,"text":"r8jgwe j87njrw3yo1fla bbngq3 g26et","quiz_options":{"score":0},"id":"4385137946"},{"position":4,"visible":true,"text":"91n95cu 5fp11un vngsubusfe4 vgbho","quiz_options":{"score":0},"id":"4385137947"},{"position":5,"visible":true,"text":"9qw7f8sdfws1 6wfueox bghljj3 4yal6iqt73m6han l921hy 6yr04p7c","quiz_options":{"score":0},"id":"4385137948"},{"position":6,"visible":true,"text":"trrepiynd5phbcr 35t494bg wm02s1clg9wkxl1 eemhx faxm4gd3aqepewc rp34jr2ho5gb5q ol65t043p1 66bg3yos kh4xbmdvqyvm ibrokgs","quiz_options":{"score":0},"id":"4385137949"},{"position":7,"visible":true,"text":"ni9kx4ob31 mbn9d2n3t4j6lal xel50s53bw6eydo b0s9p p512cv6lrh 2jq1h yqmu3hg70qxw99e k1xjbd vv9lbb4kvlt1jg p86c1lob16h","quiz_options":{"score":0},"id":"4385137950"},{"position":8,"visible":true,"text":"3tx1f04qbxgku4k modppm wc68tgts7o me6s4w7ikqolcg4","quiz_options":{"score":0},"id":"4385137951"}]},"page_id":"168830068"},"emitted_at":1674149695521} +{"stream":"survey_questions","data":{"id":"667455263","position":5,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"gx0d844wwsnss b89h0hrw ihlud3p23xbv3 mtv2g99i bda7267b5 pxxsxit4ey lcji2t"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830068/questions/667455263","answers":{"choices":[{"position":1,"visible":true,"text":"e0dhk875qtxip 22ci0nbrenwe tnj1517py jfe77 wnmap goid8 s5r92q9nx9gbxf oy5bkxrwsyqx 7oemt6oc3wcw2 5iwm8","quiz_options":{"score":0},"id":"4385138060"},{"position":2,"visible":true,"text":"nnkw2nj3g1wb 6os5x3rph9 oejmdr7e u9vf9uaxis17w7p vee9xcim164h jkcq9v7e01i njv8rrgfo3hfumd ha6djf y3jckk4un mwvekphui4","quiz_options":{"score":0},"id":"4385138061"},{"position":3,"visible":true,"text":"0b1s6goa 31eeolk05pyxfvy 5fd1rlv8g8g 9iachco 3gqpac6rjo hmq9tr5huh4mxm","quiz_options":{"score":0},"id":"4385138062"},{"position":4,"visible":true,"text":"kkpmmshmp2owso tm5dsf0bt4rm474 w1wwr4 p6ltlf pxm8o1um1cv 8lh8goe9rqqo58x 9j7ej5b 4chhf50nlimyy","quiz_options":{"score":0},"id":"4385138063"},{"position":5,"visible":true,"text":"hygcvxvhqh1um 80ak8e wd9b3vkvg hkyetchu2pdm1 tn8hu6fropre lqx4jilgig1929w","quiz_options":{"score":0},"id":"4385138064"}]},"page_id":"168830068"},"emitted_at":1674149695521} +{"stream":"survey_questions","data":{"id":"667455268","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"of74qo8c 333x5lwc2aral be0joqsxrs hvgeb7ltbcu dtyfa2y98wnn2 jbv7c vjee2juk267 o2fd4pyua"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830074/questions/667455268","answers":{"choices":[{"position":1,"visible":true,"text":"jyb7orcvpwo c9lcx 9aq0cld2fwngg5 ple2j5y3xn2px itcvwnp0rpn2 ykoj6qw las5p s01fya1co65 q6qrkss","quiz_options":{"score":0},"id":"4385138108"},{"position":2,"visible":true,"text":"vd9eniq 7lpv8hbl bq0pjeiplw0 f0hjp7xyv2pk8 82d5r7ciqjbl ngrw1mugyp 0qb5g4vnxxjjpf","quiz_options":{"score":0},"id":"4385138109"},{"position":3,"visible":true,"text":"s84erg ueidus67wjw w849glheqbx5p0m w2am53 erjlbf9pu7","quiz_options":{"score":0},"id":"4385138110"},{"position":4,"visible":true,"text":"n9yd3gp4otjuvma 16axdetwq epitspj3f8hq bgqks3 1s7wh28 qn8cff mfk5el7vr2w26pg 7bkx6xqe 1d9eryxaimnk u6sr9v3id0t","quiz_options":{"score":0},"id":"4385138111"},{"position":5,"visible":true,"text":"l3bswpvl 9obip6i6bvg ytwh8i mmn1n0p9xe9kiu rjgto5mi9ce5dm6","quiz_options":{"score":0},"id":"4385138112"},{"position":6,"visible":true,"text":"a7j5u 2td37rxj7 1lwcfapxi2cw6g 32egv55cc52fcv ay1jvha 1169qapnsa0avix w406ev2kwt1k8n y7xqqn i8uoafghx8 gelu50jf149xtg8","quiz_options":{"score":0},"id":"4385138113"}]},"page_id":"168830074"},"emitted_at":1674149695522} +{"stream":"survey_questions","data":{"id":"667455272","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"svumjkj5ei6 t1jkf ttf93l bilmloj40l q6er242eh bojtdo6 sf5jtk 66a4anc 3j5cbh3k xdfpwwtdf3hpb3"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830074/questions/667455272","answers":{"choices":[{"position":1,"visible":true,"text":"i6ece2o dl6k3s11vd0 shf3m get86","quiz_options":{"score":0},"id":"4385138126"},{"position":2,"visible":true,"text":"fufxxy5ueb 5u74cl6a lol396aaape2 dwgaeqcphflg ogf55axqis54 1a338abonkbvc5 f0hj7rjhu 15gsns71xund4xp","quiz_options":{"score":0},"id":"4385138127"},{"position":3,"visible":true,"text":"di9p4lr30wahw 2rg14l uqqnx1roqy5k65r 2we720uhdva oyb5f74cil odhas8h1n4u3rj dqrhl943a","quiz_options":{"score":0},"id":"4385138128"},{"position":4,"visible":true,"text":"b2j0ivu58yysns 4roq2 mqukye4mmik92 wpr49dqhc6y g6ivs5m7n9 iotdbwjay566 06vv0nn17yfqb59 peuvkh9jjd jly7qt4151 roq63i3ld","quiz_options":{"score":0},"id":"4385138129"},{"position":5,"visible":true,"text":"1rceqano97 sd5m1s3hsskyv7 bwmei412e ikfkbu xhdo2mx6 aqg5dpo10 sfjb38 vj05jf71y","quiz_options":{"score":0},"id":"4385138130"},{"position":6,"visible":true,"text":"7nlryn01exq u14xxgcx8mngy 4pc2y3 48lxatpljatuox vbt7cvv2cipj7 ise8v3j9wnomr ms330kk mgjaw7kgowjfq6","quiz_options":{"score":0},"id":"4385138131"},{"position":7,"visible":true,"text":"y0sx70a14 527jr the5p62a hga0cg5nio53 hv2s0l 6e2lq473mrdqgo","quiz_options":{"score":0},"id":"4385138132"},{"position":8,"visible":true,"text":"rxtxctm7 veua1a ds34biwojid 5cjj1qvd3 v8ksghp4g 6ist9e a5xrfr8r2 ae9rb2xw lguj1iafi","quiz_options":{"score":0},"id":"4385138133"}]},"page_id":"168830074"},"emitted_at":1674149695522} +{"stream":"survey_questions","data":{"id":"667455276","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"6ms3lgjw25pq b20i2lk pkqw6iy j77i7ux32y8 e323sjcc kh8fxxm724seg"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830074/questions/667455276","answers":{"choices":[{"position":1,"visible":true,"text":"nqewt2eyb57 a96u7u 4sr85tfu1 acbvejxvxdui ur1p5sb 4a2r81h0hnw3m 51q3v7s4kllox","quiz_options":{"score":0},"id":"4385138155"},{"position":2,"visible":true,"text":"maso4 ovhyv0ixo hu4gwpq8ky21j9 qo2qc3kuc8n lvou1 a0wbyyp bqr9bre7 csdtfe ya1ltf6kynj93y","quiz_options":{"score":0},"id":"4385138156"},{"position":3,"visible":true,"text":"bjaogae0yct1yk slo3wuygf6 wh0fyn7lym fof1mvu a23qhlj 0rkb9sms 14urdydlb5vht dbw8uh0n3rwdj2i haqry8lhmmpcnmy gw3bvde3lsyue3","quiz_options":{"score":0},"id":"4385138157"}]},"page_id":"168830074"},"emitted_at":1674149695523} +{"stream":"survey_questions","data":{"id":"667455290","position":4,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"8rej58igix 5ev85 tiximo qcv1v11x0ixckwa uhte1umn0p v1h2mr0lm6 duw2034nurju"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830074/questions/667455290","answers":{"choices":[{"position":1,"visible":true,"text":"xx157diwdtvnm 27fuvnqueywcf2d 7fgvt3b 7qte6 xb8oaf6bdynl","quiz_options":{"score":0},"id":"4385138209"},{"position":2,"visible":true,"text":"7uixmrb45 5217t8r2se vv8oeea62 4mjg3vqh og2vgrc5v251 xe8bb89i iefjxgj 5flbdfdb77 amgpmbo6gav6i","quiz_options":{"score":0},"id":"4385138210"},{"position":3,"visible":true,"text":"1sn25lv32td8 516w18 pdmovblb0hbd50 42vmf7","quiz_options":{"score":0},"id":"4385138211"},{"position":4,"visible":true,"text":"rnlfk p5x50v6jxbdfnkc lfjnc39nl8o ok6oyhwope sr35gd1kr5r8fg5 em4qqf7wj tt8linqt 8e8c6d9 s2geie6vw15ny nbkq71k87eu","quiz_options":{"score":0},"id":"4385138212"},{"position":5,"visible":true,"text":"g0otgfss8 l5ag3n97qp b3hbjigxocewjyi dflt05hus4w ddpumu2h7dx6ff pby1r9n a8d6xu9db rwapp","quiz_options":{"score":0},"id":"4385138213"},{"position":6,"visible":true,"text":"1w7np c3t0x knc262g yrfo4f1r4f4reh i8dhd9l1v77 72eamvjcaggrn9 fb7v3v2g2","quiz_options":{"score":0},"id":"4385138214"},{"position":7,"visible":true,"text":"n5h0km6i 58fjgrqq s17q2dwxiha 9wl01dstrdvo upbsfwpyyryn 5ducq pm1vbp w4no5od9pwqf b3e18e3i","quiz_options":{"score":0},"id":"4385138215"},{"position":8,"visible":true,"text":"o9ln4neod6l3v 5p7w4sosqt95e qk9mir6c48fbqj xlglulme cbafrf2g69p6nj htqcbq8v7u24lyc","quiz_options":{"score":0},"id":"4385138216"}]},"page_id":"168830074"},"emitted_at":1674149695523} +{"stream":"survey_questions","data":{"id":"667455293","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"virtcpk896m68m bbdg4mss12ps3 qo4gk153jqp9 iotdms cxo7l2t9 gtofci5cg0er"}],"href":"https://api.surveymonkey.com/v3/surveys/307784846/pages/168830074/questions/667455293","answers":{"choices":[{"position":1,"visible":true,"text":"1vflj0ggk1o9l nbqw3aj69wprwix i955uorj 69jyg2ci6m2lj sb3sor4o2 jmnjbw3i f6weyfas9eq1 yanlggtlu8823f s7fpa7","quiz_options":{"score":0},"id":"4385138239"},{"position":2,"visible":true,"text":"mgeif2h8oilulvj 4q5x7owpgk sxoc48wbr7u3 rmt30uk4m7w7q hpqj8faxcl3qrc5 qfuhdde a1itv i3292al93b","quiz_options":{"score":0},"id":"4385138240"},{"position":3,"visible":true,"text":"3an10n o05hsocsiq0quj5 9ay5x f6p79mjl jjcw6ym9dpfwrj sygnf5 bh3mo 1x146ti6 x4u0e3pxa1ko","quiz_options":{"score":0},"id":"4385138241"},{"position":4,"visible":true,"text":"va9yadd6 xsc7t62edxbwl d7d7n7ecqsealn u9ognb1ox nmaht pwy1d 5mdngtxn4ol1tel dxlmr67c00e hw11e9xn7h","quiz_options":{"score":0},"id":"4385138242"},{"position":5,"visible":true,"text":"b1qfaxqnj91j8mj edwip5b22pdd tuh6g5uodx2 sn4e9lv7xsuul jxmu0iubodnpw 7rqts1liyv27j","quiz_options":{"score":0},"id":"4385138243"}]},"page_id":"168830074"},"emitted_at":1674149695524} +{"stream":"survey_questions","data":{"id":"667455297","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"lq8cc4kb4wb hagmv535tvyfw4 q505o lc9pke7la"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830083/questions/667455297","answers":{"choices":[{"position":1,"visible":true,"text":"gnig56iqkr f2p71ed2w9fr gnpyvvl1 9mc6qpbow5tam mxta8 t9blqkndj9c 1gisvkrl2 0p43lebad 6v56y0e392el ahfwj9tq6lbhm7","quiz_options":{"score":0},"id":"4385138277"},{"position":2,"visible":true,"text":"77wwt btv0ntp gym5s54 lr3ji8wtg4dd qoy58mimj d2yjili","quiz_options":{"score":0},"id":"4385138278"},{"position":3,"visible":true,"text":"9hphq 5qj6yrbg2na mnmodl22e8cg siook2te8gpl","quiz_options":{"score":0},"id":"4385138279"}]},"page_id":"168830083"},"emitted_at":1674149695661} +{"stream":"survey_questions","data":{"id":"667455299","position":2,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"0cphg3eq5u jtapt0bso07ghd 0bgtvsb 5pd5xfhq5t1fgf w0jm2nstiu 93om3crky6skr q49leuh249 3q2tkvncda03g 40orw7354cy p8eku"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830083/questions/667455299","answers":{"choices":[{"position":1,"visible":true,"text":"mrhrmoj8c c8fd51r 0lbuywjnvnmijj 0tmyxfrg fggvqmm3bvivav 8b3elaxwyb d2wp2i hr0jllmfkd7 prv23lvvws27gx 0e6okfhy5sn","quiz_options":{"score":0},"id":"4385138282"},{"position":2,"visible":true,"text":"mv5uq8u7dup2r lfo2ih2jkc5cp r6jydm0x6w 1p1c3s67p57 7eulrlih 1v7p2vig8 99esod2scbs pg87n9lp9mg476 6hmjxdey","quiz_options":{"score":0},"id":"4385138283"},{"position":3,"visible":true,"text":"ahxj3 imh6reai78juny6 bop9te8ej8q6l gwxwkjup43o6tr1 nbvorbchco4ptow pwomv9iyd9t jkrjgggo3s 6ipaxevsfrxrmtw uq3n0cmg k1odeemd29l","quiz_options":{"score":0},"id":"4385138284"},{"position":4,"visible":true,"text":"t4pu3i ixvxd q10uqer3 gkqtljjmflbts","quiz_options":{"score":0},"id":"4385138285"},{"position":5,"visible":true,"text":"xwwgqr 7hlt9dq 1tloksa kehvt","quiz_options":{"score":0},"id":"4385138286"},{"position":6,"visible":true,"text":"2vinv5qis ipjdbl cuwxgei6t8g is2ihbn xs3q9m3rl","quiz_options":{"score":0},"id":"4385138287"}]},"page_id":"168830083"},"emitted_at":1674149695661} +{"stream":"survey_questions","data":{"id":"667455301","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"5h0aahwgk8 eoh0xct ytmtsdr15y fawlco duk30p0qejro"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830083/questions/667455301","answers":{"choices":[{"position":1,"visible":true,"text":"1ib8lq0i q896a iwg01totbr1c8 nic9ye883le 9pjfihiuxbp5 6wu9jitrk1 k3kvcggtbgboo9 nenddst 1qgr2y ilmy2v1ddb9","quiz_options":{"score":0},"id":"4385138288"},{"position":2,"visible":true,"text":"05nxifhb7u4 v0tu1 i8u8dd63ekyj h3xah1h0s7k9vn m95qi vmfn7l5i7iu3es hrywpnsl6rp","quiz_options":{"score":0},"id":"4385138289"},{"position":3,"visible":true,"text":"1fgt8f3w 2i0cyt47w3sl6o k8x6l8i3stl2cc 2h13e9tt1cwaa9 e5l78fvc x2y42gkhqhkc7r","quiz_options":{"score":0},"id":"4385138290"},{"position":4,"visible":true,"text":"ye6nyey79pu2 596slmq qgawtw10v06mtad m113i7i8sd1l x9o2f","quiz_options":{"score":0},"id":"4385138291"},{"position":5,"visible":true,"text":"2mr26jkd368pv wfxs2sxlxag3o3 o15fq 5u1n5tdvs7j0","quiz_options":{"score":0},"id":"4385138292"},{"position":6,"visible":true,"text":"ffdpeyyy nvtjrvxqnqmr f2jwutj 5uw3e0w4n2h dmah35mk v979ctn 2s683h24","quiz_options":{"score":0},"id":"4385138293"},{"position":7,"visible":true,"text":"245tmey w2ltcq50f sktfit h9ymojx j3xrggyo 51d1y","quiz_options":{"score":0},"id":"4385138294"},{"position":8,"visible":true,"text":"lv4qkg6meoylx rmlf7cdb1aht r316f1u kfcwrh5 cm1m3 s5x3eqj3t v1h721uqo3k5km7 9n1oqah9","quiz_options":{"score":0},"id":"4385138295"}]},"page_id":"168830083"},"emitted_at":1674149695662} +{"stream":"survey_questions","data":{"id":"667455314","position":4,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ux15jxtnsx3 vofmkp85 a5kvupg5km6vq0 t5g3uf3q7hn i661htxcb s7x7r26 orjn3oisiik"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830083/questions/667455314","answers":{"choices":[{"position":1,"visible":true,"text":"9fr03iy 9xmpt6xgqwpc k6t7k9gp1ht1 6h620md9wd70hh bs3kw i9htv yil47l xn823m6ih","quiz_options":{"score":0},"id":"4385138315"},{"position":2,"visible":true,"text":"it0ef6tr6h9nt t2jwq18hq3w59p4 oyx7e1bj86bcm 02aaa4kvmf8ru77 ssmts45dadkf gl1spgihc4 acylm 0vmvvgxv6yvey0 8xi073ec2m5","quiz_options":{"score":0},"id":"4385138316"},{"position":3,"visible":true,"text":"8m4mr5q 7wkbq4t8vplwih 0cvqrnnt qt9mjry1n xyqbuaepupf3 ed52xu5ak bd1vxipoo5ad s7pxs874 a9imnp7nm","quiz_options":{"score":0},"id":"4385138317"},{"position":4,"visible":true,"text":"2clmq75t 252dtb2ce3i fld27xux vrip5ox3ds8qnb lvp972rcrcjc ruvk2sclvimuvx 1ud7hrsbm567","quiz_options":{"score":0},"id":"4385138318"},{"position":5,"visible":true,"text":"0l86fyh8uo 090ymhll1pq 9lkwl89vq f1pcky3lidacy9 3ecmm11niu fu8tfp","quiz_options":{"score":0},"id":"4385138319"},{"position":6,"visible":true,"text":"h37f95j7qxup0fe tbx1l3bgii ol4bri0itarcwk doh3p2p0pi jq9guw3h382 08fje7vyonhmfe5 s2ioi7c4v6ci","quiz_options":{"score":0},"id":"4385138320"}]},"page_id":"168830083"},"emitted_at":1674149695662} +{"stream":"survey_questions","data":{"id":"667455318","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"1gm3ed2s89 p2xfqhaj4r p7fwo6 12imab59cds2p aqmmilr2dvmwvky nljfs ts3g4cw6au9jii snbv40hbjcu3"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830083/questions/667455318","answers":{"choices":[{"position":1,"visible":true,"text":"dfyvo2qlanm8s ikbv3wa7030 rmjt80 o7cym2 1r6qae7c70v30 fko724jo7me82s1 bsuhjbov2ttwr q3w1wpn5twsv5e slrnk3sx m3u87rixhv6nmc","quiz_options":{"score":0},"id":"4385138386"},{"position":2,"visible":true,"text":"f47smf7vov8sp1 24r5d2b6q4s duka34dqpn6si 4r2wn 92ekkv2p794l8h l8n6cdc","quiz_options":{"score":0},"id":"4385138387"},{"position":3,"visible":true,"text":"okl5ki7v1r5 4oqdy4 x7ny0qmas 0ddqlr1 ja5wspe 2ieqa m3ucowjq1krai","quiz_options":{"score":0},"id":"4385138388"},{"position":4,"visible":true,"text":"gt5y6 vpjp0e5p6 vqhwb2dytiuihsv ru25v6bm mcihbuved71h2 quy2rej9e8eb97","quiz_options":{"score":0},"id":"4385138389"}]},"page_id":"168830083"},"emitted_at":1674149695662} +{"stream":"survey_questions","data":{"id":"667455323","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"wv0en qigyrej bappxu8q j3ihl9p6ki"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830087/questions/667455323","answers":{"choices":[{"position":1,"visible":true,"text":"xv1me9s6hd aihplmw6 plhv5b k52pvh68j so1ggnlishy5m 6qe1fhw75gt k1jxdmddlhj35en","quiz_options":{"score":0},"id":"4385138412"},{"position":2,"visible":true,"text":"7ecrthfm97aysv 8u9a9sn1f9kj8 90owtm 0h8qgota7j3qpn vnfs9vleja36","quiz_options":{"score":0},"id":"4385138413"},{"position":3,"visible":true,"text":"v519ikhgw0fl s8x0shqsi ssr005 8xm1b7fal622l","quiz_options":{"score":0},"id":"4385138414"},{"position":4,"visible":true,"text":"gbpim9ar0dfgi94 nj0mq3ejst csj5e 763j6d5eo gf4fvw0 s2ea20n33yo iqd5r5l9 3t0okvw2oyh","quiz_options":{"score":0},"id":"4385138415"},{"position":5,"visible":true,"text":"jyxp0s7xfc7td5y vom52gda3dxr ko6256dtc5nv5f 7s8nej n32hyka ywsoxywn","quiz_options":{"score":0},"id":"4385138416"}]},"page_id":"168830087"},"emitted_at":1674149695662} +{"stream":"survey_questions","data":{"id":"667455325","position":2,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"jdkmr4b5t3o9qd6 0u4huyxr8whu cxqri4e2i1a 88yyx cq3xbymudltf y6hmsrn4socbj"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830087/questions/667455325","answers":{"choices":[{"position":1,"visible":true,"text":"5aacsmqn 9p8l1tvy9i 0f92rvnxn9 to5xiaghqmiw 6xik80 jxvy64ut9 bjk3w6ywb","quiz_options":{"score":0},"id":"4385138421"},{"position":2,"visible":true,"text":"bc85jh39p 7nskr87a3x ny6d4 jlbavo9t8h6j6hu dh5ne","quiz_options":{"score":0},"id":"4385138422"},{"position":3,"visible":true,"text":"3vykabcspbl7qt ajqad2gu3v0jbg yeo3sobedrdfe0 1wcrn35 5l7jwq3 f5bc8bx","quiz_options":{"score":0},"id":"4385138423"},{"position":4,"visible":true,"text":"sm6lx7btphddbw 0882qf4o omh4u2i446c9p4q 5hqyq27jlse1e7 ns3xkqg8gcx8pc sjd0skhv 9ydxkadh8e814j7 0mk8m5tm9d38e 23cvhf22g lxb5c7c3p0oe1","quiz_options":{"score":0},"id":"4385138424"},{"position":5,"visible":true,"text":"2x7f7xmgur5a 6mn40jjs2dde 3th2mj8cn dv2pbu6s 7n8hw1f ptapt6nxgddk7a 4cj77u6m3mm idvm31 mx9ygnq3i 4lw1gmm4cwaig","quiz_options":{"score":0},"id":"4385138425"},{"position":6,"visible":true,"text":"3q51n sofjjqlu2y 6088c4c ncdkdt8exikoiir ew86v6gkob94v 7jsgkctqkhm1","quiz_options":{"score":0},"id":"4385138426"},{"position":7,"visible":true,"text":"7lffwkal h4d2j5 dqjf3y5 jwopu 0xf2vqmb6an igo5ri3px747b 0l5s9df7w7s","quiz_options":{"score":0},"id":"4385138427"}]},"page_id":"168830087"},"emitted_at":1674149695662} +{"stream":"survey_questions","data":{"id":"667455328","position":3,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ieffti0yi qcxktrskkug9ij ebvs68ni79 1vrpnp mobkmem70 7uc86c7sx"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830087/questions/667455328","answers":{"choices":[{"position":1,"visible":true,"text":"7vvg5h tc4vy 5c5194t1n6eu wutfyil","quiz_options":{"score":0},"id":"4385138432"},{"position":2,"visible":true,"text":"17dh5pnpe3bc 6gmy6r15tq7 fuwlrcnnt61wotb mj08g80e2pri","quiz_options":{"score":0},"id":"4385138433"},{"position":3,"visible":true,"text":"414pty e5a4vs1 4p6122ihy qnjg9a xuowh226f18 hc449ct tdwm0wu29u","quiz_options":{"score":0},"id":"4385138434"},{"position":4,"visible":true,"text":"24k06ig dhy3huyx0plis 0n5vomlwuo38j 0nft5aw obgn4qcoq0l44b l5dtviydcom58cn 699vqm6 06i0mr52i0 u1mvn mm1bqovxpvtwkok","quiz_options":{"score":0},"id":"4385138435"},{"position":5,"visible":true,"text":"3fr4ttmtr3mhvr d7xcfp6tx48mne3 ttcyvypnom ik9eqkf o7q5x4veph 31y5w8u036c56rh 9yar58y9t5d","quiz_options":{"score":0},"id":"4385138436"},{"position":6,"visible":true,"text":"jrghjb5g3h6t dlpx7hve7lijy 77ergx421ad dgekp5dauuod5t 3mn6a 7m9wvlhvgeua 5orruhepinotb hd948u958 23p4f fmprms","quiz_options":{"score":0},"id":"4385138437"},{"position":7,"visible":true,"text":"dvjf23fp1f8slys 6120e2kbl8p1 f2ildddc i9ocnxo dk1c5jm5bx3 1mmcj3qmntljpbt 889694rivh72g07 25yrmna iwjlytheaogoxq fanj2","quiz_options":{"score":0},"id":"4385138438"},{"position":8,"visible":true,"text":"f2tlh hih5om u7aqefshc47ph sxxt22yg7hi","quiz_options":{"score":0},"id":"4385138439"}]},"page_id":"168830087"},"emitted_at":1674149695663} +{"stream":"survey_questions","data":{"id":"667455329","position":4,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"96mfgjfkj4g 1roun x4g5tcrq d52byhs855 cjc897qm8l udgjrsby"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830087/questions/667455329","answers":{"choices":[{"position":1,"visible":true,"text":"2ny2fhgpm6 aturc40fuggi de2bnbhjnc a8jmpcw54h3nu pij7dkc3 sbrbi0rbi40ox2 wskx4gyt7aoc65 coi4cfe4y p44mj88ikx 93sodjvxi7ny30","quiz_options":{"score":0},"id":"4385138440"},{"position":2,"visible":true,"text":"t1f53t6jo 5s7kaoe ma28g93gfjjsm nwfjlfr2 h4k3jav 4xvidc3fv 8enehee7txlhvp ca6vkoxrb465pi xmi35um8q54r6 4rvruqr46m","quiz_options":{"score":0},"id":"4385138441"},{"position":3,"visible":true,"text":"i7iw5 ap5gjyafbm2l adp3lcc1 52hc8 j6ldt5","quiz_options":{"score":0},"id":"4385138442"},{"position":4,"visible":true,"text":"468nunilylfthe gwy8lhtgga9re4f 5xacgti673jfgs 3eei9s6qwg4avy ksqn6cwpvl585 wtyw59jhy7kck m462cr65qglmq ev7c0b5","quiz_options":{"score":0},"id":"4385138443"},{"position":5,"visible":true,"text":"yxrha98q xgjtmqc6x6tbsq l5co87ln2j3044 49lpv4 l8rfhvt2 rp4v9ofww2bekc7 ops08osul9","quiz_options":{"score":0},"id":"4385138444"},{"position":6,"visible":true,"text":"dbah1h80x 07f9vbs n89jmtwm0t2 47sd0ilc umky7iesp5j1ye f825fm7sn5fteb","quiz_options":{"score":0},"id":"4385138445"},{"position":7,"visible":true,"text":"9ybbt8x1xk o12xtb esgrab5p169kpou jyx54 456l76rs9f 3pcmlfoju rfyofv71 lb7gr6gi2ab0 gmexy","quiz_options":{"score":0},"id":"4385138446"},{"position":8,"visible":true,"text":"k3s5bwg5b2q 0ikv741vhxu3x4w efpp0p21i1s 44ca0fl4bklmn","quiz_options":{"score":0},"id":"4385138447"}]},"page_id":"168830087"},"emitted_at":1674149695663} +{"stream":"survey_questions","data":{"id":"667455332","position":5,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"v80ku mx1co9qwm34tat e9i3mdjcvixs grggkttt lhn014lmqj86 achjddrt9o5fx 9v07aged4niq0g ye1woaclolxuaq w5e7jclooee"}],"href":"https://api.surveymonkey.com/v3/surveys/307784856/pages/168830087/questions/667455332","answers":{"choices":[{"position":1,"visible":true,"text":"u1e4v4rx27412v v9mjw7oaf 0t873cte 57y89l xdqtturimm5 b4stpodx65s8u 2mk2es7jwrpn 7enb3sp29","quiz_options":{"score":0},"id":"4385138468"},{"position":2,"visible":true,"text":"w0mid5oagg qx0e1bvil6w5v6 0cadbm51x7hbg rpxgn9yni","quiz_options":{"score":0},"id":"4385138498"},{"position":3,"visible":true,"text":"7rex013 m75tu1nu9orrc2 k4du9rcsy2n5l0 cfbiki1u6cp2f qe81rjnguphrum j4019 tbl21q37","quiz_options":{"score":0},"id":"4385138499"},{"position":4,"visible":true,"text":"sat97b1hk6dx9k uq924nht7pr8cb 7nr3h2hclmiqg txrkxr29wtrc217 bxmed4ll1b23561 vvsu7 x293il lrl3e","quiz_options":{"score":0},"id":"4385138500"},{"position":5,"visible":true,"text":"h3yh19ckoclpq 0hb213i nj1mfmvbj9 p4ibgetarc6h6u 8kahs","quiz_options":{"score":0},"id":"4385138501"},{"position":6,"visible":true,"text":"xyvg34bae2 7u2n4l87h aec3h1sy5aw62r 60yajbqvxifw65 c7q9ty4pdby2d vyjp2 n7tavs0550g46 07p64c9pp8oo","quiz_options":{"score":0},"id":"4385138502"},{"position":7,"visible":true,"text":"kn8f11mlx sucpq9a 79n0u6vi1tgt b0dom486a929h ocblyvsm6 ti4tnjv533","quiz_options":{"score":0},"id":"4385138503"}]},"page_id":"168830087"},"emitted_at":1674149695663} +{"stream":"survey_questions","data":{"id":"667461429","position":1,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"vq7ho4rb qt0fpw3 fvn1b2y21n fpkcw9v73dqvfq0"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831336/questions/667461429","answers":{"choices":[{"position":1,"visible":true,"text":"p7fu5tjqvd qgxdych hv1xcryuq7jlia 1qjuijk40 2v6u2e kwqcepbnx 2hjta3wqc je2wbyr6337d5 o0fq46u48nsa as5jyqahxo","quiz_options":{"score":0},"id":"4385172931"},{"position":2,"visible":true,"text":"tubba qc6l28jc4m1xi 5lf38au3ry9d o9eh4us9ki ul832 jippjf4 bcsoug6 9w7mnssanfsknl f422osb58c","quiz_options":{"score":0},"id":"4385172932"},{"position":3,"visible":true,"text":"juswx5 78b5n495 duu5kiikm feknbdqqtxg memsnyrcmao1lh","quiz_options":{"score":0},"id":"4385172933"},{"position":4,"visible":true,"text":"xpu48c 3cdbygss10 ujxmb ore7vx7o0x 9qmlb9fig6p3u w6c8oqr5dhp1l g3ihi9p1x kf2lvtbxo 4guw65","quiz_options":{"score":0},"id":"4385172934"},{"position":5,"visible":true,"text":"i9508b8n ld7powh72 nfvmljfhgn3n 643ydxghpbak7v ehe18sjo56yx m1bpaoj4epr 5sv5aw6 7m0bt","quiz_options":{"score":0},"id":"4385172935"},{"position":6,"visible":true,"text":"vwtr9m5fu3ot ltiqhsx3fi uuylf62qec mmn5fxqj","quiz_options":{"score":0},"id":"4385172936"},{"position":7,"visible":true,"text":"ww4qdi5pqg 3qvmj8g0yvx rrr5fx06d7 t6giac3k8 t3d6exqx175ft 10k251y 47v1vnu938 kkqqcsl50d7i","quiz_options":{"score":0},"id":"4385172937"}]},"page_id":"168831336"},"emitted_at":1674149695747} +{"stream":"survey_questions","data":{"id":"667461433","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"3bdmcu bth1w4ifhtcbm slcl3p6ynqhjtyp n5nea bdq5iuvq77m0t"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831336/questions/667461433","answers":{"choices":[{"position":1,"visible":true,"text":"26j27d 5s3pbf08free77b ttq5exq7 n2gm99qkada 3rosqp hn74g juh2ww6","quiz_options":{"score":0},"id":"4385172948"},{"position":2,"visible":true,"text":"phmu9ghnjc vkh0ury2y6et tqj1lwjv 37m5bx1itv a5x88phj3g5 832qd1l rpbrunm7v49 kpmqo a8eqht49077t","quiz_options":{"score":0},"id":"4385172949"},{"position":3,"visible":true,"text":"jbsjkqa2f2xb ks824l5wnkd b0p0elet784r6rw ay5sqsv2vdron lr8mx7r6pc im42wmwt ltyhtay7p8u","quiz_options":{"score":0},"id":"4385172950"},{"position":4,"visible":true,"text":"ikkvwye7tah 7shp28 p7k7je0as5u sdc3f1rvin staohk6a44k nqjsxn3 97bog4jfxn qvorj30xpuh1gip","quiz_options":{"score":0},"id":"4385172951"},{"position":5,"visible":true,"text":"p83chdtsw6s88u 0hqgb8h871mw p0ej9 djy316qsa7iv6pe","quiz_options":{"score":0},"id":"4385172952"},{"position":6,"visible":true,"text":"kgfa1 tyxdxoe3gc xclen0vw9oa2 6bu9o8b6awx hcg9pgsi1av9v 7dicbt6wsee70f glwmxxtcdr 4qi7m9p8tfkxur3 ir5jr31364","quiz_options":{"score":0},"id":"4385172953"},{"position":7,"visible":true,"text":"u6xyfnav qw5qefsi 6ttsauh 3jwvmju8sdjk87 bql4ra2ww 8nxxobw4o58 omi87y6ur8l1f2g 62gaxuq","quiz_options":{"score":0},"id":"4385172954"},{"position":8,"visible":true,"text":"xdjcisgicnaix2 fj8bpbqaqgntr fb2n0o73 mgsb8xg5x3nfg9 9t18omvng4p6e 06wepywm4wku 82pemp2 l3nsu2ib2erbva tj475a","quiz_options":{"score":0},"id":"4385172955"}]},"page_id":"168831336"},"emitted_at":1674149695747} +{"stream":"survey_questions","data":{"id":"667461439","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"vrhftdyyte qir7jajr68td obg64x tu1rcy2h pqnxtdrwxk00a c173brbv 6qfxck7huyx"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831336/questions/667461439","answers":{"choices":[{"position":1,"visible":true,"text":"q6705n7lidhb 0gsqn8 ocnyaudmo ulp9r0rsoheh4f cjwcqblbh o28tilm13w384","quiz_options":{"score":0},"id":"4385172990"},{"position":2,"visible":true,"text":"vyrx1jpjcl07 etxm7itb161 51rf5csw6e5tsh 3ux7rxq2 vct6fys4r7","quiz_options":{"score":0},"id":"4385172991"},{"position":3,"visible":true,"text":"pp1lc12uhii 2qmm3xnfsp i9912c8ac5k74i hxew5625hxtm3 4o658 jenbgi9o89 t4ppqc2qvhlui iu92ym nqjkka1i7","quiz_options":{"score":0},"id":"4385172992"},{"position":4,"visible":true,"text":"6mx9j44l0oa yv2wb1letc4p d3u87l59 vp7a65ykcfjyt tpe3k92l y2flusuc3tc t220oi sekyd","quiz_options":{"score":0},"id":"4385172993"},{"position":5,"visible":true,"text":"4fbdo eli65un2emx e6oyl3a41ugoxb2 saxpsxn6fv l8s2mk0e57d60","quiz_options":{"score":0},"id":"4385172994"},{"position":6,"visible":true,"text":"r5ly6h 7eu4pmnx7tv04g rdtjvlsup3gdn h4qoreg 3ct3fudxbuuw2 b975v8 ilsfmaa22","quiz_options":{"score":0},"id":"4385172995"}]},"page_id":"168831336"},"emitted_at":1674149695747} +{"stream":"survey_questions","data":{"id":"667461441","position":4,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"5p8n613hcmidh w4gyoyf stviro3om xey832w t9w23kj3j4rp5j h2w1swynkq1n9e vqrk2q5eb76p9yn pbj778q19u1hqy r9uvl76qqhfg"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831336/questions/667461441","answers":{"choices":[{"position":1,"visible":true,"text":"tmdpekdn75l9b 3nuus dqbdxtj od2mltbx tmw5kcvpiw 6n41343132bdmc kb3i9er4qg","quiz_options":{"score":0},"id":"4385173020"},{"position":2,"visible":true,"text":"6a8efsocxmc eeohurhhyduo31w c8na1dub0ycx q8314ir twgrq 2ukcrksjt30s","quiz_options":{"score":0},"id":"4385173021"},{"position":3,"visible":true,"text":"ou9m3xl2n9wvn m0wews5 il8o8so pygnm380cd66 7nhjkpk9lu65n 4e3ifrwcb8wr 46bo0ani86m du57mphcnvf1in 6gf58fwm2c50tp","quiz_options":{"score":0},"id":"4385173022"},{"position":4,"visible":true,"text":"nahvw2sd3 hn5trfgqbuso cq82jp7 k8ev0 s8a0a23m0p g2jewuy0wdadgsa hca0mm5q 8agnm fxnf8vrgdybkg04","quiz_options":{"score":0},"id":"4385173023"}]},"page_id":"168831336"},"emitted_at":1674149695748} +{"stream":"survey_questions","data":{"id":"667461444","position":5,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"khys853d7u tgmr69e7mu7 0h6sn7 cja88 nj2os3 wnand9tdmohxca rowe88asxsja1dn rvs12kt5m0wqd2 41pwt1vnhst008o"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831336/questions/667461444","answers":{"choices":[{"position":1,"visible":true,"text":"3k875epq o7u7f5 kihtesav7 qwxlu7j5dj59i 8ghsap3n","quiz_options":{"score":0},"id":"4385173040"},{"position":2,"visible":true,"text":"cemvy 140ek4 d1fumxxlqqnyt 99pb868kg2b hqur2f44k uwr5dyif8g6","quiz_options":{"score":0},"id":"4385173041"},{"position":3,"visible":true,"text":"iykvyahtufq91l bvs9t6mmoyw ld2hep1somcl7 2rs7wk3q 5ncge9mfj1ac r30355p0g4wt c1bx5 n5wgmcud6h","quiz_options":{"score":0},"id":"4385173042"},{"position":4,"visible":true,"text":"a4xcahm1euf l3h1jx abcc0r500rlqyhv 9w01sfmci3j ur9vp3sxfioh r0dksavcmduhk2 kw7nbl 5hys2r8vebx4e 94rajuno uwm3ajywh3vlqbf","quiz_options":{"score":0},"id":"4385173043"},{"position":5,"visible":true,"text":"0whm5dw5kuk44 efrr6i iu9592 a968tp4ff0uaf q0f6mtpcp2x82ae 97m1gvsnfthibp agt6dm3 ip1e3y9","quiz_options":{"score":0},"id":"4385173044"},{"position":6,"visible":true,"text":"hwbtcf7 60gji9qoeovhlf 9b3ijm8 xiw5w09k 460v2o27hacdts 30eq74bg9m qpfv2jd9f3ur rlacn2rf273ck7 2welkh7188h","quiz_options":{"score":0},"id":"4385173045"},{"position":7,"visible":true,"text":"cbqj2nlsnyy tmjyvoija wirje1e bxsqxqe g12fuxmtgfq 7fc74o yrdsjey 1xmv6u077j7l 8hkf7","quiz_options":{"score":0},"id":"4385173046"},{"position":8,"visible":true,"text":"uqlus j3nd9u8g faqa6ghioy60h9 a95spokyj58 ndgctguy75jr ei16b1p7jabc2 hfkfpruds","quiz_options":{"score":0},"id":"4385173047"}]},"page_id":"168831336"},"emitted_at":1674149695748} +{"stream":"survey_questions","data":{"id":"667461449","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"cwipmppqgy2vy 3mn05n4 gedv0twor lyawl9v528587w wfmifrr9hk pykvx52nu1ds5p hh28niyix"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831340/questions/667461449","answers":{"choices":[{"position":1,"visible":true,"text":"3gjvb8l80nc8j 90ebdlnd3hg spis2ipbim9l fjt4xli4a 0bqmti2wp0juwcl cdwl64u2yfghjdf 190uek5lw","quiz_options":{"score":0},"id":"4385173076"},{"position":2,"visible":true,"text":"xjdswmkwm24 rrmxo7otpear8 ogepd7v8br0y5m vi2vyip49ux uvtnq2sem 5gwcppvvvc bw56us8o 1huql09g6pa1ylb","quiz_options":{"score":0},"id":"4385173077"},{"position":3,"visible":true,"text":"gyq16tgah s669s7 j5isg9 l63lf q61pyy oywk58jfmnvy 6lhnukrce1px bwt066s8k5248o sylwt em0x3","quiz_options":{"score":0},"id":"4385173078"}]},"page_id":"168831340"},"emitted_at":1674149695748} +{"stream":"survey_questions","data":{"id":"667461452","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"aku2037bp sxtf1busk2uj 7scwpc00giyau urduwqdsyr3 xk3y39yjywei1y uw7y5s3ky fetwdqr6n qp00a8rofpy 4rwl41yk78jd"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831340/questions/667461452","answers":{"choices":[{"position":1,"visible":true,"text":"86hx9ifui6c4o 02xkn5ghldfw35k faipmm g7634wrx1jfvy jewjfdq kkyyxx00brj wtu0xrhfhvu5lv8 573fv0vtm0n","quiz_options":{"score":0},"id":"4385173088"},{"position":2,"visible":true,"text":"nfeyvnb0kat1yb0 3lk3rse66t8jp w90vixgpu32cyir q03jxd8vch9xn7t 3a0swht9ykadh8 fvoa9t8dri fm0twcdhxm 4ot9xpxe9s08b ho7d1","quiz_options":{"score":0},"id":"4385173089"},{"position":3,"visible":true,"text":"k5pyc4y 9uul1o 7lvigo 7xsdo49jx2yc d07jr1w4","quiz_options":{"score":0},"id":"4385173090"},{"position":4,"visible":true,"text":"3e49s5 gxqwbv w6c2e tjaf7rpgtksjpe ivr0he574 ft8qso pqq4l5hbchy 6mhw0ksgrh xbj4l7a2g","quiz_options":{"score":0},"id":"4385173091"}]},"page_id":"168831340"},"emitted_at":1674149695748} +{"stream":"survey_questions","data":{"id":"667461454","position":3,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"4i1qajt 6sy8nl3hjougqbu okftpe4sw0bpr6 gv1pbyk8km 9ihd103uu2n3lx c6spvurq080unx uswpaexarx"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831340/questions/667461454","answers":{"choices":[{"position":1,"visible":true,"text":"vg0vpi1 100y8 03nnh0 947rcth5ofg x4xfc38q81i6e7 bgf20442q i2jh2 lolt43y3ri2 vl0t6 2rkshapnf","quiz_options":{"score":0},"id":"4385173102"},{"position":2,"visible":true,"text":"o7qfwgqys eyumel 7spc5 42qxefd","quiz_options":{"score":0},"id":"4385173103"},{"position":3,"visible":true,"text":"usb43wqju6w csearclgaedae 2oo3m2a79oo5si granw6hf 9g9ms37peouy gqaxry74 x45yqa0xtkcu g0in9 lyp7xe6 few8vkh7yf","quiz_options":{"score":0},"id":"4385173104"},{"position":4,"visible":true,"text":"spfrf5sfebrhj8 gwodgm3o1 m5cydcxbtk2 pgrj6h mome4a us97ellx2peg3s ilidjy8juu0","quiz_options":{"score":0},"id":"4385173105"},{"position":5,"visible":true,"text":"w579aalpr5gaj1 1h2ud 53d80pebt4ep 0l2gw8fk7fa","quiz_options":{"score":0},"id":"4385173106"}]},"page_id":"168831340"},"emitted_at":1674149695748} +{"stream":"survey_questions","data":{"id":"667461456","position":4,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"is9uyf6ka iel16fh 1f0xg 7mx16glcei fygrn g7l10em5fbeybb 1vgps0k3 q4fls qryybq07jy f3luik1nx09b7so"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831340/questions/667461456","answers":{"choices":[{"position":1,"visible":true,"text":"0fg2b3v4 jmdxep5of1y q2ag243 cfytydw942toqsl 2ixd8iynbs eg22ia","quiz_options":{"score":0},"id":"4385173113"},{"position":2,"visible":true,"text":"0am3pervuj biqdk6g5yw i5xvk20h1n6jv l0v9m5cxn 2vyqvcp8rlthxfv k0v6o48p3v8 551pws1020t98f","quiz_options":{"score":0},"id":"4385173114"},{"position":3,"visible":true,"text":"cjtogxiie0arj ltkgiwrpoa4x1v foqfr1gk406a rale1dx 2p4gjy2g","quiz_options":{"score":0},"id":"4385173115"},{"position":4,"visible":true,"text":"h31va0f12qx3vg 51m9g4bo9 r4ofiqr j1yym2ma8m13kch 1e4jxhdyol2ny nf3fh0h2e qw8euwei1lyhemq 3j4un2sjdoj7 q92100o573tbom 5phvt3n22","quiz_options":{"score":0},"id":"4385173116"},{"position":5,"visible":true,"text":"h8hktik e03ehrspn7 rnjqq4431q2 3bs1nevr8j0 audw020tl kalstea2","quiz_options":{"score":0},"id":"4385173117"},{"position":6,"visible":true,"text":"9w090 e6835j0fvfg89 kk6swkb5g oo0f4ho99x437 qf7b8y1aaa4 i0r03","quiz_options":{"score":0},"id":"4385173118"}]},"page_id":"168831340"},"emitted_at":1674149695749} +{"stream":"survey_questions","data":{"id":"667461462","position":5,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"r1kf2oglhju ou2ldq63qu2g1 ufs1pkw pgr9p75sh9k7 vnu477cixnk1kx nxnfn0ti3x3u9wh ew6ho e18cmaeovxhx h1fac8j8 8ni6ay"}],"href":"https://api.surveymonkey.com/v3/surveys/307785388/pages/168831340/questions/667461462","answers":{"choices":[{"position":1,"visible":true,"text":"xytk5fnqv6odvms sw94ohnav5npnm lg9uf4 iwuqgfd0 5ee0wd5 lfha63ve x55yip4 gxgdkff3sckdn mq1khupscjgqj 8mtp54i5c3rjonv","quiz_options":{"score":0},"id":"4385173167"},{"position":2,"visible":true,"text":"2ammt8omj0l c0i1q 1uvaf203rh1 8wj2w7pp qlqayl9e8ldc y7iivv cv189py2di xuihxup7b2 rh8owrr595st","quiz_options":{"score":0},"id":"4385173168"},{"position":3,"visible":true,"text":"o9cvkj8x k0txiswxc5 ogf66jujgcrwdb l7n0c0rodcx 2gduko0wwimb21 afw8mi","quiz_options":{"score":0},"id":"4385173169"},{"position":4,"visible":true,"text":"mcb62sefmuo plnbygilddeqg u64kkkjvoms4b5q jw4tashu6c7ve12 8di4g100598 ad1bet nnqd7jmg","quiz_options":{"score":0},"id":"4385173170"}]},"page_id":"168831340"},"emitted_at":1674149695749} +{"stream":"survey_questions","data":{"id":"667461690","position":1,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"53o3ibly at73qjs4e4 y9dug7jxfmpmr 8esacb5"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831393/questions/667461690","answers":{"choices":[{"position":1,"visible":true,"text":"lg2mcft4e64 ywiatkmeo ci3rr4l2v0 ot6un49a 4b28sq4g8qv7tj 4ihpko73bp0k6lf swaeo3o4mg2jf5g rnh225wj520w1ps p9emk1wg64vwl","quiz_options":{"score":0},"id":"4385174700"},{"position":2,"visible":true,"text":"ywg8bovna adsahna5kd1jg vdism1 w045ovutkx9 oubne2u vd0x7lh3 y3npa4kfb5","quiz_options":{"score":0},"id":"4385174701"},{"position":3,"visible":true,"text":"xsy4kv tqp8vty29815 de8nt5ab2fyr m6jilru2ek l7fktx3j5mbj l33ip83t4p29 exfygne a1btj95m1r","quiz_options":{"score":0},"id":"4385174702"}]},"page_id":"168831393"},"emitted_at":1674149695838} +{"stream":"survey_questions","data":{"id":"667461777","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"kjqdk eo7hfnu or7bmd1iwqxxp sguqta4f8141iy"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831393/questions/667461777","answers":{"choices":[{"position":1,"visible":true,"text":"11bp1ll11nu0 ool67 tkbke01j3mtq 22f4r54u073p h6kt4puolum4","quiz_options":{"score":0},"id":"4385174970"},{"position":2,"visible":true,"text":"8q53omsxw8 08yyjvj3ns9j yu7yap87 d2tgjv55j5d5o3y dbd69m94qav1wma 8upqf7cliu hb26pytfkwyt rfo2ac4","quiz_options":{"score":0},"id":"4385174971"},{"position":3,"visible":true,"text":"6d7qmnw obxwg4elaab6 2sby04sor66 1wuoh26aftxu7","quiz_options":{"score":0},"id":"4385174972"},{"position":4,"visible":true,"text":"n0xwexbwtviyj1a midgl2jpfdy a72ut27ta 8i9fmkwg0q mbtxhkn b2ut8mtsslkt609 tgmnd7ovnqlbr","quiz_options":{"score":0},"id":"4385174973"},{"position":5,"visible":true,"text":"qjfs0pmb iecatmqyxtk w1s0fs9vcbayf5 rwsneyp0wx6lsyq pq99n hrx1mk4saug gv06qshlabe 0s2t4 h11ee2xna0m8r","quiz_options":{"score":0},"id":"4385174974"},{"position":6,"visible":true,"text":"11uf3he wbstw etbysmu4 c84vqddvx","quiz_options":{"score":0},"id":"4385174975"},{"position":7,"visible":true,"text":"rnfx7m ndifoe7ihy q98pov78016t 8smlnm lb3xicjp9 0r30sie97y12ve7","quiz_options":{"score":0},"id":"4385174976"},{"position":8,"visible":true,"text":"jc8s2ra5qxytxbu u6tj7jgep95 vbva1b4uslioa omku9","quiz_options":{"score":0},"id":"4385174977"}]},"page_id":"168831393"},"emitted_at":1674149695839} +{"stream":"survey_questions","data":{"id":"667461791","position":3,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"0qw6a5lnf426 2sh3g9f8wu xmgflj 41pjy"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831393/questions/667461791","answers":{"choices":[{"position":1,"visible":true,"text":"7kxk7bkhfdx86sh 3rnrsj70ud 048jbf4qx4 p96o8 sn7xi oh02tfput4 6js84u99m5t","quiz_options":{"score":0},"id":"4385175055"},{"position":2,"visible":true,"text":"x259osu33y 8qadkcxpsnk4o20 m4wo3183nwxhgye q4mpg srpfibk96sf t3h2cx58eji x7l0sdipnjece8 7tgwfdfmh9hgdwi w99mkib2","quiz_options":{"score":0},"id":"4385175056"},{"position":3,"visible":true,"text":"lil1tboe p80wa8yed7w8 cll24c2lls6cc0 gpbv7rnap psk1et","quiz_options":{"score":0},"id":"4385175057"},{"position":4,"visible":true,"text":"wodtghhkt 2ae1c8q5s1ha 8lppd7ko84al j95eq1imtu7 6x8qknrhn0 l7h53","quiz_options":{"score":0},"id":"4385175058"}]},"page_id":"168831393"},"emitted_at":1674149695840} +{"stream":"survey_questions","data":{"id":"667461794","position":4,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"q3ay58w3 2rfjgu4 0cf9uh1 pu4fo16w 6c2wkn 1oo7d8"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831393/questions/667461794","answers":{"choices":[{"position":1,"visible":true,"text":"1orbs vtqu62x9bp t75k10e89krhn bdnsfy6ng34g 8yv9p1c92jlbt0s","quiz_options":{"score":0},"id":"4385175070"},{"position":2,"visible":true,"text":"5j8dww2lxevx4a wv3ppbb vnccslwrjjdc n5pjsmw m7b4533y8tcbbus","quiz_options":{"score":0},"id":"4385175071"},{"position":3,"visible":true,"text":"fnjqkqy2 44brrpru jllsj9cdggwt4 behkog76y5ua 7ftpd8c8qhblii","quiz_options":{"score":0},"id":"4385175072"},{"position":4,"visible":true,"text":"srjre1h3w9 qojsh5w2 sq7wva6tkl9 raxp5mldrp","quiz_options":{"score":0},"id":"4385175073"}]},"page_id":"168831393"},"emitted_at":1674149695841} +{"stream":"survey_questions","data":{"id":"667461797","position":5,"visible":true,"family":"single_choice","subtype":"horiz","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"bvrdxa swsrjt sjox8u6767lv5 wgcomvtnoi0yg namiomuh6cou61u nl2v5bfu15i7 sqpu07jp489uc"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831393/questions/667461797","answers":{"choices":[{"position":1,"visible":true,"text":"y97bshsv ite5mgk76p89o yrtt28bmm4jo9 ftc2tnjg","quiz_options":{"score":0},"id":"4385175096"},{"position":2,"visible":true,"text":"r970efm0 5p96h9iy1 o7ft83xrqgsrh8 owk30 buqg6ksd297lw9 lh6ygen9s2rac2b k5d3lbr7m37p","quiz_options":{"score":0},"id":"4385175097"},{"position":3,"visible":true,"text":"ktg10 vp7khp0ucx vuo5qrcor po9nbn6cdpdu56a rt8eiu0umg0dkx j2k8vgtr6","quiz_options":{"score":0},"id":"4385175098"},{"position":4,"visible":true,"text":"iubh35s1gvpm4gj svwbyf7npunm3 0thmsjmt2qb5im0 undxh7b frxykv55emi padtjsk69 qa0jrnwrfoj qqjg6ifvlx0abdb","quiz_options":{"score":0},"id":"4385175099"},{"position":5,"visible":true,"text":"w64hwv9edeaf55 l0gkthucpqj 80wgqsffl 0m45xm56a25psm 8opb8b0gw2w6 n8xex","quiz_options":{"score":0},"id":"4385175100"},{"position":6,"visible":true,"text":"ju3rt297a t028c0b35635 l0kj9vj seuar76 89587qhw46295","quiz_options":{"score":0},"id":"4385175101"},{"position":7,"visible":true,"text":"c4de01u4eil p1p2vy 0gqjglc mc2r97p07 d8d90 j15xktb2idx91 tecpeak3 4anh9o5w7h0runq yr0nd0q9392229","quiz_options":{"score":0},"id":"4385175102"},{"position":8,"visible":true,"text":"yc5erasa3ovk4d ed9adudq8e1s 7wrf8k w9ohrhltg3kv1 wgrnemp 7dqxmy5e bxnsro2sl","quiz_options":{"score":0},"id":"4385175103"}]},"page_id":"168831393"},"emitted_at":1674149695841} +{"stream":"survey_questions","data":{"id":"667461801","position":1,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"iu425c2v4yqs04 43g37 wg8awi s2pjwsm vjhybbs wry73cuukw85l2"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831402/questions/667461801","answers":{"choices":[{"position":1,"visible":true,"text":"xjortc6k0sxjydf rdusho82tsr3l 3b3gch ogabx6895eb3 e7bj5pq poft6c4g1","quiz_options":{"score":0},"id":"4385175115"},{"position":2,"visible":true,"text":"bscm9v7d9nv0 e5x94dt0402ge i7mwtey74y4 er7bwam13 6xcjpw pre922tv ihmvbih 9piadim1lterm","quiz_options":{"score":0},"id":"4385175116"},{"position":3,"visible":true,"text":"ywtecquds5ctgu sjcgsa3hm d087wy 6yjqp0jgm 1ywj8v3wuuq wmlmq essefj rbgrjtv6smxcmag","quiz_options":{"score":0},"id":"4385175117"},{"position":4,"visible":true,"text":"gc8d58x66m ftpowgvwodht9h fj47r927vh826 qrkgkb bcvxni fo6g9wdlxgvnq","quiz_options":{"score":0},"id":"4385175118"},{"position":5,"visible":true,"text":"fxsrgxts qih9ukhxafmmiv4 h2ujh1va9jf b6ho30","quiz_options":{"score":0},"id":"4385175119"},{"position":6,"visible":true,"text":"81binesi6f 7urb7 ylotwabgvbt 03ke1u5h 3ehye3g olw0f83a1h667t 71ujnoyf p49ce","quiz_options":{"score":0},"id":"4385175120"},{"position":7,"visible":true,"text":"ht1rd9ymh 2tftisj80s74mop b1eavw d6vgqwrj","quiz_options":{"score":0},"id":"4385175121"}]},"page_id":"168831402"},"emitted_at":1674149695842} +{"stream":"survey_questions","data":{"id":"667461805","position":2,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"mxlksuvmoras9o 94fj2 dieyg92v384lfv8 f9rwin4 cdmg95wcnt2xa ybcmni7yd1x 1yl4j4q7j"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831402/questions/667461805","answers":{"choices":[{"position":1,"visible":true,"text":"mevjvlslfppe ex251ss vkrs7swus g72vplm9svejkdw 7onhrwlh bouaam3k7cnn yadoqmnhn4swehq u8lhv3fdh58o3 wrbc0y197d","quiz_options":{"score":0},"id":"4385175146"},{"position":2,"visible":true,"text":"uglir jabjq1 poswkedidqpmj ta5ma4ep9xxr ghu3n2a4u7f3orh 9oud3lwe0f vwip14snnv6gtb 5fw29neis71ogsm dpq7m 9an28j1styhc","quiz_options":{"score":0},"id":"4385175147"},{"position":3,"visible":true,"text":"p3ndk7 nxpv9grg77 ek2kndt51g 2v10497 bdr0a3466ao","quiz_options":{"score":0},"id":"4385175148"},{"position":4,"visible":true,"text":"7w76l 9k393odbjg7cht7 mio9w4tcv 6wvef4vm orgg1n 20d8lh8x9osqcv dv50mjj w3g96tt0m3rf9 24uun3grfy2u 4vns2lt","quiz_options":{"score":0},"id":"4385175149"},{"position":5,"visible":true,"text":"4tcuvnn1wxy cqpr795s sfyecjwup fn76iwks5hko rk6wvgyblb3gqe4 rl5ulee1w rq66d","quiz_options":{"score":0},"id":"4385175150"},{"position":6,"visible":true,"text":"cmrjgc4 dwotyvr4o n9jid3i79xoql klkrt23lklso4p hh6d57t5 9xk3o9me 8bkpgry1yu009y","quiz_options":{"score":0},"id":"4385175151"},{"position":7,"visible":true,"text":"43ghcfhsl 74xoo rn7rmgjhd3cq u2x2ir6n449kqxp 8isq7wb tccg39oy1b 9mw0eu1ho0 a4x77foba5y ywgyosh9ue ynh9u8odsos5q2","quiz_options":{"score":0},"id":"4385175152"}]},"page_id":"168831402"},"emitted_at":1674149695842} +{"stream":"survey_questions","data":{"id":"667461811","position":3,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"i4mol250lne3 bhrh2dvt9b qss461 lkb1u chpwmgcnuoeec un2l5"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831402/questions/667461811","answers":{"choices":[{"position":1,"visible":true,"text":"s4xpl2l93 57k4asd04 gyddhg dn53f8bd 8wtgobxts3 ms7nan ns5wv6q2vy6 nnaudmbyu80llen 8be4urorunk","quiz_options":{"score":0},"id":"4385175197"},{"position":2,"visible":true,"text":"ec2l4hr 5lwp46ij8 3tqigw elleyat98j2jjd if8hiia3 vad578","quiz_options":{"score":0},"id":"4385175198"},{"position":3,"visible":true,"text":"9t9nsl0tjlcjxr k1chdb iislvtl gpcnyi82o5ebu 46ayfj 5r3b3w92l6 vaqskragdor","quiz_options":{"score":0},"id":"4385175199"},{"position":4,"visible":true,"text":"8ad404t4 86hyrfxr7 xef8em2 g7u8fc2 rsslpdptcgrsh9n n5pb1u9b","quiz_options":{"score":0},"id":"4385175200"},{"position":5,"visible":true,"text":"bijp3kiqfs quasi89mov1y hj9ku 9w6iuh 81sng4yu32tyh d4q9kbxuoqd2xaq","quiz_options":{"score":0},"id":"4385175201"},{"position":6,"visible":true,"text":"73xiyg2gc q1l6a28s 991jaxujf56sqi rhxrnjum ges25br tb2x1wamrh3jac1 t3s8ocme8q9d8 c505btw99r hwljwx","quiz_options":{"score":0},"id":"4385175202"},{"position":7,"visible":true,"text":"ri75nf 5yy3nq 8m5e68j4mh8m sf1v3 60nijf1oeq9 bwp7bfx9u11a474 w66gfkiayng55q 6h0gp80h","quiz_options":{"score":0},"id":"4385175203"},{"position":8,"visible":true,"text":"nbqtnbbuiue5fr a9s8yrpjm7x0p qid4y913k 8ueagmuy2 5kvul122lseh5h5","quiz_options":{"score":0},"id":"4385175204"}]},"page_id":"168831402"},"emitted_at":1674149695843} +{"stream":"survey_questions","data":{"id":"667461833","position":4,"visible":true,"family":"single_choice","subtype":"menu","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"s3pjyrvc bj99egp0o99 f4ddk7sed bdc2yh24yf tyii1jye nmvwhj18oqxna6b lku2vt8hrnx4 j327a"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831402/questions/667461833","answers":{"choices":[{"position":1,"visible":true,"text":"hqpox2w6wuwyd2 fm6kvjiq6ns5k jv1eutgqn1jj if8dj81e 57l25ev1tal9j","quiz_options":{"score":0},"id":"4385175279"},{"position":2,"visible":true,"text":"vr2p6mvbedcpkak 2c91smhshw9ee mwdy43um3334e7i u4o5frorc3py srt09vtrol825 i9s8n2koaoc6fu","quiz_options":{"score":0},"id":"4385175280"},{"position":3,"visible":true,"text":"1icyn0f tifktyc2uwd k8ehexjojth9a2f 0n7sh5p4i6kswe","quiz_options":{"score":0},"id":"4385175281"},{"position":4,"visible":true,"text":"6ju066 4chnhs0be43dy2 xdkxk37j1i0qy1 43b22jang8 na1yapnjj 7tvgbeu v1dw7as","quiz_options":{"score":0},"id":"4385175282"},{"position":5,"visible":true,"text":"vnslaachd7t07f0 db6whw u6ahc71ajst 2cn114ialhcvex kpwm1qo1y g82xup","quiz_options":{"score":0},"id":"4385175283"},{"position":6,"visible":true,"text":"aniu1f d47vbpsl mm26jpf7 g2io86ycj6yk","quiz_options":{"score":0},"id":"4385175284"}]},"page_id":"168831402"},"emitted_at":1674149695844} +{"stream":"survey_questions","data":{"id":"667461834","position":5,"visible":true,"family":"single_choice","subtype":"vertical","layout":null,"sorting":null,"required":null,"validation":null,"forced_ranking":false,"headings":[{"heading":"ce8esfvsy7xcwqu gemf05b3s5ap5 76oc1 srngx7qca"}],"href":"https://api.surveymonkey.com/v3/surveys/307785415/pages/168831402/questions/667461834","answers":{"choices":[{"position":1,"visible":true,"text":"jggh1bnginkodsv 4jhtwffnlgybux 1na25qx xr5jtwfp vvip26cqr st09ps653caiyj 1icxwhc1hut6","quiz_options":{"score":0},"id":"4385175294"},{"position":2,"visible":true,"text":"gdxye rstmylwe4l w2lkwbdf87e735u rdxn1vxbg3aw kwkn1gfsu s3oa2wx7 6vegglr1ihckyxa","quiz_options":{"score":0},"id":"4385175295"},{"position":3,"visible":true,"text":"qsghk1r8e3p ciuick1mgdwbyc k8wbxctpmtu2v xau05rusflq k3as06r35dl9 38xpts","quiz_options":{"score":0},"id":"4385175296"}]},"page_id":"168831402"},"emitted_at":1674149695844} From 13f568c50227384f8385ba5b38ac253a8ae00340 Mon Sep 17 00:00:00 2001 From: Arsen Losenko <20901439+arsenlosenko@users.noreply.github.com> Date: Tue, 24 Jan 2023 00:29:52 +0200 Subject: [PATCH 047/195] Source Paypal Transaction: enable SAT high strictness (#21593) * Source Paypal Transaction: enable SAT high strictness * Allow to use dates in future for incremental tests --- .../acceptance-test-config.yml | 73 ++++++++++--------- .../integration_tests/abnormal_state.json | 28 +++++-- .../integration_tests/expected_records.jsonl | 41 +++++++++++ .../source_paypal_transaction/source.py | 3 +- 4 files changed, 103 insertions(+), 42 deletions(-) create mode 100644 airbyte-integrations/connectors/source-paypal-transaction/integration_tests/expected_records.jsonl diff --git a/airbyte-integrations/connectors/source-paypal-transaction/acceptance-test-config.yml b/airbyte-integrations/connectors/source-paypal-transaction/acceptance-test-config.yml index 807ccbee333ca..4a82d385b3e16 100644 --- a/airbyte-integrations/connectors/source-paypal-transaction/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-paypal-transaction/acceptance-test-config.yml @@ -1,36 +1,41 @@ -# See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) -# for more information about how to configure these tests -connector_image: airbyte/source-paypal-transaction:dev -tests: - spec: - - spec_path: "source_paypal_transaction/spec.json" +acceptance_tests: + basic_read: + tests: + - config_path: secrets/config.json + empty_streams: + - name: balances + bypass_reason: "value of 'last_refresh_time' field changes during every read" + timeout_seconds: 1200 + expect_records: + path: "integration_tests/expected_records.jsonl" + extra_fields: no + exact_order: no + extra_records: yes connection: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" - - config_path: "secrets/config_oauth.json" - status: "succeed" - - config_path: "integration_tests/invalid_config_oauth.json" - status: "failed" + tests: + - config_path: secrets/config.json + status: succeed + - config_path: integration_tests/invalid_config.json + status: failed + - config_path: secrets/config_oauth.json + status: succeed + - config_path: integration_tests/invalid_config_oauth.json + status: failed discovery: - - config_path: "secrets/config.json" - basic_read: - # Sometimes test could fail (on weekends) because transactions could temporary disappear from Paypal Sandbox account - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - empty_streams: ["transactions"] - # Two-sequence read is failing because of "last_refresh_time" property inside of response, - # It is enough to have basic_read test for all the records to check. - # full_refresh: - # - config_path: "secrets/config.json" - # configured_catalog_path: "integration_tests/configured_catalog.json" - # incremental: - # Only "Transactions" stream is tested here because "Balances" stream always return - # at least one message (and causes test failure) - # - config_path: "secrets/config.json" - # configured_catalog_path: "integration_tests/configured_catalog_transactions.json" - # future_state_path: "integration_tests/abnormal_state.json" - # cursor_paths: - # transactions: ["date"] - + tests: + - config_path: secrets/config.json + full_refresh: + tests: + - config_path: secrets/config.json + configured_catalog_path: integration_tests/configured_catalog.json + incremental: + tests: + - config_path: secrets/config.json + configured_catalog_path: integration_tests/configured_catalog.json + future_state: + future_state_path: integration_tests/abnormal_state.json + spec: + tests: + - spec_path: source_paypal_transaction/spec.json +connector_image: airbyte/source-paypal-transaction:dev +test_strictness_level: high diff --git a/airbyte-integrations/connectors/source-paypal-transaction/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-paypal-transaction/integration_tests/abnormal_state.json index f60c258e0e01a..565f41f6fca12 100644 --- a/airbyte-integrations/connectors/source-paypal-transaction/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-paypal-transaction/integration_tests/abnormal_state.json @@ -1,8 +1,24 @@ -{ - "transactions": { - "date": "2021-07-11T23:00:00+00:00" +[ + { + "type": "STREAM", + "stream": { + "stream_state": { + "date": "2023-06-09T00:00:00+00:00" + }, + "stream_descriptor": { + "name": "balances" + } + } }, - "balances": { - "date": "2021-07-11T23:00:00+00:00" + { + "type": "STREAM", + "stream": { + "stream_state": { + "date": "2023-06-09T00:00:00+00:00" + }, + "stream_descriptor": { + "name": "transactions" + } + } } -} +] diff --git a/airbyte-integrations/connectors/source-paypal-transaction/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-paypal-transaction/integration_tests/expected_records.jsonl new file mode 100644 index 0000000000000..5be7b634a7554 --- /dev/null +++ b/airbyte-integrations/connectors/source-paypal-transaction/integration_tests/expected_records.jsonl @@ -0,0 +1,41 @@ +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "23N61105X92314351", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-04T17:13:23+0000", "transaction_updated_date": "2021-07-04T17:13:23+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "202.58"}, "available_balance": {"currency_code": "USD", "value": "202.58"}, "invoice_id": "48787580055", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "48787580055"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "48787580055"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-04T17:13:23+0000", "transaction_id": "23N61105X92314351"}, "emitted_at": 1673959656444} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "1FN09943JY662130R", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T22:56:54+0000", "transaction_updated_date": "2021-07-05T22:56:54+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "231.52"}, "available_balance": {"currency_code": "USD", "value": "231.52"}, "invoice_id": "65095789448", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "65095789448"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "65095789448"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T22:56:54+0000", "transaction_id": "1FN09943JY662130R"}, "emitted_at": 1673959656446} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "0M443597T0019954R", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:01:13+0000", "transaction_updated_date": "2021-07-05T23:01:13+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "260.46"}, "available_balance": {"currency_code": "USD", "value": "260.46"}, "invoice_id": "41468340464", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "41468340464"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "41468340464"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:01:13+0000", "transaction_id": "0M443597T0019954R"}, "emitted_at": 1673959656448} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "19C257131E850262B", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:02:46+0000", "transaction_updated_date": "2021-07-05T23:02:46+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "289.40"}, "available_balance": {"currency_code": "USD", "value": "289.40"}, "invoice_id": "23749371955", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "23749371955"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "23749371955"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:02:46+0000", "transaction_id": "19C257131E850262B"}, "emitted_at": 1673959656450} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "6S892278N6406494Y", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:06:12+0000", "transaction_updated_date": "2021-07-05T23:06:12+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "318.34"}, "available_balance": {"currency_code": "USD", "value": "318.34"}, "invoice_id": "62173333941", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "62173333941"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "62173333941"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:06:12+0000", "transaction_id": "6S892278N6406494Y"}, "emitted_at": 1673959656453} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "0T320567TS5587836", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:09:04+0000", "transaction_updated_date": "2021-07-05T23:09:04+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "347.28"}, "available_balance": {"currency_code": "USD", "value": "347.28"}, "invoice_id": "56028534885", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "56028534885"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "56028534885"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:09:04+0000", "transaction_id": "0T320567TS5587836"}, "emitted_at": 1673959656455} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "3DF69605L9958744R", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:12:40+0000", "transaction_updated_date": "2021-07-05T23:12:40+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "376.22"}, "available_balance": {"currency_code": "USD", "value": "376.22"}, "invoice_id": "31766547902", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "31766547902"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "31766547902"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:12:40+0000", "transaction_id": "3DF69605L9958744R"}, "emitted_at": 1673959656457} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "2F535603PS249601F", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:12:57+0000", "transaction_updated_date": "2021-07-05T23:12:57+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "405.16"}, "available_balance": {"currency_code": "USD", "value": "405.16"}, "invoice_id": "32577611997", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "32577611997"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "32577611997"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:12:57+0000", "transaction_id": "2F535603PS249601F"}, "emitted_at": 1673959656459} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "243514451L952570P", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:14:02+0000", "transaction_updated_date": "2021-07-05T23:14:02+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "434.10"}, "available_balance": {"currency_code": "USD", "value": "434.10"}, "invoice_id": "23612058730", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "23612058730"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "23612058730"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:14:02+0000", "transaction_id": "243514451L952570P"}, "emitted_at": 1673959656460} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "27881589Y9461861H", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:14:19+0000", "transaction_updated_date": "2021-07-05T23:14:19+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "463.04"}, "available_balance": {"currency_code": "USD", "value": "463.04"}, "invoice_id": "53296156982", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "53296156982"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "53296156982"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:14:19+0000", "transaction_id": "27881589Y9461861H"}, "emitted_at": 1673959656462} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "3MG39755337297727", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:14:36+0000", "transaction_updated_date": "2021-07-05T23:14:36+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "491.98"}, "available_balance": {"currency_code": "USD", "value": "491.98"}, "invoice_id": "53235397043", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "53235397043"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "53235397043"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:14:36+0000", "transaction_id": "3MG39755337297727"}, "emitted_at": 1673959656463} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "32J59182JY5989507", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:14:52+0000", "transaction_updated_date": "2021-07-05T23:14:52+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "520.92"}, "available_balance": {"currency_code": "USD", "value": "520.92"}, "invoice_id": "18208641465", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "18208641465"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "18208641465"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:14:52+0000", "transaction_id": "32J59182JY5989507"}, "emitted_at": 1673959656464} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "52795774C7828234R", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:15:09+0000", "transaction_updated_date": "2021-07-05T23:15:09+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "549.86"}, "available_balance": {"currency_code": "USD", "value": "549.86"}, "invoice_id": "32274344746", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "32274344746"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "32274344746"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:15:09+0000", "transaction_id": "52795774C7828234R"}, "emitted_at": 1673959656465} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "19B82038T92822940", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:15:26+0000", "transaction_updated_date": "2021-07-05T23:15:26+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "578.80"}, "available_balance": {"currency_code": "USD", "value": "578.80"}, "invoice_id": "36419288277", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "36419288277"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "36419288277"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:15:26+0000", "transaction_id": "19B82038T92822940"}, "emitted_at": 1673959656467} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "61G749036D552760G", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:15:42+0000", "transaction_updated_date": "2021-07-05T23:15:42+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "607.74"}, "available_balance": {"currency_code": "USD", "value": "607.74"}, "invoice_id": "88092228645", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "88092228645"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "88092228645"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:15:42+0000", "transaction_id": "61G749036D552760G"}, "emitted_at": 1673959656468} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "5EL311302L108363J", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:15:58+0000", "transaction_updated_date": "2021-07-05T23:15:58+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "636.68"}, "available_balance": {"currency_code": "USD", "value": "636.68"}, "invoice_id": "25494061224", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "25494061224"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "25494061224"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:15:58+0000", "transaction_id": "5EL311302L108363J"}, "emitted_at": 1673959656470} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "3VP82838NP358133N", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:16:15+0000", "transaction_updated_date": "2021-07-05T23:16:15+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "665.62"}, "available_balance": {"currency_code": "USD", "value": "665.62"}, "invoice_id": "82173600275", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "82173600275"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "82173600275"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:16:15+0000", "transaction_id": "3VP82838NP358133N"}, "emitted_at": 1673959656471} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "2N796839EY2539153", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:16:32+0000", "transaction_updated_date": "2021-07-05T23:16:32+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "694.56"}, "available_balance": {"currency_code": "USD", "value": "694.56"}, "invoice_id": "10442581967", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "10442581967"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "10442581967"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:16:32+0000", "transaction_id": "2N796839EY2539153"}, "emitted_at": 1673959656472} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "5WX252723D093564T", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:23:29+0000", "transaction_updated_date": "2021-07-05T23:23:29+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "723.50"}, "available_balance": {"currency_code": "USD", "value": "723.50"}, "invoice_id": "71987080514", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "71987080514"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "71987080514"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:23:29+0000", "transaction_id": "5WX252723D093564T"}, "emitted_at": 1673959656473} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "4PW76195NN227720S", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:23:40+0000", "transaction_updated_date": "2021-07-05T23:23:40+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "752.44"}, "available_balance": {"currency_code": "USD", "value": "752.44"}, "invoice_id": "93025400757", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "93025400757"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "93025400757"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:23:40+0000", "transaction_id": "4PW76195NN227720S"}, "emitted_at": 1673959656474} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "0VE851712U5895412", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:23:51+0000", "transaction_updated_date": "2021-07-05T23:23:51+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "781.38"}, "available_balance": {"currency_code": "USD", "value": "781.38"}, "invoice_id": "46225965444", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "46225965444"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "46225965444"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:23:51+0000", "transaction_id": "0VE851712U5895412"}, "emitted_at": 1673959656475} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "63U003588S1135607", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:29:26+0000", "transaction_updated_date": "2021-07-05T23:29:26+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "810.32"}, "available_balance": {"currency_code": "USD", "value": "810.32"}, "invoice_id": "34635559567", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "34635559567"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "34635559567"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:29:26+0000", "transaction_id": "63U003588S1135607"}, "emitted_at": 1673959656476} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "2AJ081444T051123A", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:29:37+0000", "transaction_updated_date": "2021-07-05T23:29:37+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "839.26"}, "available_balance": {"currency_code": "USD", "value": "839.26"}, "invoice_id": "92544485996", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "92544485996"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "92544485996"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:29:37+0000", "transaction_id": "2AJ081444T051123A"}, "emitted_at": 1673959656477} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "2KU13114TJ604181E", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:29:48+0000", "transaction_updated_date": "2021-07-05T23:29:48+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "868.20"}, "available_balance": {"currency_code": "USD", "value": "868.20"}, "invoice_id": "10184574713", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "10184574713"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "10184574713"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:29:48+0000", "transaction_id": "2KU13114TJ604181E"}, "emitted_at": 1673959656478} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "1ST090036H2235215", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:31:35+0000", "transaction_updated_date": "2021-07-05T23:31:35+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "897.14"}, "available_balance": {"currency_code": "USD", "value": "897.14"}, "invoice_id": "50350860865", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "50350860865"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "50350860865"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:31:35+0000", "transaction_id": "1ST090036H2235215"}, "emitted_at": 1673959656479} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "5BJ418934Y425901G", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:31:46+0000", "transaction_updated_date": "2021-07-05T23:31:46+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "926.08"}, "available_balance": {"currency_code": "USD", "value": "926.08"}, "invoice_id": "12278283055", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "12278283055"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "12278283055"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:31:46+0000", "transaction_id": "5BJ418934Y425901G"}, "emitted_at": 1673959656480} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "0SD21997LN026020M", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:31:56+0000", "transaction_updated_date": "2021-07-05T23:31:56+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "955.02"}, "available_balance": {"currency_code": "USD", "value": "955.02"}, "invoice_id": "52396214250", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "52396214250"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "52396214250"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:31:56+0000", "transaction_id": "0SD21997LN026020M"}, "emitted_at": 1673959656481} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "3BH630398E562901G", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:42:41+0000", "transaction_updated_date": "2021-07-05T23:42:41+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "983.96"}, "available_balance": {"currency_code": "USD", "value": "983.96"}, "invoice_id": "18793521512", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "18793521512"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "18793521512"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:42:41+0000", "transaction_id": "3BH630398E562901G"}, "emitted_at": 1673959656482} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "03D88325GF8461705", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:42:52+0000", "transaction_updated_date": "2021-07-05T23:42:52+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1012.90"}, "available_balance": {"currency_code": "USD", "value": "1012.90"}, "invoice_id": "71793513892", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "71793513892"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "71793513892"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:42:52+0000", "transaction_id": "03D88325GF8461705"}, "emitted_at": 1673959656484} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "51852852PL0100404", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:43:03+0000", "transaction_updated_date": "2021-07-05T23:43:03+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1041.84"}, "available_balance": {"currency_code": "USD", "value": "1041.84"}, "invoice_id": "98653187889", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "98653187889"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "98653187889"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:43:03+0000", "transaction_id": "51852852PL0100404"}, "emitted_at": 1673959656485} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "8MF4324694292993B", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:44:21+0000", "transaction_updated_date": "2021-07-05T23:44:21+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1070.78"}, "available_balance": {"currency_code": "USD", "value": "1070.78"}, "invoice_id": "12489150471", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "12489150471"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "12489150471"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:44:21+0000", "transaction_id": "8MF4324694292993B"}, "emitted_at": 1673959656486} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "87S73342AS6001233", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:44:32+0000", "transaction_updated_date": "2021-07-05T23:44:32+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1099.72"}, "available_balance": {"currency_code": "USD", "value": "1099.72"}, "invoice_id": "99595079917", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "99595079917"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "99595079917"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:44:32+0000", "transaction_id": "87S73342AS6001233"}, "emitted_at": 1673959656487} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "112146346A741221U", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:44:44+0000", "transaction_updated_date": "2021-07-05T23:44:44+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1128.66"}, "available_balance": {"currency_code": "USD", "value": "1128.66"}, "invoice_id": "93286331651", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "93286331651"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "93286331651"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:44:44+0000", "transaction_id": "112146346A741221U"}, "emitted_at": 1673959656488} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "0N2242037Y9449344", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:44:54+0000", "transaction_updated_date": "2021-07-05T23:44:54+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1157.60"}, "available_balance": {"currency_code": "USD", "value": "1157.60"}, "invoice_id": "71349988314", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "71349988314"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "71349988314"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:44:54+0000", "transaction_id": "0N2242037Y9449344"}, "emitted_at": 1673959656489} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "9NH78349H0388780F", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:45:05+0000", "transaction_updated_date": "2021-07-05T23:45:05+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1186.54"}, "available_balance": {"currency_code": "USD", "value": "1186.54"}, "invoice_id": "83951023481", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "83951023481"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "83951023481"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:45:05+0000", "transaction_id": "9NH78349H0388780F"}, "emitted_at": 1673959656490} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "10S137566E4828249", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:45:16+0000", "transaction_updated_date": "2021-07-05T23:45:16+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1215.48"}, "available_balance": {"currency_code": "USD", "value": "1215.48"}, "invoice_id": "88168198250", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "88168198250"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "88168198250"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:45:16+0000", "transaction_id": "10S137566E4828249"}, "emitted_at": 1673959656491} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "7N749695W59419057", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:45:27+0000", "transaction_updated_date": "2021-07-05T23:45:27+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1244.42"}, "available_balance": {"currency_code": "USD", "value": "1244.42"}, "invoice_id": "38296993497", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "38296993497"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "38296993497"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:45:27+0000", "transaction_id": "7N749695W59419057"}, "emitted_at": 1673959656492} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "43X058357A257931N", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:45:39+0000", "transaction_updated_date": "2021-07-05T23:45:39+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1273.36"}, "available_balance": {"currency_code": "USD", "value": "1273.36"}, "invoice_id": "33391419042", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "33391419042"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "33391419042"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:45:39+0000", "transaction_id": "43X058357A257931N"}, "emitted_at": 1673959656493} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "5WL82051VY277550S", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:45:50+0000", "transaction_updated_date": "2021-07-05T23:45:50+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1302.30"}, "available_balance": {"currency_code": "USD", "value": "1302.30"}, "invoice_id": "69341308548", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "69341308548"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "69341308548"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:45:50+0000", "transaction_id": "5WL82051VY277550S"}, "emitted_at": 1673959656494} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "9CG36572NK0728016", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:46:01+0000", "transaction_updated_date": "2021-07-05T23:46:01+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1331.24"}, "available_balance": {"currency_code": "USD", "value": "1331.24"}, "invoice_id": "70491310163", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "70491310163"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "70491310163"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:46:01+0000", "transaction_id": "9CG36572NK0728016"}, "emitted_at": 1673959656495} +{"stream": "transactions", "data": {"transaction_info": {"paypal_account_id": "ZE5533HZPGMC6", "transaction_id": "9K759703FU663194K", "transaction_event_code": "T0006", "transaction_initiation_date": "2021-07-05T23:46:43+0000", "transaction_updated_date": "2021-07-05T23:46:43+0000", "transaction_amount": {"currency_code": "USD", "value": "30.11"}, "fee_amount": {"currency_code": "USD", "value": "-1.17"}, "insurance_amount": {"currency_code": "USD", "value": "0.01"}, "shipping_amount": {"currency_code": "USD", "value": "1.03"}, "shipping_discount_amount": {"currency_code": "USD", "value": "1.00"}, "transaction_status": "S", "transaction_subject": "This is the payment transaction description.", "ending_balance": {"currency_code": "USD", "value": "1360.18"}, "available_balance": {"currency_code": "USD", "value": "1360.18"}, "invoice_id": "44794712899", "custom_field": "EBAY_EMS_90048630020055", "protection_eligibility": "01"}, "payer_info": {"account_id": "ZE5533HZPGMC6", "email_address": "integration-test-buyer@airbyte.io", "address_status": "Y", "payer_status": "Y", "payer_name": {"given_name": "test", "surname": "buyer", "alternate_full_name": "test buyer"}, "country_code": "US"}, "shipping_info": {"name": "Hello World", "address": {"line1": "4thFloor", "line2": "unit#34", "city": "SAn Jose", "state": "CA", "country_code": "US", "postal_code": "95131"}}, "cart_info": {"item_details": [{"item_code": "1", "item_name": "hat", "item_description": "Brown color hat", "item_quantity": "5", "item_unit_price": {"currency_code": "USD", "value": "3.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.05"}}], "total_item_amount": {"currency_code": "USD", "value": "15.05"}, "invoice_number": "44794712899"}, {"item_code": "product34", "item_name": "handbag", "item_description": "Black color hand bag", "item_quantity": "1", "item_unit_price": {"currency_code": "USD", "value": "15.00"}, "item_amount": {"currency_code": "USD", "value": "15.00"}, "tax_amounts": [{"tax_amount": {"currency_code": "USD", "value": "0.02"}}], "total_item_amount": {"currency_code": "USD", "value": "15.02"}, "invoice_number": "44794712899"}]}, "store_info": {}, "auction_info": {}, "incentive_info": {}, "transaction_initiation_date": "2021-07-05T23:46:43+0000", "transaction_id": "9K759703FU663194K"}, "emitted_at": 1673959656495} \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-paypal-transaction/source_paypal_transaction/source.py b/airbyte-integrations/connectors/source-paypal-transaction/source_paypal_transaction/source.py index 9606eb2de99df..45af4a71bc5d3 100644 --- a/airbyte-integrations/connectors/source-paypal-transaction/source_paypal_transaction/source.py +++ b/airbyte-integrations/connectors/source-paypal-transaction/source_paypal_transaction/source.py @@ -265,8 +265,7 @@ def stream_slices( slice_start_date = self.start_date if stream_state: - # if stream_state_date is in the future (for example during tests) then reset it to maximum_allowed_start_date: - stream_state_date = min(isoparse(stream_state.get("date")), self.maximum_allowed_start_date) + stream_state_date = isoparse(stream_state.get("date")) # slice_start_date should be the most recent date: slice_start_date = max(slice_start_date, stream_state_date) From 6217c292fe01b3c5c989e56ab00b71c83d1cbb65 Mon Sep 17 00:00:00 2001 From: Artem Inzhyyants <36314070+artem1205@users.noreply.github.com> Date: Tue, 24 Jan 2023 00:36:24 +0100 Subject: [PATCH 048/195] Source Google Ads: Fix multibyte issue (#21705) * Source Google Ads: Fix multibyte issue; Bump google-ads package to 19.0.0 * Source Google Ads: update docs * auto-bump connector version Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- airbyte-config/init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-google-ads/Dockerfile | 2 +- airbyte-integrations/connectors/source-google-ads/setup.py | 2 +- docs/integrations/sources/google-ads.md | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 9a03ea0179555..44dd3a5f29570 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -645,7 +645,7 @@ - name: Google Ads sourceDefinitionId: 253487c0-2246-43ba-a21f-5116b20a2c50 dockerRepository: airbyte/source-google-ads - dockerImageTag: 0.2.8 + dockerImageTag: 0.2.9 documentationUrl: https://docs.airbyte.com/integrations/sources/google-ads icon: google-adwords.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 8739219dcc27a..63f14ef901a5e 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -5215,7 +5215,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-google-ads:0.2.8" +- dockerImage: "airbyte/source-google-ads:0.2.9" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/google-ads" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-google-ads/Dockerfile b/airbyte-integrations/connectors/source-google-ads/Dockerfile index 3a43a8003271d..d3d623f2d08e4 100644 --- a/airbyte-integrations/connectors/source-google-ads/Dockerfile +++ b/airbyte-integrations/connectors/source-google-ads/Dockerfile @@ -13,5 +13,5 @@ COPY main.py ./ ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.8 +LABEL io.airbyte.version=0.2.9 LABEL io.airbyte.name=airbyte/source-google-ads diff --git a/airbyte-integrations/connectors/source-google-ads/setup.py b/airbyte-integrations/connectors/source-google-ads/setup.py index fa702d2f0963f..4ac9ab965b30e 100644 --- a/airbyte-integrations/connectors/source-google-ads/setup.py +++ b/airbyte-integrations/connectors/source-google-ads/setup.py @@ -7,7 +7,7 @@ # pin protobuf==3.20.0 as other versions may cause problems on different architectures # (see https://github.com/airbytehq/airbyte/issues/13580) -MAIN_REQUIREMENTS = ["airbyte-cdk>=0.2.2", "google-ads==17.0.0", "protobuf==3.20.0", "pendulum"] +MAIN_REQUIREMENTS = ["airbyte-cdk>=0.2.2", "google-ads==19.0.0", "protobuf", "pendulum"] TEST_REQUIREMENTS = ["pytest~=6.1", "pytest-mock", "freezegun", "requests-mock"] diff --git a/docs/integrations/sources/google-ads.md b/docs/integrations/sources/google-ads.md index 5077574c55e5e..33830fd2b956c 100644 --- a/docs/integrations/sources/google-ads.md +++ b/docs/integrations/sources/google-ads.md @@ -139,6 +139,7 @@ Due to a limitation in the Google Ads API which does not allow getting performan | Version | Date | Pull Request | Subject | |:---------|:-----------|:---------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------| +| `0.2.9` | 2023-01-23 | [21705](https://github.com/airbytehq/airbyte/pull/21705) | Fix multibyte issue; Bump google-ads package to 19.0.0 | | `0.2.8` | 2023-01-18 | [21517](https://github.com/airbytehq/airbyte/pull/21517) | Write fewer logs | | `0.2.7` | 2023-01-10 | [20755](https://github.com/airbytehq/airbyte/pull/20755) | Add more logs to debug stuck syncs | | `0.2.6` | 2022-12-22 | [20855](https://github.com/airbytehq/airbyte/pull/20855) | Retry 429 and 5xx errors | From 072717eb414c411e63db326921730a900a0e3314 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Tue, 24 Jan 2023 00:59:19 +0100 Subject: [PATCH 049/195] Include module name in CSS class names (#21746) --- airbyte-webapp/vite.config.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/airbyte-webapp/vite.config.ts b/airbyte-webapp/vite.config.ts index 17bd40e531551..d98938c2cb257 100644 --- a/airbyte-webapp/vite.config.ts +++ b/airbyte-webapp/vite.config.ts @@ -69,6 +69,11 @@ export default defineConfig(({ mode }) => { define: { ...processEnv, }, + css: { + modules: { + generateScopedName: "[name]__[local]__[contenthash:6]", + }, + }, resolve: { alias: { // Allow @use "scss/" imports in SASS From 615bce0c053ae82bbcef5b3aa7a0c61bc20c5c77 Mon Sep 17 00:00:00 2001 From: Greg Solovyev Date: Mon, 23 Jan 2023 16:31:51 -0800 Subject: [PATCH 050/195] Community PR: Support CMEK or the GCS destination connector (#21682) Community PR #20351: Support CMEK or the GCS destination connector (#21682) --- .../seed/destination_definitions.yaml | 2 +- .../resources/seed/destination_specs.yaml | 2 +- .../connectors/destination-gcs/Dockerfile | 2 +- .../sample_files/configured_catalog.json | 27 +++++++++++++++++++ .../sample_files/messages.jsonl | 2 ++ .../sample_secrets/config.json | 3 +++ .../destination/gcs/GcsDestination.java | 3 +++ .../destination/gcs/GcsDestinationConfig.java | 7 ++++- docs/integrations/destinations/gcs.md | 1 + 9 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 airbyte-integrations/connectors/destination-gcs/sample_files/configured_catalog.json create mode 100644 airbyte-integrations/connectors/destination-gcs/sample_files/messages.jsonl diff --git a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml index b055912956595..dbda9df745b9e 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml @@ -139,7 +139,7 @@ - name: Google Cloud Storage (GCS) destinationDefinitionId: ca8f6566-e555-4b40-943a-545bf123117a dockerRepository: airbyte/destination-gcs - dockerImageTag: 0.2.13 + dockerImageTag: 0.2.14 documentationUrl: https://docs.airbyte.com/integrations/destinations/gcs icon: googlecloudstorage.svg resourceRequirements: diff --git a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml index 7f34e408d5b9d..7d6ad329efbe2 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml @@ -2325,7 +2325,7 @@ supported_destination_sync_modes: - "overwrite" - "append" -- dockerImage: "airbyte/destination-gcs:0.2.13" +- dockerImage: "airbyte/destination-gcs:0.2.14" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/gcs" connectionSpecification: diff --git a/airbyte-integrations/connectors/destination-gcs/Dockerfile b/airbyte-integrations/connectors/destination-gcs/Dockerfile index f4d34c04bceb0..4002dda632613 100644 --- a/airbyte-integrations/connectors/destination-gcs/Dockerfile +++ b/airbyte-integrations/connectors/destination-gcs/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION destination-gcs COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=0.2.13 +LABEL io.airbyte.version=0.2.14 LABEL io.airbyte.name=airbyte/destination-gcs diff --git a/airbyte-integrations/connectors/destination-gcs/sample_files/configured_catalog.json b/airbyte-integrations/connectors/destination-gcs/sample_files/configured_catalog.json new file mode 100644 index 0000000000000..ee132a2e53a77 --- /dev/null +++ b/airbyte-integrations/connectors/destination-gcs/sample_files/configured_catalog.json @@ -0,0 +1,27 @@ +{ + "streams": [ + { + "sync_mode": "full_refresh", + "destination_sync_mode": "append", + "stream": { + "name": "ab-airbyte-testing", + "supported_sync_modes": ["full_refresh"], + "source_defined_cursor": false, + "json_schema": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "body": { + "type": "string" + }, + "attributes": { + "type": ["null", "object"] + } + } + } + } + } + ] +} diff --git a/airbyte-integrations/connectors/destination-gcs/sample_files/messages.jsonl b/airbyte-integrations/connectors/destination-gcs/sample_files/messages.jsonl new file mode 100644 index 0000000000000..e1d0682f9dad2 --- /dev/null +++ b/airbyte-integrations/connectors/destination-gcs/sample_files/messages.jsonl @@ -0,0 +1,2 @@ +{"type": "RECORD", "record": {"stream": "ab-airbyte-testing", "data": {"_ab_pk": "my_value", "column2": 221, "column3": "2021-01-01T20:10:22", "column4": 1.214, "column5": [1,2,3]}, "emitted_at": 1626172757000}} +{"type": "RECORD", "record": {"stream": "ab-airbyte-testing", "data": {"_ab_pk": "my_value2", "column2": 222, "column3": "2021-01-02T22:10:22", "column5": [1,2,null]}, "emitted_at": 1626172757000}} diff --git a/airbyte-integrations/connectors/destination-gcs/sample_secrets/config.json b/airbyte-integrations/connectors/destination-gcs/sample_secrets/config.json index 6340e629e9bbb..9c209b519665d 100644 --- a/airbyte-integrations/connectors/destination-gcs/sample_secrets/config.json +++ b/airbyte-integrations/connectors/destination-gcs/sample_secrets/config.json @@ -6,5 +6,8 @@ "credential_type": "HMAC_KEY", "hmac_key_access_id": "", "hmac_key_secret": "" + }, + "format": { + "format_type": "CSV" } } diff --git a/airbyte-integrations/connectors/destination-gcs/src/main/java/io/airbyte/integrations/destination/gcs/GcsDestination.java b/airbyte-integrations/connectors/destination-gcs/src/main/java/io/airbyte/integrations/destination/gcs/GcsDestination.java index 6ea195359997c..1a3ac18a11307 100644 --- a/airbyte-integrations/connectors/destination-gcs/src/main/java/io/airbyte/integrations/destination/gcs/GcsDestination.java +++ b/airbyte-integrations/connectors/destination-gcs/src/main/java/io/airbyte/integrations/destination/gcs/GcsDestination.java @@ -8,6 +8,7 @@ import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.AmazonS3Exception; +import com.amazonaws.services.s3.internal.SkipMd5CheckStrategy; import com.fasterxml.jackson.databind.JsonNode; import io.airbyte.integrations.BaseConnector; import io.airbyte.integrations.base.AirbyteMessageConsumer; @@ -40,6 +41,8 @@ public GcsDestination() { } public static void main(final String[] args) throws Exception { + System.setProperty(SkipMd5CheckStrategy.DISABLE_GET_OBJECT_MD5_VALIDATION_PROPERTY, "true"); + System.setProperty(SkipMd5CheckStrategy.DISABLE_PUT_OBJECT_MD5_VALIDATION_PROPERTY, "true"); new IntegrationRunner(new GcsDestination()).run(args); } diff --git a/airbyte-integrations/connectors/destination-gcs/src/main/java/io/airbyte/integrations/destination/gcs/GcsDestinationConfig.java b/airbyte-integrations/connectors/destination-gcs/src/main/java/io/airbyte/integrations/destination/gcs/GcsDestinationConfig.java index 16ddb90ce1463..e3b260e2fecba 100644 --- a/airbyte-integrations/connectors/destination-gcs/src/main/java/io/airbyte/integrations/destination/gcs/GcsDestinationConfig.java +++ b/airbyte-integrations/connectors/destination-gcs/src/main/java/io/airbyte/integrations/destination/gcs/GcsDestinationConfig.java @@ -15,6 +15,7 @@ import io.airbyte.integrations.destination.gcs.credential.GcsHmacKeyCredentialConfig; import io.airbyte.integrations.destination.s3.S3DestinationConfig; import io.airbyte.integrations.destination.s3.S3DestinationConstants; +import io.airbyte.integrations.destination.s3.S3StorageOperations; import io.airbyte.integrations.destination.s3.S3FormatConfig; import io.airbyte.integrations.destination.s3.S3FormatConfigs; @@ -33,6 +34,7 @@ public GcsDestinationConfig(final String bucketName, final String bucketRegion, final GcsCredentialConfig credentialConfig, final S3FormatConfig formatConfig) { + super(GCS_ENDPOINT, bucketName, bucketPath, @@ -40,7 +42,10 @@ public GcsDestinationConfig(final String bucketName, S3DestinationConstants.DEFAULT_PATH_FORMAT, credentialConfig.getS3CredentialConfig().orElseThrow(), formatConfig, - null); + null, + null, + false, + S3StorageOperations.DEFAULT_UPLOAD_THREADS); this.credentialConfig = credentialConfig; } diff --git a/docs/integrations/destinations/gcs.md b/docs/integrations/destinations/gcs.md index e988530da08ce..8bfd890f17275 100644 --- a/docs/integrations/destinations/gcs.md +++ b/docs/integrations/destinations/gcs.md @@ -237,6 +237,7 @@ Under the hood, an Airbyte data stream in Json schema is first converted to an A | Version | Date | Pull Request | Subject | |:--------| :--- |:------------------------------------------------------------| :--- | +| 0.2.14 | 2023-11-23 | [\#21682](https://github.com/airbytehq/airbyte/pull/21682) | Add support for buckets with Customer-Managed Encryption Key | | 0.2.13 | 2023-01-18 | [#21087](https://github.com/airbytehq/airbyte/pull/21087) | Wrap Authentication Errors as Config Exceptions | | 0.2.12 | 2022-10-18 | [\#17901](https://github.com/airbytehq/airbyte/pull/17901) | Fix logging to GCS | | 0.2.11 | 2022-09-01 | [\#16243](https://github.com/airbytehq/airbyte/pull/16243) | Fix Json to Avro conversion when there is field name clash from combined restrictions (`anyOf`, `oneOf`, `allOf` fields) | From 290b16b0ccdb36d22379b6eff3534c1630fe6c8b Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 24 Jan 2023 01:34:09 +0100 Subject: [PATCH 051/195] =?UTF-8?q?=F0=9F=AA=9F=F0=9F=90=9B=20Connector=20?= =?UTF-8?q?builder=20UI:=20Fix=20inputs=20modal=20(#21643)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix * fix Co-authored-by: Lake Mossman --- .../components/connectorBuilder/Builder/BuilderField.tsx | 3 ++- .../src/components/connectorBuilder/Builder/InputsForm.tsx | 7 ------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderField.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderField.tsx index 0e2a0f863ac57..497523e3a9b09 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderField.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderField.tsx @@ -149,7 +149,8 @@ const InnerBuilderField: React.FC> = export const BuilderField: React.FC = (props) => { return ( - + // The key is set to enforce a re-render of the component if the type change, otherwise changes in props might not be reflected correctly + {({ field, form, meta }: FastFieldProps) => ( )} diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.tsx index 33f0e94a1ca60..2ab7c5415aa77 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.tsx @@ -242,13 +242,6 @@ const InputModal = ({ label={formatMessage({ id: "connectorBuilder.inputModal.default" })} /> )} - ) : ( From 06e88849f0d8a05d651a3b5a47390a0babb5e888 Mon Sep 17 00:00:00 2001 From: Denys Davydov Date: Tue, 24 Jan 2023 09:13:05 +0200 Subject: [PATCH 052/195] Source Gitlab: fix missing data issue (#21713) * #21076 source gitlab: fix missing data issue * #21076 source gitlab: upd changelog * auto-bump connector version Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-gitlab/Dockerfile | 2 +- .../source-gitlab/acceptance-test-config.yml | 6 -- .../source-gitlab/source_gitlab/streams.py | 68 +++++++++++++++---- .../source-gitlab/unit_tests/test_streams.py | 9 ++- docs/integrations/sources/gitlab.md | 1 + 7 files changed, 63 insertions(+), 27 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 44dd3a5f29570..867c293e56fef 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -605,7 +605,7 @@ - name: Gitlab sourceDefinitionId: 5e6175e5-68e1-4c17-bff9-56103bbb0d80 dockerRepository: airbyte/source-gitlab - dockerImageTag: 1.0.0 + dockerImageTag: 1.0.1 documentationUrl: https://docs.airbyte.com/integrations/sources/gitlab icon: gitlab.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 63f14ef901a5e..4a7a7cb364afc 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -4732,7 +4732,7 @@ path_in_connector_config: - "credentials" - "client_secret" -- dockerImage: "airbyte/source-gitlab:1.0.0" +- dockerImage: "airbyte/source-gitlab:1.0.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/gitlab" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-gitlab/Dockerfile b/airbyte-integrations/connectors/source-gitlab/Dockerfile index 5466ec492148d..f3d921dc247b3 100644 --- a/airbyte-integrations/connectors/source-gitlab/Dockerfile +++ b/airbyte-integrations/connectors/source-gitlab/Dockerfile @@ -13,5 +13,5 @@ COPY main.py ./ ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=1.0.0 +LABEL io.airbyte.version=1.0.1 LABEL io.airbyte.name=airbyte/source-gitlab diff --git a/airbyte-integrations/connectors/source-gitlab/acceptance-test-config.yml b/airbyte-integrations/connectors/source-gitlab/acceptance-test-config.yml index 2fcb99e43b6de..fe27c4586a77f 100644 --- a/airbyte-integrations/connectors/source-gitlab/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-gitlab/acceptance-test-config.yml @@ -4,8 +4,6 @@ acceptance_tests: spec: tests: - spec_path: "source_gitlab/spec.json" - backward_compatibility_tests_config: - disable_for_version: "0.1.12" connection: tests: - config_path: "secrets/config.json" @@ -17,11 +15,7 @@ acceptance_tests: discovery: tests: - config_path: "secrets/config.json" - backward_compatibility_tests_config: - disable_for_version: "0.1.12" - config_path: "secrets/config_oauth.json" - backward_compatibility_tests_config: - disable_for_version: "0.1.12" basic_read: tests: - config_path: "secrets/config.json" diff --git a/airbyte-integrations/connectors/source-gitlab/source_gitlab/streams.py b/airbyte-integrations/connectors/source-gitlab/source_gitlab/streams.py index 5d550b7caeb29..ff7e6ab3b1dc0 100644 --- a/airbyte-integrations/connectors/source-gitlab/source_gitlab/streams.py +++ b/airbyte-integrations/connectors/source-gitlab/source_gitlab/streams.py @@ -2,13 +2,14 @@ # Copyright (c) 2022 Airbyte, Inc., all rights reserved. # - +import datetime from abc import ABC -from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Optional +from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Optional, Tuple import pendulum import requests from airbyte_cdk.models import SyncMode +from airbyte_cdk.sources.streams.core import StreamData from airbyte_cdk.sources.streams.http import HttpStream @@ -18,12 +19,22 @@ class GitlabStream(HttpStream, ABC): stream_base_params = {} flatten_id_keys = [] flatten_list_keys = [] - page = 1 per_page = 50 def __init__(self, api_url: str, **kwargs): super().__init__(**kwargs) self.api_url = api_url + self.page = 1 + + def read_records( + self, + sync_mode: SyncMode, + cursor_field: List[str] = None, + stream_slice: Mapping[str, Any] = None, + stream_state: Mapping[str, Any] = None, + ) -> Iterable[StreamData]: + self.page = 1 + yield from super().read_records(sync_mode, cursor_field, stream_slice, stream_state) def request_params( self, @@ -107,7 +118,9 @@ def path_template(self) -> str: template.append("repository") return "/".join(template + [self.name]) - def stream_slices(self, **kwargs) -> Iterable[Optional[Mapping[str, any]]]: + def stream_slices( + self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_state: Mapping[str, Any] = None + ) -> Iterable[Optional[Mapping[str, any]]]: for slice in self.parent_stream.stream_slices(sync_mode=SyncMode.full_refresh): for record in self.parent_stream.read_records(sync_mode=SyncMode.full_refresh, stream_slice=slice): yield {path_key: record[path_key] for path_key in self.path_list} @@ -125,7 +138,8 @@ def transform(self, record: Dict[str, Any], stream_slice: Mapping[str, Any] = No class IncrementalGitlabChildStream(GitlabChildStream): state_checkpoint_interval = 100 cursor_field = "updated_at" - filter_field = "updated_after" + lower_bound_filter = "updated_after" + upper_bound_filter = "updated_before" def __init__(self, start_date, **kwargs): super().__init__(**kwargs) @@ -146,17 +160,40 @@ def get_updated_state(self, current_stream_state: MutableMapping[str, Any], late current_stream_state[str(project_id)] = {self.cursor_field: str(max_value)} return current_stream_state - def request_params(self, stream_state=None, stream_slice: Mapping[str, Any] = None, **kwargs): + @staticmethod + def _chunk_date_range(start_point: datetime.datetime) -> Iterable[Tuple[str, str]]: + end_point = datetime.datetime.now(datetime.timezone.utc) + if start_point > end_point: + return [] + current_start, current_end = start_point, start_point + while current_end < end_point: + current_end = current_start + datetime.timedelta(days=180) + current_end = min(current_end, end_point) + yield str(current_start), str(current_end) + current_start = current_end + datetime.timedelta(seconds=1) + + def stream_slices( + self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_state: Mapping[str, Any] = None + ) -> Iterable[Optional[Mapping[str, Any]]]: stream_state = stream_state or {} - params = super().request_params(stream_state, stream_slice, **kwargs) + super_slices = super().stream_slices(sync_mode, cursor_field, stream_state) + for super_slice in super_slices: + start_point = self._start_date + state_project_value = stream_state.get(str(super_slice["id"])) + if state_project_value: + state_value = state_project_value.get(self.cursor_field) + if state_value: + start_point = max(start_point, state_value) + for start_dt, end_dt in self._chunk_date_range(pendulum.parse(start_point)): + stream_slice = {key: value for key, value in super_slice.items()} + stream_slice[self.lower_bound_filter] = start_dt + stream_slice[self.upper_bound_filter] = end_dt + yield stream_slice - start_point = self._start_date - state_project_value = stream_state.get(str(stream_slice["id"])) - if state_project_value: - state_value = state_project_value.get(self.cursor_field) - if state_value: - start_point = max(start_point, state_value) - params[self.filter_field] = start_point + def request_params(self, stream_state=None, stream_slice: Mapping[str, Any] = None, **kwargs): + params = super().request_params(stream_state, stream_slice, **kwargs) + params[self.lower_bound_filter] = stream_slice[self.lower_bound_filter] + params[self.upper_bound_filter] = stream_slice[self.upper_bound_filter] return params @@ -265,7 +302,8 @@ class Branches(GitlabChildStream): class Commits(IncrementalGitlabChildStream): cursor_field = "created_at" - filter_field = "since" + lower_bound_filter = "since" + upper_bound_filter = "until" flatten_parent_id = True stream_base_params = {"with_stats": True} diff --git a/airbyte-integrations/connectors/source-gitlab/unit_tests/test_streams.py b/airbyte-integrations/connectors/source-gitlab/unit_tests/test_streams.py index 7f2b795ce9730..6e0c63098c292 100644 --- a/airbyte-integrations/connectors/source-gitlab/unit_tests/test_streams.py +++ b/airbyte-integrations/connectors/source-gitlab/unit_tests/test_streams.py @@ -2,6 +2,8 @@ # Copyright (c) 2022 Airbyte, Inc., all rights reserved. # +import datetime + import pytest from airbyte_cdk.sources.streams.http.auth import NoAuth from source_gitlab.streams import Commits, Jobs, MergeRequestCommits, MergeRequests, Pipelines, Projects, Releases, Tags @@ -9,14 +11,15 @@ auth_params = {"authenticator": NoAuth(), "api_url": "gitlab.com"} +start_date = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=14) projects = Projects(project_ids=["p_1"], **auth_params) -pipelines = Pipelines(parent_stream=projects, start_date="2021-01-01T00:00:00Z", **auth_params) -merge_requests = MergeRequests(parent_stream=projects, start_date="2021-01-01T00:00:00Z", **auth_params) +pipelines = Pipelines(parent_stream=projects, start_date=str(start_date), **auth_params) +merge_requests = MergeRequests(parent_stream=projects, start_date=str(start_date), **auth_params) tags = Tags(parent_stream=projects, repository_part=True, **auth_params) releases = Releases(parent_stream=projects, **auth_params) jobs = Jobs(parent_stream=pipelines, **auth_params) merge_request_commits = MergeRequestCommits(parent_stream=merge_requests, **auth_params) -commits = Commits(parent_stream=projects, repository_part=True, start_date="2021-01-01T00:00:00Z", **auth_params) +commits = Commits(parent_stream=projects, repository_part=True, start_date=str(start_date), **auth_params) def test_should_retry(mocker, requests_mock): diff --git a/docs/integrations/sources/gitlab.md b/docs/integrations/sources/gitlab.md index 0fa5220f5121a..fabfc75c1f27c 100644 --- a/docs/integrations/sources/gitlab.md +++ b/docs/integrations/sources/gitlab.md @@ -105,6 +105,7 @@ Gitlab has the [rate limits](https://docs.gitlab.com/ee/user/gitlab_com/index.ht | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:-------------------------------------------------------------------------------------------| +| 1.0.1 | 2022-01-23 | [21713](https://github.com/airbytehq/airbyte/pull/21713) | Fix missing data issue | | 1.0.0 | 2022-12-05 | [7506](https://github.com/airbytehq/airbyte/pull/7506) | Add `OAuth2.0` authentication option | | 0.1.12 | 2022-12-15 | [20542](https://github.com/airbytehq/airbyte/pull/20542) | Revert HttpAvailability changes, run on cdk 0.15.0 | | 0.1.11 | 2022-12-14 | [20479](https://github.com/airbytehq/airbyte/pull/20479) | Use HttpAvailabilityStrategy + add unit tests | From b9de100058b8901d9acd88519635fda4b6cb336c Mon Sep 17 00:00:00 2001 From: Octavia Squidington III <90398440+octavia-squidington-iii@users.noreply.github.com> Date: Tue, 24 Jan 2023 08:22:45 +0100 Subject: [PATCH 053/195] Bump Airbyte version from 0.40.28 to 0.40.29 (#21767) Co-authored-by: lmossman --- .bumpversion.cfg | 2 +- .env | 2 +- airbyte-bootloader/Dockerfile | 2 +- airbyte-connector-builder-server/Dockerfile | 2 +- airbyte-connector-builder-server/setup.py | 2 +- airbyte-container-orchestrator/Dockerfile | 2 +- airbyte-cron/Dockerfile | 2 +- airbyte-metrics/reporter/Dockerfile | 2 +- airbyte-proxy/Dockerfile | 2 +- airbyte-server/Dockerfile | 2 +- airbyte-webapp/package-lock.json | 4 ++-- airbyte-webapp/package.json | 2 +- airbyte-workers/Dockerfile | 2 +- charts/airbyte-bootloader/Chart.yaml | 2 +- charts/airbyte-connector-builder-server/Chart.yaml | 2 +- charts/airbyte-cron/Chart.yaml | 2 +- charts/airbyte-server/Chart.yaml | 2 +- charts/airbyte-temporal/Chart.yaml | 2 +- charts/airbyte-webapp/Chart.yaml | 2 +- charts/airbyte-worker/Chart.yaml | 2 +- charts/airbyte/Chart.yaml | 2 +- charts/airbyte/README.md | 2 +- docs/operator-guides/upgrading-airbyte.md | 4 ++-- kube/overlays/stable-with-resource-limits/.env | 2 +- .../stable-with-resource-limits/kustomization.yaml | 14 +++++++------- kube/overlays/stable/.env | 2 +- kube/overlays/stable/kustomization.yaml | 14 +++++++------- octavia-cli/Dockerfile | 2 +- octavia-cli/README.md | 4 ++-- octavia-cli/install.sh | 2 +- octavia-cli/setup.py | 2 +- 31 files changed, 46 insertions(+), 46 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 131c31761c991..d90909974fa2f 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.40.28 +current_version = 0.40.29 commit = False tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-[a-z]+)? diff --git a/.env b/.env index a8a3d5d08c398..d9bf9f7d2048a 100644 --- a/.env +++ b/.env @@ -10,7 +10,7 @@ ### SHARED ### -VERSION=0.40.28 +VERSION=0.40.29 # When using the airbyte-db via default docker image CONFIG_ROOT=/data diff --git a/airbyte-bootloader/Dockerfile b/airbyte-bootloader/Dockerfile index ab84c7829c603..03c0a5aabee8c 100644 --- a/airbyte-bootloader/Dockerfile +++ b/airbyte-bootloader/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} -ARG VERSION=0.40.28 +ARG VERSION=0.40.29 ENV APPLICATION airbyte-bootloader ENV VERSION ${VERSION} diff --git a/airbyte-connector-builder-server/Dockerfile b/airbyte-connector-builder-server/Dockerfile index 7e5c167607ee8..7a1ef94f51187 100644 --- a/airbyte-connector-builder-server/Dockerfile +++ b/airbyte-connector-builder-server/Dockerfile @@ -10,5 +10,5 @@ RUN pip install --no-cache-dir . ENTRYPOINT ["uvicorn", "connector_builder.entrypoint:app", "--host", "0.0.0.0", "--port", "80"] -LABEL io.airbyte.version=0.40.28 +LABEL io.airbyte.version=0.40.29 LABEL io.airbyte.name=airbyte/connector-builder-server diff --git a/airbyte-connector-builder-server/setup.py b/airbyte-connector-builder-server/setup.py index d50fed19aee43..b674bfc6f836d 100644 --- a/airbyte-connector-builder-server/setup.py +++ b/airbyte-connector-builder-server/setup.py @@ -14,7 +14,7 @@ setup( name="connector-builder-server", - version="0.40.28", + version="0.40.29", description="", long_description=README, author="Airbyte", diff --git a/airbyte-container-orchestrator/Dockerfile b/airbyte-container-orchestrator/Dockerfile index 07480cd50773d..7b0ef96f0197e 100644 --- a/airbyte-container-orchestrator/Dockerfile +++ b/airbyte-container-orchestrator/Dockerfile @@ -10,7 +10,7 @@ RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/s && chmod +x kubectl && mv kubectl /usr/local/bin/ # Don't change this manually. Bump version expects to make moves based on this string -ARG VERSION=0.40.28 +ARG VERSION=0.40.29 ENV APPLICATION airbyte-container-orchestrator ENV VERSION=${VERSION} diff --git a/airbyte-cron/Dockerfile b/airbyte-cron/Dockerfile index f820410130c71..99723a70bef39 100644 --- a/airbyte-cron/Dockerfile +++ b/airbyte-cron/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} AS cron -ARG VERSION=0.40.28 +ARG VERSION=0.40.29 ENV APPLICATION airbyte-cron ENV VERSION ${VERSION} diff --git a/airbyte-metrics/reporter/Dockerfile b/airbyte-metrics/reporter/Dockerfile index 10960cae90a27..d11bac0790585 100644 --- a/airbyte-metrics/reporter/Dockerfile +++ b/airbyte-metrics/reporter/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} AS metrics-reporter -ARG VERSION=0.40.28 +ARG VERSION=0.40.29 ENV APPLICATION airbyte-metrics-reporter ENV VERSION ${VERSION} diff --git a/airbyte-proxy/Dockerfile b/airbyte-proxy/Dockerfile index 42b78790c74ae..6f8e67698b002 100644 --- a/airbyte-proxy/Dockerfile +++ b/airbyte-proxy/Dockerfile @@ -2,7 +2,7 @@ FROM nginx:latest -ARG VERSION=0.40.28 +ARG VERSION=0.40.29 ENV APPLICATION airbyte-proxy ENV VERSION ${VERSION} diff --git a/airbyte-server/Dockerfile b/airbyte-server/Dockerfile index b7ab48ef8543c..6cbaac749beec 100644 --- a/airbyte-server/Dockerfile +++ b/airbyte-server/Dockerfile @@ -3,7 +3,7 @@ FROM ${JDK_IMAGE} AS server EXPOSE 8000 -ARG VERSION=0.40.28 +ARG VERSION=0.40.29 ENV APPLICATION airbyte-server ENV VERSION ${VERSION} diff --git a/airbyte-webapp/package-lock.json b/airbyte-webapp/package-lock.json index e3aa44e3f9af0..55255e4553450 100644 --- a/airbyte-webapp/package-lock.json +++ b/airbyte-webapp/package-lock.json @@ -1,12 +1,12 @@ { "name": "airbyte-webapp", - "version": "0.40.28", + "version": "0.40.29", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "airbyte-webapp", - "version": "0.40.28", + "version": "0.40.29", "dependencies": { "@datadog/browser-rum": "^4.21.2", "@floating-ui/react-dom": "^1.0.0", diff --git a/airbyte-webapp/package.json b/airbyte-webapp/package.json index 9c902627e05d5..2a3f87b0b8eca 100644 --- a/airbyte-webapp/package.json +++ b/airbyte-webapp/package.json @@ -1,6 +1,6 @@ { "name": "airbyte-webapp", - "version": "0.40.28", + "version": "0.40.29", "private": true, "engines": { "node": "16.18.1" diff --git a/airbyte-workers/Dockerfile b/airbyte-workers/Dockerfile index a51a55afebe25..98ac54b5412a7 100644 --- a/airbyte-workers/Dockerfile +++ b/airbyte-workers/Dockerfile @@ -10,7 +10,7 @@ RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/s && chmod +x kubectl && mv kubectl /usr/local/bin/ # Don't change this manually. Bump version expects to make moves based on this string -ARG VERSION=0.40.28 +ARG VERSION=0.40.29 ENV APPLICATION airbyte-workers ENV VERSION ${VERSION} diff --git a/charts/airbyte-bootloader/Chart.yaml b/charts/airbyte-bootloader/Chart.yaml index 8da1ae1155668..f98430992f741 100644 --- a/charts/airbyte-bootloader/Chart.yaml +++ b/charts/airbyte-bootloader/Chart.yaml @@ -22,7 +22,7 @@ version: "0.43.13" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.28" +appVersion: "0.40.29" dependencies: - name: common diff --git a/charts/airbyte-connector-builder-server/Chart.yaml b/charts/airbyte-connector-builder-server/Chart.yaml index 6ee6d821e9d63..3c833b660a13d 100644 --- a/charts/airbyte-connector-builder-server/Chart.yaml +++ b/charts/airbyte-connector-builder-server/Chart.yaml @@ -21,7 +21,7 @@ version: "0.43.13" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.28" +appVersion: "0.40.29" dependencies: - name: common diff --git a/charts/airbyte-cron/Chart.yaml b/charts/airbyte-cron/Chart.yaml index cd8382766cb19..263dd7e6f788e 100644 --- a/charts/airbyte-cron/Chart.yaml +++ b/charts/airbyte-cron/Chart.yaml @@ -21,7 +21,7 @@ version: 0.1.1 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.28" +appVersion: "0.40.29" dependencies: - name: common diff --git a/charts/airbyte-server/Chart.yaml b/charts/airbyte-server/Chart.yaml index 41e20ab02ed7a..ec23d0ea5fa75 100644 --- a/charts/airbyte-server/Chart.yaml +++ b/charts/airbyte-server/Chart.yaml @@ -21,7 +21,7 @@ version: "0.43.13" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.28" +appVersion: "0.40.29" dependencies: - name: common diff --git a/charts/airbyte-temporal/Chart.yaml b/charts/airbyte-temporal/Chart.yaml index 3131b967b67bc..ceb61b02e66af 100644 --- a/charts/airbyte-temporal/Chart.yaml +++ b/charts/airbyte-temporal/Chart.yaml @@ -22,7 +22,7 @@ version: "0.43.13" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.28" +appVersion: "0.40.29" dependencies: - name: common diff --git a/charts/airbyte-webapp/Chart.yaml b/charts/airbyte-webapp/Chart.yaml index 3dea72d839053..2cfae3fa259af 100644 --- a/charts/airbyte-webapp/Chart.yaml +++ b/charts/airbyte-webapp/Chart.yaml @@ -22,7 +22,7 @@ version: "0.43.13" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.28" +appVersion: "0.40.29" dependencies: - name: common diff --git a/charts/airbyte-worker/Chart.yaml b/charts/airbyte-worker/Chart.yaml index 0ca7ecf27d7a1..5d74b74e0bb57 100644 --- a/charts/airbyte-worker/Chart.yaml +++ b/charts/airbyte-worker/Chart.yaml @@ -22,7 +22,7 @@ version: "0.43.13" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.28" +appVersion: "0.40.29" dependencies: - name: common diff --git a/charts/airbyte/Chart.yaml b/charts/airbyte/Chart.yaml index c95118eca13f5..15f97925abe8f 100644 --- a/charts/airbyte/Chart.yaml +++ b/charts/airbyte/Chart.yaml @@ -21,7 +21,7 @@ version: 0.43.13 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.28" +appVersion: "0.40.29" dependencies: - name: common diff --git a/charts/airbyte/README.md b/charts/airbyte/README.md index 68d22a281b63c..b816e5db12fe2 100644 --- a/charts/airbyte/README.md +++ b/charts/airbyte/README.md @@ -250,7 +250,7 @@ Helm chart to deploy airbyte | worker.hpa.enabled | bool | `false` | | | worker.image.pullPolicy | string | `"IfNotPresent"` | | | worker.image.repository | string | `"airbyte/worker"` | | -| worker.image.tag | string | `"0.40.28"` | | +| worker.image.tag | string | `"0.40.29"` | | | worker.livenessProbe.enabled | bool | `true` | | | worker.livenessProbe.failureThreshold | int | `3` | | | worker.livenessProbe.initialDelaySeconds | int | `30` | | diff --git a/docs/operator-guides/upgrading-airbyte.md b/docs/operator-guides/upgrading-airbyte.md index 060408f462930..7b882d24006d1 100644 --- a/docs/operator-guides/upgrading-airbyte.md +++ b/docs/operator-guides/upgrading-airbyte.md @@ -33,7 +33,7 @@ If you use custom connectors, this upgrade requires all of your connector specs :::note -Airbyte version 0.40.28 or later requires [Docker Compose V2](https://docs.docker.com/compose/compose-v2/) to be [installed](https://docs.docker.com/compose/install/) before upgrading. +Airbyte version 0.40.29 or later requires [Docker Compose V2](https://docs.docker.com/compose/compose-v2/) to be [installed](https://docs.docker.com/compose/install/) before upgrading. ::: @@ -109,7 +109,7 @@ If you are upgrading from (i.e. your current version of Airbyte is) Airbyte vers Here's an example of what it might look like with the values filled in. It assumes that the downloaded `airbyte_archive.tar.gz` is in `/tmp`. ```bash - docker run --rm -v /tmp:/config airbyte/migration:0.40.28 --\ + docker run --rm -v /tmp:/config airbyte/migration:0.40.29 --\ --input /config/airbyte_archive.tar.gz\ --output /config/airbyte_archive_migrated.tar.gz ``` diff --git a/kube/overlays/stable-with-resource-limits/.env b/kube/overlays/stable-with-resource-limits/.env index ab5ae5ec4d4ef..63df173366caf 100644 --- a/kube/overlays/stable-with-resource-limits/.env +++ b/kube/overlays/stable-with-resource-limits/.env @@ -1,4 +1,4 @@ -AIRBYTE_VERSION=0.40.28 +AIRBYTE_VERSION=0.40.29 # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db DATABASE_HOST=airbyte-db-svc diff --git a/kube/overlays/stable-with-resource-limits/kustomization.yaml b/kube/overlays/stable-with-resource-limits/kustomization.yaml index 274d44fef5b7d..3705262975555 100644 --- a/kube/overlays/stable-with-resource-limits/kustomization.yaml +++ b/kube/overlays/stable-with-resource-limits/kustomization.yaml @@ -8,21 +8,21 @@ bases: images: - name: airbyte/db - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/bootloader - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/server - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/webapp - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/worker - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/temporal-auto-setup newTag: 1.13.0 - name: airbyte/cron - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/connector-builder-server - newTag: 0.40.28 + newTag: 0.40.29 configMapGenerator: - name: airbyte-env diff --git a/kube/overlays/stable/.env b/kube/overlays/stable/.env index d5541c0b50fb6..46400b8ceeda7 100644 --- a/kube/overlays/stable/.env +++ b/kube/overlays/stable/.env @@ -1,4 +1,4 @@ -AIRBYTE_VERSION=0.40.28 +AIRBYTE_VERSION=0.40.29 # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db DATABASE_HOST=airbyte-db-svc diff --git a/kube/overlays/stable/kustomization.yaml b/kube/overlays/stable/kustomization.yaml index 4f89c4ccf3d73..f5b3a5b64cce5 100644 --- a/kube/overlays/stable/kustomization.yaml +++ b/kube/overlays/stable/kustomization.yaml @@ -8,21 +8,21 @@ bases: images: - name: airbyte/db - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/bootloader - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/server - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/webapp - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/worker - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/temporal-auto-setup newTag: 1.13.0 - name: airbyte/cron - newTag: 0.40.28 + newTag: 0.40.29 - name: airbyte/connector-builder-server - newTag: 0.40.28 + newTag: 0.40.29 configMapGenerator: - name: airbyte-env diff --git a/octavia-cli/Dockerfile b/octavia-cli/Dockerfile index 189845f2bf023..49e95eb46bae9 100644 --- a/octavia-cli/Dockerfile +++ b/octavia-cli/Dockerfile @@ -14,5 +14,5 @@ USER octavia-cli WORKDIR /home/octavia-project ENTRYPOINT ["octavia"] -LABEL io.airbyte.version=0.40.28 +LABEL io.airbyte.version=0.40.29 LABEL io.airbyte.name=airbyte/octavia-cli diff --git a/octavia-cli/README.md b/octavia-cli/README.md index ba4067de149ab..3f4c1e2c0c68e 100644 --- a/octavia-cli/README.md +++ b/octavia-cli/README.md @@ -104,7 +104,7 @@ This script: ```bash touch ~/.octavia # Create a file to store env variables that will be mapped the octavia-cli container mkdir my_octavia_project_directory # Create your octavia project directory where YAML configurations will be stored. -docker run --name octavia-cli -i --rm -v my_octavia_project_directory:/home/octavia-project --network host --user $(id -u):$(id -g) --env-file ~/.octavia airbyte/octavia-cli:0.40.28 +docker run --name octavia-cli -i --rm -v my_octavia_project_directory:/home/octavia-project --network host --user $(id -u):$(id -g) --env-file ~/.octavia airbyte/octavia-cli:0.40.29 ``` ### Using `docker-compose` @@ -712,7 +712,7 @@ You can disable telemetry by setting the `OCTAVIA_ENABLE_TELEMETRY` environment | Version | Date | Description | PR | | ------- | ---------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------------- | | 0.41.0 | 2022-10-13 | Use Basic Authentication for making API requests | [#17982](https://github.com/airbytehq/airbyte/pull/17982) | -| 0.40.28 | 2022-08-10 | Enable cron and basic scheduling | [#15253](https://github.com/airbytehq/airbyte/pull/15253) | +| 0.40.29 | 2022-08-10 | Enable cron and basic scheduling | [#15253](https://github.com/airbytehq/airbyte/pull/15253) | | 0.39.33 | 2022-07-05 | Add `octavia import all` command | [#14374](https://github.com/airbytehq/airbyte/pull/14374) | | 0.39.32 | 2022-06-30 | Create import command to import and manage existing Airbyte resource from octavia-cli | [#14137](https://github.com/airbytehq/airbyte/pull/14137) | | 0.39.27 | 2022-06-24 | Create get command to retrieve resources JSON representation | [#13254](https://github.com/airbytehq/airbyte/pull/13254) | diff --git a/octavia-cli/install.sh b/octavia-cli/install.sh index 2401a74fdc404..1f9ecdbae8050 100755 --- a/octavia-cli/install.sh +++ b/octavia-cli/install.sh @@ -3,7 +3,7 @@ # This install scripts currently only works for ZSH and Bash profiles. # It creates an octavia alias in your profile bound to a docker run command and your current user. -VERSION=0.40.28 +VERSION=0.40.29 OCTAVIA_ENV_FILE=${HOME}/.octavia detect_profile() { diff --git a/octavia-cli/setup.py b/octavia-cli/setup.py index 058c2c7e5bc35..53e07856fc86c 100644 --- a/octavia-cli/setup.py +++ b/octavia-cli/setup.py @@ -15,7 +15,7 @@ setup( name="octavia-cli", - version="0.40.28", + version="0.40.29", description="A command line interface to manage Airbyte configurations", long_description=README, author="Airbyte", From 4770a8fa4347c979c37586b8314ba7040558abbb Mon Sep 17 00:00:00 2001 From: Augustin Date: Tue, 24 Jan 2023 09:35:06 +0100 Subject: [PATCH 054/195] connector-ops-ci: bootstrap qa engine (#21709) --- .github/workflows/run-qa-engine.yml | 30 +++++++++++ .../ci_connector_ops/qa_engine/__init__.py | 0 .../ci_connector_ops/qa_engine/inputs.py | 50 +++++++++++++++++++ .../ci_connector_ops/qa_engine/main.py | 31 ++++++++++++ .../ci_connector_ops/qa_engine/models.py | 32 ++++++++++++ tools/ci_connector_ops/setup.py | 13 ++++- .../tests/test_qa_engine/__init__.py | 0 .../tests/test_qa_engine/test_inputs.py | 30 +++++++++++ .../tests/test_qa_engine/test_main.py | 11 ++++ 9 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/run-qa-engine.yml create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/__init__.py create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py create mode 100644 tools/ci_connector_ops/tests/test_qa_engine/__init__.py create mode 100644 tools/ci_connector_ops/tests/test_qa_engine/test_inputs.py create mode 100644 tools/ci_connector_ops/tests/test_qa_engine/test_main.py diff --git a/.github/workflows/run-qa-engine.yml b/.github/workflows/run-qa-engine.yml new file mode 100644 index 0000000000000..717e9db0198bb --- /dev/null +++ b/.github/workflows/run-qa-engine.yml @@ -0,0 +1,30 @@ +name: Run QA Engine + +on: + workflow_dispatch: + schedule: + # 1pm UTC is 6am PDT. + # same time as Generate Build Report + - cron: "0 13 * * *" + +jobs: + run-qa-engine: + name: "Run QA Engine" + if: github.ref == 'refs/heads/master' + runs-on: ubuntu-latest + steps: + - name: Checkout Airbyte + uses: actions/checkout@v3 + - name: Setup Cloud SDK + uses: google-github-actions/setup-gcloud@v0 + with: + service_account_key: ${{ secrets.PROD_SPEC_CACHE_SA_KEY }} + export_default_credentials: true + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version: "3.9" + - name: Install ci-connector-ops package + run: pip install --quiet -e ./tools/ci_connector_ops + - name: Run QA Engine + run: run-qa-engine diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/__init__.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py new file mode 100644 index 0000000000000..1e560df0be562 --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py @@ -0,0 +1,50 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import requests +import pandas as pd + +CLOUD_CATALOG_URL = "https://storage.googleapis.com/prod-airbyte-cloud-connector-metadata-service/cloud_catalog.json" +OSS_CATALOG_URL = "https://storage.googleapis.com/prod-airbyte-cloud-connector-metadata-service/oss_catalog.json" + + +def fetch_remote_catalog(catalog_url: str) -> pd.DataFrame: + """Fetch a combined remote catalog and return a single DataFrame + with sources and destinations defined by the connector_type column. + + Args: + catalog_url (str): The remote catalog url. + + Returns: + pd.DataFrame: Sources and destinations combined under a denormalized DataFrame. + """ + raw_catalog = requests.get(catalog_url).json() + sources = pd.DataFrame(raw_catalog["sources"]) + destinations = pd.DataFrame(raw_catalog["destinations"]) + sources["connector_type"] = "source" + sources["connector_definition_id"] = sources.sourceDefinitionId + destinations["connector_type"] = "destination" + destinations["connector_definition_id"] = destinations.destinationDefinitionId + return pd.concat([sources, destinations]) + +def fetch_adoption_metrics_per_connector_version() -> pd.DataFrame: + """Retrieve adoptions metrics for each connector version from our data warehouse. + + Returns: + pd.DataFrame: A Dataframe with adoption metrics per connector version. + """ + # TODO: directly query BigQuery + # use query in https://airbyte.metabaseapp.com/question/1642-adoption-and-success-rate-per-connector-version-oss-cloud + return pd.DataFrame(columns=[ + "connector_definition_id", + "connector_version", + "number_of_connections", + "number_of_users", + "sync_success_rate", + ]) + +CLOUD_CATALOG = fetch_remote_catalog(CLOUD_CATALOG_URL) +OSS_CATALOG = fetch_remote_catalog(OSS_CATALOG_URL) +ADOPTION_METRICS_PER_CONNECTOR_VERSION = fetch_adoption_metrics_per_connector_version() diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py new file mode 100644 index 0000000000000..7d632788aa6ae --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py @@ -0,0 +1,31 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import pandas as pd +from .models import QAReport + +GCS_QA_REPORT_PATH = "gs://prod-airbyte-cloud-connector-metadata-service/qa_report.json" +DUMMY_REPORT = pd.DataFrame([ + { + "connector_type": "source", + "connector_name": "test", + "docker_image_tag": "0.0.0", + "release_stage": "alpha", + "is_on_cloud": False, + "latest_build_is_successful": False, + "documentation_is_available": False, + "number_of_connections": 0, + "number_of_users": 0, + "sync_success_rate": .99 + } + ]) + +def write_qa_report_to_gcs(qa_report: pd.DataFrame, output_file_path: str): + # Validate the report structure with pydantic QAReport model. + QAReport(connectors_qa_report=qa_report.to_dict(orient="records")) + qa_report.to_json(output_file_path, orient="records") + +def main(): + write_qa_report_to_gcs(DUMMY_REPORT, GCS_QA_REPORT_PATH) diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py new file mode 100644 index 0000000000000..eec91b90eee70 --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py @@ -0,0 +1,32 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +from enum import Enum +from typing import List +from pydantic import BaseModel + +class ConnectorTypeEnum(str, Enum): + source = "source" + destination = "destination" + +class ReleaseStageEnum(str, Enum): + alpha = "alpha" + beta = "beta" + generally_available = "generally_available" + +class ConnectorQAReport(BaseModel): + connector_type: ConnectorTypeEnum + connector_name: str + docker_image_tag: str + release_stage: ReleaseStageEnum + is_on_cloud: bool + latest_build_is_successful: bool + documentation_is_available: bool + number_of_connections: int + number_of_users: int + sync_success_rate: float + +class QAReport(BaseModel): + connectors_qa_report: List[ConnectorQAReport] diff --git a/tools/ci_connector_ops/setup.py b/tools/ci_connector_ops/setup.py index c573c8d7148bb..0fc79a9f6e1e1 100644 --- a/tools/ci_connector_ops/setup.py +++ b/tools/ci_connector_ops/setup.py @@ -5,11 +5,19 @@ from setuptools import find_packages, setup -MAIN_REQUIREMENTS = ["requests", "PyYAML~=6.0", "GitPython~=3.1.29"] +MAIN_REQUIREMENTS = [ + "requests", + "PyYAML~=6.0", + "GitPython~=3.1.29", + "pandas~=1.5.3", + "pydantic~=1.10.4", + "fsspec~=2023.1.0", + "gcsfs~=2023.1.0" +] setup( - version="0.1.2", + version="0.1.3", name="ci_connector_ops", description="Packaged maintained by the connector operations team to perform CI for connectors", author="Airbyte", @@ -22,6 +30,7 @@ "check-test-strictness-level = ci_connector_ops.sat_config_checks:check_test_strictness_level", "write-review-requirements-file = ci_connector_ops.sat_config_checks:write_review_requirements_file", "print-mandatory-reviewers = ci_connector_ops.sat_config_checks:print_mandatory_reviewers", + "run-qa-engine = ci_connector_ops.qa_engine.main:main" "run-qa-checks = ci_connector_ops.qa_checks:run_qa_checks" ], }, diff --git a/tools/ci_connector_ops/tests/test_qa_engine/__init__.py b/tools/ci_connector_ops/tests/test_qa_engine/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_inputs.py b/tools/ci_connector_ops/tests/test_qa_engine/test_inputs.py new file mode 100644 index 0000000000000..d0a4fb037e032 --- /dev/null +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_inputs.py @@ -0,0 +1,30 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import pandas as pd +import pytest + +from ci_connector_ops.qa_engine import inputs + +@pytest.mark.parametrize("catalog_url", [inputs.OSS_CATALOG_URL, inputs.CLOUD_CATALOG_URL]) +def test_fetch_remote_catalog(catalog_url): + catalog = inputs.fetch_remote_catalog(catalog_url) + assert isinstance(catalog, pd.DataFrame) + expected_columns = ["connector_type", "connector_definition_id"] + assert all(expected_column in catalog.columns for expected_column in expected_columns) + assert set(catalog.connector_type.unique()) == {"source", "destination"} + +def test_fetch_adoption_metrics_per_connector_version(): + expected_columns = { + "connector_definition_id", + "connector_version", + "number_of_connections", + "number_of_users", + "sync_success_rate", + } + + adoption_metrics_per_connector_version = inputs.fetch_adoption_metrics_per_connector_version() + assert len(adoption_metrics_per_connector_version) == 0 + assert set(adoption_metrics_per_connector_version.columns) == expected_columns diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_main.py b/tools/ci_connector_ops/tests/test_qa_engine/test_main.py new file mode 100644 index 0000000000000..815568e2d8a9a --- /dev/null +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_main.py @@ -0,0 +1,11 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + +import pandas +from ci_connector_ops.qa_engine import main + +def test_write_qa_report_to_gcs(tmp_path): + output_path = tmp_path / "output.json" + main.write_qa_report_to_gcs(main.DUMMY_REPORT, output_path) + assert pandas.read_json(output_path).to_dict() == main.DUMMY_REPORT.to_dict() From f7ce2041b789f276102f2afaf725946a9d1ef8e4 Mon Sep 17 00:00:00 2001 From: Augustin Date: Tue, 24 Jan 2023 09:45:05 +0100 Subject: [PATCH 055/195] qa-engine: fix typo (#21773) * fix typo * fix typo * fix typo --- tools/ci_connector_ops/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/ci_connector_ops/setup.py b/tools/ci_connector_ops/setup.py index 0fc79a9f6e1e1..7f544c03c6e8e 100644 --- a/tools/ci_connector_ops/setup.py +++ b/tools/ci_connector_ops/setup.py @@ -30,7 +30,7 @@ "check-test-strictness-level = ci_connector_ops.sat_config_checks:check_test_strictness_level", "write-review-requirements-file = ci_connector_ops.sat_config_checks:write_review_requirements_file", "print-mandatory-reviewers = ci_connector_ops.sat_config_checks:print_mandatory_reviewers", - "run-qa-engine = ci_connector_ops.qa_engine.main:main" + "run-qa-engine = ci_connector_ops.qa_engine.main:main", "run-qa-checks = ci_connector_ops.qa_checks:run_qa_checks" ], }, From 1c4b6a1f9594046f82892a4520017c169b66d833 Mon Sep 17 00:00:00 2001 From: midavadim Date: Tue, 24 Jan 2023 11:16:40 +0200 Subject: [PATCH 056/195] added test_strictness_level: high (#21701) --- .../source-s3/acceptance-test-config.yml | 225 ++++++++---------- 1 file changed, 104 insertions(+), 121 deletions(-) diff --git a/airbyte-integrations/connectors/source-s3/acceptance-test-config.yml b/airbyte-integrations/connectors/source-s3/acceptance-test-config.yml index 28bd1af6a7ae7..825587b33a7a3 100644 --- a/airbyte-integrations/connectors/source-s3/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-s3/acceptance-test-config.yml @@ -1,148 +1,131 @@ -# See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) -# for more information about how to configure these tests connector_image: airbyte/source-s3:dev -tests: +test_strictness_level: high +acceptance_tests: spec: - - spec_path: "integration_tests/spec.json" - backward_compatibility_tests_config: - disable_for_version: "0.1.26" + tests: + - backward_compatibility_tests_config: + disable_for_version: 0.1.26 + spec_path: integration_tests/spec.json + connection: - # for CSV format - - config_path: "secrets/config.json" - status: "succeed" - # for Parquet format - - config_path: "secrets/parquet_config.json" - status: "succeed" - # # for Avro format - - config_path: "secrets/avro_config.json" - status: - "succeed" - # for JSON format - - config_path: "secrets/jsonl_config.json" - status: "succeed" - - config_path: "secrets/jsonl_newlines_config.json" - status: "succeed" - # for custom server - - config_path: "integration_tests/config_minio.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + tests: + - config_path: secrets/config.json + status: succeed + - config_path: secrets/parquet_config.json + status: succeed + - config_path: secrets/avro_config.json + status: succeed + - config_path: secrets/jsonl_config.json + status: succeed + - config_path: secrets/jsonl_newlines_config.json + status: succeed + - config_path: integration_tests/config_minio.json + status: succeed + - config_path: integration_tests/invalid_config.json + status: failed + discovery: - # for CSV format - - config_path: "secrets/config.json" - # for Parquet format - - config_path: "secrets/parquet_config.json" - # for Avro format - - config_path: "secrets/avro_config.json" - # for JSON format - - config_path: "secrets/jsonl_config.json" - - config_path: "secrets/jsonl_newlines_config.json" - # for custom server - - config_path: "integration_tests/config_minio.json" + tests: + - config_path: secrets/config.json + - config_path: secrets/parquet_config.json + - config_path: secrets/avro_config.json + - config_path: secrets/jsonl_config.json + - config_path: secrets/jsonl_newlines_config.json + - config_path: integration_tests/config_minio.json + basic_read: - # for CSV format - - config_path: "secrets/config.json" - timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/csv.json" + tests: + - config_path: secrets/config.json expect_records: - path: "integration_tests/expected_records/csv.jsonl" - # for Parquet format - - config_path: "secrets/parquet_config.json" + path: integration_tests/expected_records/csv.jsonl timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/parquet.json" + - config_path: secrets/parquet_config.json expect_records: - path: "integration_tests/expected_records/parquet.jsonl" - # for Avro format - - config_path: "secrets/avro_config.json" + path: integration_tests/expected_records/parquet.jsonl timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/avro.json" + - config_path: secrets/avro_config.json expect_records: - path: "integration_tests/expected_records/avro.jsonl" - # for JSONL format - - config_path: "secrets/jsonl_config.json" + path: integration_tests/expected_records/avro.jsonl timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/jsonl.json" + - config_path: secrets/jsonl_config.json expect_records: - path: "integration_tests/expected_records/jsonl.jsonl" - - config_path: "secrets/jsonl_newlines_config.json" + path: integration_tests/expected_records/jsonl.jsonl timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/jsonl.json" + - config_path: secrets/jsonl_newlines_config.json expect_records: - path: "integration_tests/expected_records/jsonl_newlines.jsonl" - # for custom server - - config_path: "integration_tests/config_minio.json" - timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/csv.json" - # expected records contains _ab_source_file_last_modified property which - # is modified all the time s3 file changed and for custom server it is - # file creating date and it always new. Uncomment this line when SAT - # would have ability to ignore specific fields from expected records. - # expect_records: - # path: "integration_tests/expected_records/custom_server.jsonl" - incremental: - # for CSV format - - config_path: "secrets/config.json" + path: integration_tests/expected_records/jsonl_newlines.jsonl timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/csv.json" - cursor_paths: - test: ["_ab_source_file_last_modified"] - future_state_path: "integration_tests/abnormal_state.json" - # for Parquet format - - config_path: "secrets/parquet_config.json" +# - config_path: integration_tests/config_minio.json +# timeout_seconds: 1800 + + full_refresh: + tests: + - config_path: secrets/config.json + configured_catalog_path: integration_tests/configured_catalogs/csv.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/parquet.json" - cursor_paths: - test: ["_ab_source_file_last_modified"] - future_state_path: "integration_tests/abnormal_state.json" - # for Avro format - - config_path: "secrets/avro_config.json" + - config_path: secrets/parquet_config.json + configured_catalog_path: integration_tests/configured_catalogs/parquet.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/avro.json" - cursor_paths: - test: ["_ab_source_file_last_modified"] - future_state_path: "integration_tests/abnormal_state.json" - # for JSON format - - config_path: "secrets/jsonl_config.json" + - config_path: secrets/avro_config.json + configured_catalog_path: integration_tests/configured_catalogs/avro.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/jsonl.json" - cursor_paths: - test: ["_ab_source_file_last_modified"] - future_state_path: "integration_tests/abnormal_state.json" - - config_path: "secrets/jsonl_newlines_config.json" + - config_path: secrets/jsonl_config.json + configured_catalog_path: integration_tests/configured_catalogs/jsonl.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/jsonl.json" - cursor_paths: - test: ["_ab_source_file_last_modified"] - future_state_path: "integration_tests/abnormal_state.json" - # for custom server - - config_path: "integration_tests/config_minio.json" + - config_path: secrets/jsonl_newlines_config.json + configured_catalog_path: integration_tests/configured_catalogs/jsonl.json + timeout_seconds: 1800 + - config_path: integration_tests/config_minio.json + configured_catalog_path: integration_tests/configured_catalogs/csv.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/csv.json" - cursor_paths: - test: ["_ab_source_file_last_modified"] - future_state_path: "integration_tests/abnormal_state.json" - full_refresh: - # for CSV format - - config_path: "secrets/config.json" + incremental: + tests: + - config_path: secrets/config.json + configured_catalog_path: integration_tests/configured_catalogs/csv.json + cursor_paths: + test: + - _ab_source_file_last_modified + future_state: + future_state_path: integration_tests/abnormal_state.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/csv.json" - # for Parquet format - - config_path: "secrets/parquet_config.json" + - config_path: secrets/parquet_config.json + configured_catalog_path: integration_tests/configured_catalogs/parquet.json + cursor_paths: + test: + - _ab_source_file_last_modified + future_state: + future_state_path: integration_tests/abnormal_state.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/parquet.json" - # for Avro format - - config_path: "secrets/avro_config.json" + - config_path: secrets/avro_config.json + configured_catalog_path: integration_tests/configured_catalogs/avro.json + cursor_paths: + test: + - _ab_source_file_last_modified + future_state: + future_state_path: integration_tests/abnormal_state.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/avro.json" - # for JSON format - - config_path: "secrets/jsonl_config.json" + - config_path: secrets/jsonl_config.json + configured_catalog_path: integration_tests/configured_catalogs/jsonl.json + cursor_paths: + test: + - _ab_source_file_last_modified + future_state: + future_state_path: integration_tests/abnormal_state.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/jsonl.json" - - config_path: "secrets/jsonl_newlines_config.json" + - config_path: secrets/jsonl_newlines_config.json + configured_catalog_path: integration_tests/configured_catalogs/jsonl.json + cursor_paths: + test: + - _ab_source_file_last_modified + future_state: + future_state_path: integration_tests/abnormal_state.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/jsonl.json" - # for custom server - - config_path: "integration_tests/config_minio.json" + - config_path: integration_tests/config_minio.json + configured_catalog_path: integration_tests/configured_catalogs/csv.json + cursor_paths: + test: + - _ab_source_file_last_modified + future_state: + future_state_path: integration_tests/abnormal_state.json timeout_seconds: 1800 - configured_catalog_path: "integration_tests/configured_catalogs/csv.json" From d7cbc790b832d95e9d9e04e1f35cd7d780c35a73 Mon Sep 17 00:00:00 2001 From: Arsen Losenko <20901439+arsenlosenko@users.noreply.github.com> Date: Tue, 24 Jan 2023 12:38:48 +0200 Subject: [PATCH 057/195] Source Amazon Ads: enable SAT high strictness (#21646) * Source Amazon Ads: enable SAT high strictness * Update SAT config, remove config_report.json for now --- .../acceptance-test-config.yml | 103 ++++++++++-------- .../integration_tests/expected_records.jsonl | 7 ++ 2 files changed, 65 insertions(+), 45 deletions(-) diff --git a/airbyte-integrations/connectors/source-amazon-ads/acceptance-test-config.yml b/airbyte-integrations/connectors/source-amazon-ads/acceptance-test-config.yml index d84bb22d17638..322bbd96c6cc9 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-amazon-ads/acceptance-test-config.yml @@ -1,55 +1,68 @@ -# See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) -# for more information about how to configure these tests -connector_image: airbyte/source-amazon-ads:dev acceptance_tests: - spec: + basic_read: tests: - - spec_path: "integration_tests/spec.json" + - config_path: secrets/config.json + empty_streams: + - name: sponsored_brands_ad_groups + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: sponsored_brands_campaigns + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: sponsored_brands_keywords + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: attribution_report_performance_creative + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: attribution_report_performance_adgroup + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: attribution_report_products + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: attribution_report_performance_campaign + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: sponsored_display_report_stream + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: sponsored_brands_report_stream + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: sponsored_brands_video_report_stream + bypass_reason: "can't populate stream because it requires real ad campaign" + - name: sponsored_products_report_stream + bypass_reason: "can't populate stream because it requires real ad campaign" + timeout_seconds: 2400 + expect_records: + path: integration_tests/expected_records.jsonl + exact_order: no + extra_fields: no + extra_records: no connection: tests: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + - config_path: secrets/config.json + status: succeed + - config_path: integration_tests/invalid_config.json + status: failed discovery: tests: - - config_path: "secrets/config.json" - basic_read: + - config_path: secrets/config.json + full_refresh: tests: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - expect_records: - path: "integration_tests/expected_records.jsonl" - extra_fields: no - exact_order: no - extra_records: no - empty_streams: - - name: "profiles" - - name: "sponsored_brands_ad_groups" - - name: "sponsored_brands_campaigns" - - name: "sponsored_brands_keywords" - - name: "attribution_report_performance_creative" - - name: "attribution_report_performance_adgroup" - - name: "attribution_report_products" - - name: "attribution_report_performance_campaign" - - config_path: "secrets/config_report.json" - configured_catalog_path: "integration_tests/configured_catalog_report.json" - timeout_seconds: 2400 + - config_path: secrets/config.json + configured_catalog_path: integration_tests/configured_catalog.json + - config_path: secrets/config_report.json + configured_catalog_path: integration_tests/configured_catalog_report.json + ignored_fields: + sponsored_products_report_stream: + - updatedAt + timeout_seconds: 3600 incremental: tests: - - config_path: "secrets/config_report.json" - configured_catalog_path: "integration_tests/configured_catalog_report.json" - future_state: - future_state_path: "integration_tests/abnormal_state.json" - cursor_paths: - sponsored_products_report_stream: ["1861552880916640", "reportDate"] - timeout_seconds: 2400 - full_refresh: + - config_path: secrets/config_report.json + configured_catalog_path: integration_tests/configured_catalog_report.json + cursor_paths: + sponsored_products_report_stream: + - '1861552880916640' + - reportDate + future_state: + future_state_path: integration_tests/abnormal_state.json + timeout_seconds: 2400 + spec: tests: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - - config_path: "secrets/config_report.json" - configured_catalog_path: "integration_tests/configured_catalog_report.json" - ignored_fields: - "sponsored_products_report_stream": ["updatedAt"] - timeout_seconds: 3600 + - spec_path: integration_tests/spec.json +connector_image: airbyte/source-amazon-ads:dev +test_strictness_level: high diff --git a/airbyte-integrations/connectors/source-amazon-ads/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-amazon-ads/integration_tests/expected_records.jsonl index baecd065086b6..c5951a72ca593 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-amazon-ads/integration_tests/expected_records.jsonl @@ -1,3 +1,10 @@ +{"stream": "profiles", "data": {"profileId": 3991703629696934, "countryCode": "CA", "currencyCode": "CAD", "dailyBudget": 999999999.0, "timezone": "America/Los_Angeles", "accountInfo": {"marketplaceStringId": "A2EUQ1WTGCTBG2", "id": "A3LUQZ2NBMFGO4", "type": "seller", "name": "The Airbyte Store", "validPaymentMethod": true}}, "emitted_at": 1674212646241} +{"stream": "profiles", "data": {"profileId": 2935840597082037, "countryCode": "CA", "currencyCode": "CAD", "timezone": "America/Los_Angeles", "accountInfo": {"marketplaceStringId": "A2EUQ1WTGCTBG2", "id": "ENTITY1T4PQ8E0Y1LVJ", "type": "vendor", "name": "test", "validPaymentMethod": false}}, "emitted_at": 1674212646242} +{"stream": "profiles", "data": {"profileId": 3664951271230581, "countryCode": "MX", "currencyCode": "MXN", "dailyBudget": 999999999.0, "timezone": "America/Los_Angeles", "accountInfo": {"marketplaceStringId": "A1AM78C64UM0Y8", "id": "A3LUQZ2NBMFGO4", "type": "seller", "name": "The Airbyte Store", "validPaymentMethod": true}}, "emitted_at": 1674212646242} +{"stream": "profiles", "data": {"profileId": 1861552880916640, "countryCode": "US", "currencyCode": "USD", "timezone": "America/Los_Angeles", "accountInfo": {"marketplaceStringId": "ATVPDKIKX0DER", "id": "ENTITYVFIQ1E6W9INI", "type": "vendor", "name": "Sponsored ads - KDP", "subType": "KDP_AUTHOR", "validPaymentMethod": true}}, "emitted_at": 1674212646242} +{"stream": "profiles", "data": {"profileId": 3312910465837761, "countryCode": "US", "currencyCode": "USD", "dailyBudget": 999999999.0, "timezone": "America/Los_Angeles", "accountInfo": {"marketplaceStringId": "ATVPDKIKX0DER", "id": "A3LUQZ2NBMFGO4", "type": "seller", "name": "The Airbyte Store", "validPaymentMethod": true}}, "emitted_at": 1674212646243} +{"stream": "profiles", "data": {"profileId": 2445745172318948, "countryCode": "US", "currencyCode": "USD", "timezone": "America/Los_Angeles", "accountInfo": {"marketplaceStringId": "ATVPDKIKX0DER", "id": "ENTITY3QRPN1GHC1Q0U", "type": "vendor", "name": "3PTestBrand-A3LUQZ2NBMFGO46750119612846", "validPaymentMethod": true}}, "emitted_at": 1674212646243} +{"stream": "profiles", "data": {"profileId": 3039403378822505, "countryCode": "US", "currencyCode": "USD", "timezone": "America/Los_Angeles", "accountInfo": {"marketplaceStringId": "ATVPDKIKX0DER", "id": "ENTITY2ZP3PPFBG2043", "type": "vendor", "name": "3PTestBrand-A3LUQZ2NBMFGO4215634471126", "validPaymentMethod": true}}, "emitted_at": 1674212646243} {"stream":"sponsored_display_ad_groups","data":{"adGroupId": 239470166910761, "campaignId": 25934734632378, "defaultBid": 0.02, "name": "Ad group - 7/20/2022 15:45:46", "state": "enabled", "bidOptimization": "clicks", "tactic": "T00020", "creativeType": "IMAGE"},"emitted_at":1659020218593} {"stream":"sponsored_display_campaigns","data":{"campaignId":25934734632378,"name":"Campaign - 7/20/2022 15:45:46","tactic":"T00020","startDate":"20240510","state":"enabled","costType":"cpc","budget":1,"budgetType":"daily","deliveryProfile":"as_soon_as_possible"},"emitted_at":1659020217679} {"stream":"sponsored_display_product_ads","data":{"adId":125773733335504,"adGroupId":239470166910761,"campaignId":25934734632378,"asin":"B000BNT390","state":"enabled"},"emitted_at":1659020219604} From 9e1504521cc8ddca76d719ed1896ef8f2196f993 Mon Sep 17 00:00:00 2001 From: Mykyta Serbynevskiy Date: Tue, 24 Jan 2023 16:45:05 +0200 Subject: [PATCH 058/195] improve logging of find-valid-pat script (#21789) --- tools/bin/find_non_rate_limited_PAT | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/bin/find_non_rate_limited_PAT b/tools/bin/find_non_rate_limited_PAT index 23b6d0b78a477..44fd1cb5ab205 100755 --- a/tools/bin/find_non_rate_limited_PAT +++ b/tools/bin/find_non_rate_limited_PAT @@ -50,7 +50,7 @@ for personal_access_token in $@ done -echo -e "$red_text""::error NO more request availible! Yell at topher or someone on infra!""$default_text" +echo -e "$red_text""::error Either PR changes are proposed by non-contributor who is prohibited to access repo secrets or NO more request available!""$default_text" +echo -e "$red_text""::error Yell at Topher or someone on infra""$default_text" exit 1 - From 3efc6431eaada950d5b2b404d65d80e36c3eb589 Mon Sep 17 00:00:00 2001 From: Sergio Ropero <42538006+sergio-ropero@users.noreply.github.com> Date: Tue, 24 Jan 2023 16:18:42 +0100 Subject: [PATCH 059/195] [Doc] Update Postgres documentation (#21652) * Update documentation for Postgres: - Add details if you need CDC sync for some tables and also sync views. - Reformat tables. * Update documentation for Postgres: - Add details if you need CDC sync for some tables and also sync views. - Reformat tables. * Make documentation user friendly * Fix table --- docs/integrations/sources/postgres.md | 343 +++++++++++++------------- 1 file changed, 171 insertions(+), 172 deletions(-) diff --git a/docs/integrations/sources/postgres.md b/docs/integrations/sources/postgres.md index b46e079717308..af0157806d1ad 100644 --- a/docs/integrations/sources/postgres.md +++ b/docs/integrations/sources/postgres.md @@ -172,7 +172,7 @@ Airbyte uses [logical replication](https://www.postgresql.org/docs/10/logical-re ### CDC Considerations - Incremental sync is only supported for tables with primary keys. For tables without primary keys, use [Full Refresh sync](https://docs.airbyte.com/understanding-airbyte/connections/full-refresh-overwrite). -- Data must be in tables and not views. +- Data must be in tables and not views. If you require data synchronization from a view, you would need to create a new connection with `Standard` as `Replication Method`. - The modifications you want to capture must be made using `DELETE`/`INSERT`/`UPDATE`. For example, changes made using `TRUNCATE`/`ALTER` will not appear in logs and therefore in your destination. - Schema changes are not supported automatically for CDC sources. Reset and resync data if you make a schema change. - The records produced by `DELETE` statements only contain primary keys. All other data fields are unset. @@ -190,7 +190,7 @@ Airbyte requires a replication slot configured only for its use. Only one source To enable logical replication on bare metal, VMs (EC2/GCE/etc), or Docker, configure the following parameters in the [postgresql.conf file](https://www.postgresql.org/docs/current/config-setting.html) for your Postgres database: | Parameter | Description | Set value to | -| --------------------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | +|-----------------------|--------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------| | wal_level | Type of coding used within the Postgres write-ahead log | logical | | max_wal_senders | The maximum number of processes used for handling WAL changes | Min: 1 | | max_replication_slots | The maximum number of replication slots that are allowed to stream WAL changes | 1 (if Airbyte is the only service reading subscribing to WAL changes. More than 1 if other services are also reading from the WAL) | @@ -315,54 +315,54 @@ The Postgres source connector supports the following [sync modes](https://docs.a According to Postgres [documentation](https://www.postgresql.org/docs/14/datatype.html), Postgres data types are mapped to the following data types when synchronizing data. You can check the test values examples [here](https://github.com/airbytehq/airbyte/blob/master/airbyte-integrations/connectors/source-postgres/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/PostgresSourceDatatypeTest.java). If you can't find the data type you are looking for or have any problems feel free to add a new test! -| Postgres Type | Resulting Type | Notes | -| :------------------------------------ | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- | -| `bigint` | number | | -| `bigserial`, `serial8` | number | | -| `bit` | string | Fixed-length bit string (e.g. "0100"). | -| `bit varying`, `varbit` | string | Variable-length bit string (e.g. "0100"). | -| `boolean`, `bool` | boolean | | -| `box` | string | | -| `bytea` | string | Variable length binary string with hex output format prefixed with "\x" (e.g. "\x6b707a"). | -| `character`, `char` | string | | -| `character varying`, `varchar` | string | | -| `cidr` | string | | -| `circle` | string | | -| `date` | string | Parsed as ISO8601 date time at midnight. CDC mode doesn't support era indicators. Issue: [#14590](https://github.com/airbytehq/airbyte/issues/14590) | -| `double precision`, `float`, `float8` | number | `Infinity`, `-Infinity`, and `NaN` are not supported and converted to `null`. Issue: [#8902](https://github.com/airbytehq/airbyte/issues/8902). | -| `hstore` | string | | -| `inet` | string | | -| `integer`, `int`, `int4` | number | | -| `interval` | string | | -| `json` | string | | -| `jsonb` | string | | -| `line` | string | | -| `lseg` | string | | -| `macaddr` | string | | -| `macaddr8` | string | | -| `money` | number | | -| `numeric`, `decimal` | number | `Infinity`, `-Infinity`, and `NaN` are not supported and converted to `null`. Issue: [#8902](https://github.com/airbytehq/airbyte/issues/8902). | -| `path` | string | | -| `pg_lsn` | string | | -| `point` | string | | -| `polygon` | string | | -| `real`, `float4` | number | | -| `smallint`, `int2` | number | | -| `smallserial`, `serial2` | number | | -| `serial`, `serial4` | number | | -| `text` | string | | -| `time` | string | Parsed as a time string without a time-zone in the ISO-8601 calendar system. | -| `timetz` | string | Parsed as a time string with time-zone in the ISO-8601 calendar system. | -| `timestamp` | string | Parsed as a date-time string without a time-zone in the ISO-8601 calendar system. | -| `timestamptz` | string | Parsed as a date-time string with time-zone in the ISO-8601 calendar system. | -| `tsquery` | string | | -| `tsvector` | string | | -| `uuid` | string | | -| `xml` | string | | -| `enum` | string | | -| `tsrange` | string | | -| `array` | array | E.g. "[\"10001\",\"10002\",\"10003\",\"10004\"]". | -| composite type | string | | +| Postgres Type | Resulting Type | Notes | +|---------------------------------------|----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| +| `bigint` | number | | +| `bigserial`, `serial8` | number | | +| `bit` | string | Fixed-length bit string (e.g. "0100"). | +| `bit varying`, `varbit` | string | Variable-length bit string (e.g. "0100"). | +| `boolean`, `bool` | boolean | | +| `box` | string | | +| `bytea` | string | Variable length binary string with hex output format prefixed with "\x" (e.g. "\x6b707a"). | +| `character`, `char` | string | | +| `character varying`, `varchar` | string | | +| `cidr` | string | | +| `circle` | string | | +| `date` | string | Parsed as ISO8601 date time at midnight. CDC mode doesn't support era indicators. Issue: [#14590](https://github.com/airbytehq/airbyte/issues/14590) | +| `double precision`, `float`, `float8` | number | `Infinity`, `-Infinity`, and `NaN` are not supported and converted to `null`. Issue: [#8902](https://github.com/airbytehq/airbyte/issues/8902). | +| `hstore` | string | | +| `inet` | string | | +| `integer`, `int`, `int4` | number | | +| `interval` | string | | +| `json` | string | | +| `jsonb` | string | | +| `line` | string | | +| `lseg` | string | | +| `macaddr` | string | | +| `macaddr8` | string | | +| `money` | number | | +| `numeric`, `decimal` | number | `Infinity`, `-Infinity`, and `NaN` are not supported and converted to `null`. Issue: [#8902](https://github.com/airbytehq/airbyte/issues/8902). | +| `path` | string | | +| `pg_lsn` | string | | +| `point` | string | | +| `polygon` | string | | +| `real`, `float4` | number | | +| `smallint`, `int2` | number | | +| `smallserial`, `serial2` | number | | +| `serial`, `serial4` | number | | +| `text` | string | | +| `time` | string | Parsed as a time string without a time-zone in the ISO-8601 calendar system. | +| `timetz` | string | Parsed as a time string with time-zone in the ISO-8601 calendar system. | +| `timestamp` | string | Parsed as a date-time string without a time-zone in the ISO-8601 calendar system. | +| `timestamptz` | string | Parsed as a date-time string with time-zone in the ISO-8601 calendar system. | +| `tsquery` | string | | +| `tsvector` | string | | +| `uuid` | string | | +| `xml` | string | | +| `enum` | string | | +| `tsrange` | string | | +| `array` | array | E.g. "[\"10001\",\"10002\",\"10003\",\"10004\"]". | +| composite type | string | | ## Limitations @@ -409,125 +409,124 @@ The root causes is that the WALs needed for the incremental sync has been remove ## Changelog -| Version | Date | Pull Request | Subject | -|:--------|:-----------|:------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 1.0.39 | 2022-01-20 | [21683](https://github.com/airbytehq/airbyte/pull/21683) | Speed up esmtimates for trace messages in non-CDC mode. | -| 1.0.38 | 2022-01-17 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | -| 1.0.37 | 2023-01-17 | [20783](https://github.com/airbytehq/airbyte/pull/20783) | Emit estimate trace messages for non-CDC mode. | -| 1.0.36 | 2023-01-11 | [21003](https://github.com/airbytehq/airbyte/pull/21003) | Handle null values for array data types in CDC mode gracefully. | -| 1.0.35 | 2023-01-04 | [20469](https://github.com/airbytehq/airbyte/pull/20469) | Introduce feature to make LSN commit behaviour configurable. | -| 1.0.34 | 2022-12-13 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | -| 1.0.33 | 2022-12-12 | [18959](https://github.com/airbytehq/airbyte/pull/18959) | CDC : Don't timeout if snapshot is not complete. | -| 1.0.32 | 2022-12-12 | [20192](https://github.com/airbytehq/airbyte/pull/20192) | Only throw a warning if cursor column contains null values. | -| 1.0.31 | 2022-12-02 | [19889](https://github.com/airbytehq/airbyte/pull/19889) | Check before each sync and stop if an incremental sync cursor column contains a null value. | -| | 2022-12-02 | [19985](https://github.com/airbytehq/airbyte/pull/19985) | Reenable incorrectly-disabled `wal2json` CDC plugin | -| 1.0.30 | 2022-11-29 | [19024](https://github.com/airbytehq/airbyte/pull/19024) | Skip tables from schema where user do not have Usage permission during discovery. | -| 1.0.29 | 2022-11-29 | [19623](https://github.com/airbytehq/airbyte/pull/19623) | Mark PSQLException related to using replica that is configured as a hot standby server as config error. | -| 1.0.28 | 2022-11-28 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | -| 1.0.27 | 2022-11-28 | [16990](https://github.com/airbytehq/airbyte/pull/16990) | Handle arrays data types | -| 1.0.26 | 2022-11-18 | [19551](https://github.com/airbytehq/airbyte/pull/19551) | Fixes bug with ssl modes | -| 1.0.25 | 2022-11-16 | [19004](https://github.com/airbytehq/airbyte/pull/19004) | Use Debezium heartbeats to improve CDC replication of large databases. | -| 1.0.24 | 2022-11-07 | [19291](https://github.com/airbytehq/airbyte/pull/19291) | Default timeout is reduced from 1 min to 10sec | -| 1.0.23 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | -| 1.0.22 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | -| 1.0.21 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | -| 1.0.20 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | -| 1.0.19 | 2022-10-21 | [18263](https://github.com/airbytehq/airbyte/pull/18263) | Fixes bug introduced in [15833](https://github.com/airbytehq/airbyte/pull/15833) and adds better error messaging for SSH tunnel in Destinations | -| 1.0.18 | 2022-10-19 | [18087](https://github.com/airbytehq/airbyte/pull/18087) | Better error messaging for configuration errors (SSH configs, choosing an invalid cursor) | -| 1.0.17 | 2022-10-17 | [18041](https://github.com/airbytehq/airbyte/pull/18041) | Fixes bug introduced 2022-09-12 with SshTunnel, handles iterator exception properly | -| 1.0.16 | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | -| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Handle 24:00:00 value for Time column | -| 1.0.14 | 2022-10-03 | [17515](https://github.com/airbytehq/airbyte/pull/17515) | Fix an issue preventing connection using client certificate | -| 1.0.13 | 2022-10-01 | [17459](https://github.com/airbytehq/airbyte/pull/17459) | Upgrade debezium version to 1.9.6 from 1.9.2 | -| 1.0.12 | 2022-09-27 | [17299](https://github.com/airbytehq/airbyte/pull/17299) | Improve error handling for strict-encrypt postgres source | -| 1.0.11 | 2022-09-26 | [17131](https://github.com/airbytehq/airbyte/pull/17131) | Allow nullable columns to be used as cursor | -| 1.0.10 | 2022-09-14 | [15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | -| 1.0.9 | 2022-09-13 | [16657](https://github.com/airbytehq/airbyte/pull/16657) | Improve CDC record queueing performance | -| 1.0.8 | 2022-09-08 | [16202](https://github.com/airbytehq/airbyte/pull/16202) | Adds error messaging factory to UI | -| 1.0.7 | 2022-08-30 | [16114](https://github.com/airbytehq/airbyte/pull/16114) | Prevent traffic going on an unsecured channel in strict-encryption version of source postgres | -| 1.0.6 | 2022-08-30 | [16138](https://github.com/airbytehq/airbyte/pull/16138) | Remove unnecessary logging | -| 1.0.5 | 2022-08-25 | [15993](https://github.com/airbytehq/airbyte/pull/15993) | Add support for connection over SSL in CDC mode | -| 1.0.4 | 2022-08-23 | [15877](https://github.com/airbytehq/airbyte/pull/15877) | Fix temporal data type bug which was causing failure in CDC mode | -| 1.0.3 | 2022-08-18 | [14356](https://github.com/airbytehq/airbyte/pull/14356) | DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field | -| 1.0.2 | 2022-08-11 | [15538](https://github.com/airbytehq/airbyte/pull/15538) | Allow additional properties in db stream state | -| 1.0.1 | 2022-08-10 | [15496](https://github.com/airbytehq/airbyte/pull/15496) | Fix state emission in incremental sync | -| | 2022-08-10 | [15481](https://github.com/airbytehq/airbyte/pull/15481) | Fix data handling from WAL logs in CDC mode | -| 1.0.0 | 2022-08-05 | [15380](https://github.com/airbytehq/airbyte/pull/15380) | Change connector label to generally_available (requires [upgrading](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to `v0.40.0-alpha`) | -| 0.4.44 | 2022-08-05 | [15342](https://github.com/airbytehq/airbyte/pull/15342) | Adjust titles and descriptions in spec.json | -| 0.4.43 | 2022-08-03 | [15226](https://github.com/airbytehq/airbyte/pull/15226) | Make connectionTimeoutMs configurable through JDBC url parameters | -| 0.4.42 | 2022-08-03 | [15273](https://github.com/airbytehq/airbyte/pull/15273) | Fix a bug in `0.4.36` and correctly parse the CDC initial record waiting time | -| 0.4.41 | 2022-08-03 | [15077](https://github.com/airbytehq/airbyte/pull/15077) | Sync data from beginning if the LSN is no longer valid in CDC | -| | 2022-08-03 | [14903](https://github.com/airbytehq/airbyte/pull/14903) | Emit state messages more frequently (⛔ this version has a bug; use `1.0.1` instead) | -| 0.4.40 | 2022-08-03 | [15187](https://github.com/airbytehq/airbyte/pull/15187) | Add support for BCE dates/timestamps | -| | 2022-08-03 | [14534](https://github.com/airbytehq/airbyte/pull/14534) | Align regular and CDC integration tests and data mappers | -| 0.4.39 | 2022-08-02 | [14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | -| 0.4.38 | 2022-07-26 | [14362](https://github.com/airbytehq/airbyte/pull/14362) | Integral columns are now discovered as int64 fields. | -| 0.4.37 | 2022-07-22 | [14714](https://github.com/airbytehq/airbyte/pull/14714) | Clarified error message when invalid cursor column selected | -| 0.4.36 | 2022-07-21 | [14451](https://github.com/airbytehq/airbyte/pull/14451) | Make initial CDC waiting time configurable (⛔ this version has a bug and will not work; use `0.4.42` instead) | -| 0.4.35 | 2022-07-14 | [14574](https://github.com/airbytehq/airbyte/pull/14574) | Removed additionalProperties:false from JDBC source connectors | -| 0.4.34 | 2022-07-17 | [13840](https://github.com/airbytehq/airbyte/pull/13840) | Added the ability to connect using different SSL modes and SSL certificates. | -| 0.4.33 | 2022-07-14 | [14586](https://github.com/airbytehq/airbyte/pull/14586) | Validate source JDBC url parameters | -| 0.4.32 | 2022-07-07 | [14694](https://github.com/airbytehq/airbyte/pull/14694) | Force to produce LEGACY state if the use stream capable feature flag is set to false | -| 0.4.31 | 2022-07-07 | [14447](https://github.com/airbytehq/airbyte/pull/14447) | Under CDC mode, retrieve only those tables included in the publications | -| 0.4.30 | 2022-06-30 | [14251](https://github.com/airbytehq/airbyte/pull/14251) | Use more simple and comprehensive query to get selectable tables | -| 0.4.29 | 2022-06-29 | [14265](https://github.com/airbytehq/airbyte/pull/14265) | Upgrade postgresql JDBC version to 42.3.5 | -| 0.4.28 | 2022-06-23 | [14077](https://github.com/airbytehq/airbyte/pull/14077) | Use the new state management | -| 0.4.26 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | -| 0.4.25 | 2022-06-15 | [13823](https://github.com/airbytehq/airbyte/pull/13823) | Publish adaptive postgres source that enforces ssl on cloud + Debezium version upgrade to 1.9.2 from 1.4.2 | -| 0.4.24 | 2022-06-14 | [13549](https://github.com/airbytehq/airbyte/pull/13549) | Fixed truncated precision if the value of microseconds or seconds is 0 | -| 0.4.23 | 2022-06-13 | [13655](https://github.com/airbytehq/airbyte/pull/13745) | Fixed handling datetime cursors when upgrading from older versions of the connector | -| 0.4.22 | 2022-06-09 | [13655](https://github.com/airbytehq/airbyte/pull/13655) | Fixed bug with unsupported date-time datatypes during incremental sync | -| 0.4.21 | 2022-06-06 | [13435](https://github.com/airbytehq/airbyte/pull/13435) | Adjust JDBC fetch size based on max memory and max row size | -| 0.4.20 | 2022-06-02 | [13367](https://github.com/airbytehq/airbyte/pull/13367) | Added convertion hstore to json format | -| 0.4.19 | 2022-05-25 | [13166](https://github.com/airbytehq/airbyte/pull/13166) | Added timezone awareness and handle BC dates | -| 0.4.18 | 2022-05-25 | [13083](https://github.com/airbytehq/airbyte/pull/13083) | Add support for tsquey type | -| 0.4.17 | 2022-05-19 | [13016](https://github.com/airbytehq/airbyte/pull/13016) | CDC modify schema to allow null values | -| 0.4.16 | 2022-05-14 | [12840](https://github.com/airbytehq/airbyte/pull/12840) | Added custom JDBC parameters field | -| 0.4.15 | 2022-05-13 | [12834](https://github.com/airbytehq/airbyte/pull/12834) | Fix the bug that the connector returns empty catalog for Azure Postgres database | -| 0.4.14 | 2022-05-08 | [12689](https://github.com/airbytehq/airbyte/pull/12689) | Add table retrieval according to role-based `SELECT` privilege | -| 0.4.13 | 2022-05-05 | [10230](https://github.com/airbytehq/airbyte/pull/10230) | Explicitly set null value for field in json | -| 0.4.12 | 2022-04-29 | [12480](https://github.com/airbytehq/airbyte/pull/12480) | Query tables with adaptive fetch size to optimize JDBC memory consumption | -| 0.4.11 | 2022-04-11 | [11729](https://github.com/airbytehq/airbyte/pull/11729) | Bump mina-sshd from 2.7.0 to 2.8.0 | -| 0.4.10 | 2022-04-08 | [11798](https://github.com/airbytehq/airbyte/pull/11798) | Fixed roles for fetching materialized view processing | -| 0.4.8 | 2022-02-21 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats | -| 0.4.7 | 2022-02-18 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Updated timestamp transformation with microseconds | -| 0.4.6 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | (unpublished) Add `-XX:+ExitOnOutOfMemoryError` JVM option | -| 0.4.5 | 2022-02-08 | [10173](https://github.com/airbytehq/airbyte/pull/10173) | Improved discovering tables in case if user does not have permissions to any table | -| 0.4.4 | 2022-01-26 | [9807](https://github.com/airbytehq/airbyte/pull/9807) | Update connector fields title/description | -| 0.4.3 | 2022-01-24 | [9554](https://github.com/airbytehq/airbyte/pull/9554) | Allow handling of java sql date in CDC | -| 0.4.2 | 2022-01-13 | [9360](https://github.com/airbytehq/airbyte/pull/9360) | Added schema selection | -| 0.4.1 | 2022-01-05 | [9116](https://github.com/airbytehq/airbyte/pull/9116) | Added materialized views processing | -| 0.4.0 | 2021-12-13 | [8726](https://github.com/airbytehq/airbyte/pull/8726) | Support all Postgres types | -| 0.3.17 | 2021-12-01 | [8371](https://github.com/airbytehq/airbyte/pull/8371) | Fixed incorrect handling "\n" in ssh key | -| 0.3.16 | 2021-11-28 | [7995](https://github.com/airbytehq/airbyte/pull/7995) | Fixed money type with amount > 1000 | -| 0.3.15 | 2021-11-26 | [8066](https://github.com/airbytehq/airbyte/pull/8266) | Fixed the case, when Views are not listed during schema discovery | -| 0.3.14 | 2021-11-17 | [8010](https://github.com/airbytehq/airbyte/pull/8010) | Added checking of privileges before table internal discovery | -| 0.3.13 | 2021-10-26 | [7339](https://github.com/airbytehq/airbyte/pull/7339) | Support or improve support for Interval, Money, Date, various geometric data types, inventory_items, and others | -| 0.3.12 | 2021-09-30 | [6585](https://github.com/airbytehq/airbyte/pull/6585) | Improved SSH Tunnel key generation steps | -| 0.3.11 | 2021-09-02 | [5742](https://github.com/airbytehq/airbyte/pull/5742) | Add SSH Tunnel support | -| 0.3.9 | 2021-08-17 | [5304](https://github.com/airbytehq/airbyte/pull/5304) | Fix CDC OOM issue | -| 0.3.8 | 2021-08-13 | [4699](https://github.com/airbytehq/airbyte/pull/4699) | Added json config validator | -| 0.3.4 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support | -| 0.3.3 | 2021-06-08 | [3960](https://github.com/airbytehq/airbyte/pull/3960) | Add method field in specification parameters | -| 0.3.2 | 2021-05-26 | [3179](https://github.com/airbytehq/airbyte/pull/3179) | Remove `isCDC` logging | -| 0.3.1 | 2021-04-21 | [2878](https://github.com/airbytehq/airbyte/pull/2878) | Set defined cursor for CDC | -| 0.3.0 | 2021-04-21 | [2990](https://github.com/airbytehq/airbyte/pull/2990) | Support namespaces | -| 0.2.7 | 2021-04-16 | [2923](https://github.com/airbytehq/airbyte/pull/2923) | SSL spec as optional | -| 0.2.6 | 2021-04-16 | [2757](https://github.com/airbytehq/airbyte/pull/2757) | Support SSL connection | -| 0.2.5 | 2021-04-12 | [2859](https://github.com/airbytehq/airbyte/pull/2859) | CDC bugfix | -| 0.2.4 | 2021-04-09 | [2548](https://github.com/airbytehq/airbyte/pull/2548) | Support CDC | -| 0.2.3 | 2021-03-28 | [2600](https://github.com/airbytehq/airbyte/pull/2600) | Add NCHAR and NVCHAR support to DB and cursor type casting | -| 0.2.2 | 2021-03-26 | [2460](https://github.com/airbytehq/airbyte/pull/2460) | Destination supports destination sync mode | -| 0.2.1 | 2021-03-18 | [2488](https://github.com/airbytehq/airbyte/pull/2488) | Sources support primary keys | -| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | -| 0.1.13 | 2021-02-02 | [1887](https://github.com/airbytehq/airbyte/pull/1887) | Migrate AbstractJdbcSource to use iterators | -| 0.1.12 | 2021-01-25 | [1746](https://github.com/airbytehq/airbyte/pull/1746) | Fix NPE in State Decorator | -| 0.1.11 | 2021-01-25 | [1765](https://github.com/airbytehq/airbyte/pull/1765) | Add field titles to specification | -| 0.1.10 | 2021-01-19 | [1724](https://github.com/airbytehq/airbyte/pull/1724) | Fix JdbcSource handling of tables with same names in different schemas | -| 0.1.9 | 2021-01-14 | [1655](https://github.com/airbytehq/airbyte/pull/1655) | Fix JdbcSource OOM | -| 0.1.8 | 2021-01-13 | [1588](https://github.com/airbytehq/airbyte/pull/1588) | Handle invalid numeric values in JDBC source | -| 0.1.7 | 2021-01-08 | [1307](https://github.com/airbytehq/airbyte/pull/1307) | Migrate Postgres and MySql to use new JdbcSource | -| 0.1.6 | 2020-12-09 | [1172](https://github.com/airbytehq/airbyte/pull/1172) | Support incremental sync | -| 0.1.5 | 2020-11-30 | [1038](https://github.com/airbytehq/airbyte/pull/1038) | Change JDBC sources to discover more than standard schemas | -| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | - +| Version | Date | Pull Request | Subject | +|:--------|:-------------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.39 | 2022-01-20 | [21683](https://github.com/airbytehq/airbyte/pull/21683) | Speed up esmtimates for trace messages in non-CDC mode. | +| 1.0.38 | 2022-01-17 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | +| 1.0.37 | 2023-01-17 | [20783](https://github.com/airbytehq/airbyte/pull/20783) | Emit estimate trace messages for non-CDC mode. | +| 1.0.36 | 2023-01-11 | [21003](https://github.com/airbytehq/airbyte/pull/21003) | Handle null values for array data types in CDC mode gracefully. | +| 1.0.35 | 2023-01-04 | [20469](https://github.com/airbytehq/airbyte/pull/20469) | Introduce feature to make LSN commit behaviour configurable. | +| 1.0.34 | 2022-12-13 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | +| 1.0.33 | 2022-12-12 | [18959](https://github.com/airbytehq/airbyte/pull/18959) | CDC : Don't timeout if snapshot is not complete. | +| 1.0.32 | 2022-12-12 | [20192](https://github.com/airbytehq/airbyte/pull/20192) | Only throw a warning if cursor column contains null values. | +| 1.0.31 | 2022-12-02 | [19889](https://github.com/airbytehq/airbyte/pull/19889) | Check before each sync and stop if an incremental sync cursor column contains a null value. | +| | 2022-12-02 | [19985](https://github.com/airbytehq/airbyte/pull/19985) | Reenable incorrectly-disabled `wal2json` CDC plugin | +| 1.0.30 | 2022-11-29 | [19024](https://github.com/airbytehq/airbyte/pull/19024) | Skip tables from schema where user do not have Usage permission during discovery. | +| 1.0.29 | 2022-11-29 | [19623](https://github.com/airbytehq/airbyte/pull/19623) | Mark PSQLException related to using replica that is configured as a hot standby server as config error. | +| 1.0.28 | 2022-11-28 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | +| 1.0.27 | 2022-11-28 | [16990](https://github.com/airbytehq/airbyte/pull/16990) | Handle arrays data types | +| 1.0.26 | 2022-11-18 | [19551](https://github.com/airbytehq/airbyte/pull/19551) | Fixes bug with ssl modes | +| 1.0.25 | 2022-11-16 | [19004](https://github.com/airbytehq/airbyte/pull/19004) | Use Debezium heartbeats to improve CDC replication of large databases. | +| 1.0.24 | 2022-11-07 | [19291](https://github.com/airbytehq/airbyte/pull/19291) | Default timeout is reduced from 1 min to 10sec | +| 1.0.23 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | +| 1.0.22 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | +| 1.0.21 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | +| 1.0.20 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | +| 1.0.19 | 2022-10-21 | [18263](https://github.com/airbytehq/airbyte/pull/18263) | Fixes bug introduced in [15833](https://github.com/airbytehq/airbyte/pull/15833) and adds better error messaging for SSH tunnel in Destinations | +| 1.0.18 | 2022-10-19 | [18087](https://github.com/airbytehq/airbyte/pull/18087) | Better error messaging for configuration errors (SSH configs, choosing an invalid cursor) | +| 1.0.17 | 2022-10-17 | [18041](https://github.com/airbytehq/airbyte/pull/18041) | Fixes bug introduced 2022-09-12 with SshTunnel, handles iterator exception properly | +| 1.0.16 | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | +| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Handle 24:00:00 value for Time column | +| 1.0.14 | 2022-10-03 | [17515](https://github.com/airbytehq/airbyte/pull/17515) | Fix an issue preventing connection using client certificate | +| 1.0.13 | 2022-10-01 | [17459](https://github.com/airbytehq/airbyte/pull/17459) | Upgrade debezium version to 1.9.6 from 1.9.2 | +| 1.0.12 | 2022-09-27 | [17299](https://github.com/airbytehq/airbyte/pull/17299) | Improve error handling for strict-encrypt postgres source | +| 1.0.11 | 2022-09-26 | [17131](https://github.com/airbytehq/airbyte/pull/17131) | Allow nullable columns to be used as cursor | +| 1.0.10 | 2022-09-14 | [15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | +| 1.0.9 | 2022-09-13 | [16657](https://github.com/airbytehq/airbyte/pull/16657) | Improve CDC record queueing performance | +| 1.0.8 | 2022-09-08 | [16202](https://github.com/airbytehq/airbyte/pull/16202) | Adds error messaging factory to UI | +| 1.0.7 | 2022-08-30 | [16114](https://github.com/airbytehq/airbyte/pull/16114) | Prevent traffic going on an unsecured channel in strict-encryption version of source postgres | +| 1.0.6 | 2022-08-30 | [16138](https://github.com/airbytehq/airbyte/pull/16138) | Remove unnecessary logging | +| 1.0.5 | 2022-08-25 | [15993](https://github.com/airbytehq/airbyte/pull/15993) | Add support for connection over SSL in CDC mode | +| 1.0.4 | 2022-08-23 | [15877](https://github.com/airbytehq/airbyte/pull/15877) | Fix temporal data type bug which was causing failure in CDC mode | +| 1.0.3 | 2022-08-18 | [14356](https://github.com/airbytehq/airbyte/pull/14356) | DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field | +| 1.0.2 | 2022-08-11 | [15538](https://github.com/airbytehq/airbyte/pull/15538) | Allow additional properties in db stream state | +| 1.0.1 | 2022-08-10 | [15496](https://github.com/airbytehq/airbyte/pull/15496) | Fix state emission in incremental sync | +| | 2022-08-10 | [15481](https://github.com/airbytehq/airbyte/pull/15481) | Fix data handling from WAL logs in CDC mode | +| 1.0.0 | 2022-08-05 | [15380](https://github.com/airbytehq/airbyte/pull/15380) | Change connector label to generally_available (requires [upgrading](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to `v0.40.0-alpha`) | +| 0.4.44 | 2022-08-05 | [15342](https://github.com/airbytehq/airbyte/pull/15342) | Adjust titles and descriptions in spec.json | +| 0.4.43 | 2022-08-03 | [15226](https://github.com/airbytehq/airbyte/pull/15226) | Make connectionTimeoutMs configurable through JDBC url parameters | +| 0.4.42 | 2022-08-03 | [15273](https://github.com/airbytehq/airbyte/pull/15273) | Fix a bug in `0.4.36` and correctly parse the CDC initial record waiting time | +| 0.4.41 | 2022-08-03 | [15077](https://github.com/airbytehq/airbyte/pull/15077) | Sync data from beginning if the LSN is no longer valid in CDC | +| | 2022-08-03 | [14903](https://github.com/airbytehq/airbyte/pull/14903) | Emit state messages more frequently (⛔ this version has a bug; use `1.0.1` instead) | +| 0.4.40 | 2022-08-03 | [15187](https://github.com/airbytehq/airbyte/pull/15187) | Add support for BCE dates/timestamps | +| | 2022-08-03 | [14534](https://github.com/airbytehq/airbyte/pull/14534) | Align regular and CDC integration tests and data mappers | +| 0.4.39 | 2022-08-02 | [14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | +| 0.4.38 | 2022-07-26 | [14362](https://github.com/airbytehq/airbyte/pull/14362) | Integral columns are now discovered as int64 fields. | +| 0.4.37 | 2022-07-22 | [14714](https://github.com/airbytehq/airbyte/pull/14714) | Clarified error message when invalid cursor column selected | +| 0.4.36 | 2022-07-21 | [14451](https://github.com/airbytehq/airbyte/pull/14451) | Make initial CDC waiting time configurable (⛔ this version has a bug and will not work; use `0.4.42` instead) | +| 0.4.35 | 2022-07-14 | [14574](https://github.com/airbytehq/airbyte/pull/14574) | Removed additionalProperties:false from JDBC source connectors | +| 0.4.34 | 2022-07-17 | [13840](https://github.com/airbytehq/airbyte/pull/13840) | Added the ability to connect using different SSL modes and SSL certificates. | +| 0.4.33 | 2022-07-14 | [14586](https://github.com/airbytehq/airbyte/pull/14586) | Validate source JDBC url parameters | +| 0.4.32 | 2022-07-07 | [14694](https://github.com/airbytehq/airbyte/pull/14694) | Force to produce LEGACY state if the use stream capable feature flag is set to false | +| 0.4.31 | 2022-07-07 | [14447](https://github.com/airbytehq/airbyte/pull/14447) | Under CDC mode, retrieve only those tables included in the publications | +| 0.4.30 | 2022-06-30 | [14251](https://github.com/airbytehq/airbyte/pull/14251) | Use more simple and comprehensive query to get selectable tables | +| 0.4.29 | 2022-06-29 | [14265](https://github.com/airbytehq/airbyte/pull/14265) | Upgrade postgresql JDBC version to 42.3.5 | +| 0.4.28 | 2022-06-23 | [14077](https://github.com/airbytehq/airbyte/pull/14077) | Use the new state management | +| 0.4.26 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | +| 0.4.25 | 2022-06-15 | [13823](https://github.com/airbytehq/airbyte/pull/13823) | Publish adaptive postgres source that enforces ssl on cloud + Debezium version upgrade to 1.9.2 from 1.4.2 | +| 0.4.24 | 2022-06-14 | [13549](https://github.com/airbytehq/airbyte/pull/13549) | Fixed truncated precision if the value of microseconds or seconds is 0 | +| 0.4.23 | 2022-06-13 | [13655](https://github.com/airbytehq/airbyte/pull/13745) | Fixed handling datetime cursors when upgrading from older versions of the connector | +| 0.4.22 | 2022-06-09 | [13655](https://github.com/airbytehq/airbyte/pull/13655) | Fixed bug with unsupported date-time datatypes during incremental sync | +| 0.4.21 | 2022-06-06 | [13435](https://github.com/airbytehq/airbyte/pull/13435) | Adjust JDBC fetch size based on max memory and max row size | +| 0.4.20 | 2022-06-02 | [13367](https://github.com/airbytehq/airbyte/pull/13367) | Added convertion hstore to json format | +| 0.4.19 | 2022-05-25 | [13166](https://github.com/airbytehq/airbyte/pull/13166) | Added timezone awareness and handle BC dates | +| 0.4.18 | 2022-05-25 | [13083](https://github.com/airbytehq/airbyte/pull/13083) | Add support for tsquey type | +| 0.4.17 | 2022-05-19 | [13016](https://github.com/airbytehq/airbyte/pull/13016) | CDC modify schema to allow null values | +| 0.4.16 | 2022-05-14 | [12840](https://github.com/airbytehq/airbyte/pull/12840) | Added custom JDBC parameters field | +| 0.4.15 | 2022-05-13 | [12834](https://github.com/airbytehq/airbyte/pull/12834) | Fix the bug that the connector returns empty catalog for Azure Postgres database | +| 0.4.14 | 2022-05-08 | [12689](https://github.com/airbytehq/airbyte/pull/12689) | Add table retrieval according to role-based `SELECT` privilege | +| 0.4.13 | 2022-05-05 | [10230](https://github.com/airbytehq/airbyte/pull/10230) | Explicitly set null value for field in json | +| 0.4.12 | 2022-04-29 | [12480](https://github.com/airbytehq/airbyte/pull/12480) | Query tables with adaptive fetch size to optimize JDBC memory consumption | +| 0.4.11 | 2022-04-11 | [11729](https://github.com/airbytehq/airbyte/pull/11729) | Bump mina-sshd from 2.7.0 to 2.8.0 | +| 0.4.10 | 2022-04-08 | [11798](https://github.com/airbytehq/airbyte/pull/11798) | Fixed roles for fetching materialized view processing | +| 0.4.8 | 2022-02-21 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats | +| 0.4.7 | 2022-02-18 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Updated timestamp transformation with microseconds | +| 0.4.6 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | (unpublished) Add `-XX:+ExitOnOutOfMemoryError` JVM option | +| 0.4.5 | 2022-02-08 | [10173](https://github.com/airbytehq/airbyte/pull/10173) | Improved discovering tables in case if user does not have permissions to any table | +| 0.4.4 | 2022-01-26 | [9807](https://github.com/airbytehq/airbyte/pull/9807) | Update connector fields title/description | +| 0.4.3 | 2022-01-24 | [9554](https://github.com/airbytehq/airbyte/pull/9554) | Allow handling of java sql date in CDC | +| 0.4.2 | 2022-01-13 | [9360](https://github.com/airbytehq/airbyte/pull/9360) | Added schema selection | +| 0.4.1 | 2022-01-05 | [9116](https://github.com/airbytehq/airbyte/pull/9116) | Added materialized views processing | +| 0.4.0 | 2021-12-13 | [8726](https://github.com/airbytehq/airbyte/pull/8726) | Support all Postgres types | +| 0.3.17 | 2021-12-01 | [8371](https://github.com/airbytehq/airbyte/pull/8371) | Fixed incorrect handling "\n" in ssh key | +| 0.3.16 | 2021-11-28 | [7995](https://github.com/airbytehq/airbyte/pull/7995) | Fixed money type with amount > 1000 | +| 0.3.15 | 2021-11-26 | [8066](https://github.com/airbytehq/airbyte/pull/8266) | Fixed the case, when Views are not listed during schema discovery | +| 0.3.14 | 2021-11-17 | [8010](https://github.com/airbytehq/airbyte/pull/8010) | Added checking of privileges before table internal discovery | +| 0.3.13 | 2021-10-26 | [7339](https://github.com/airbytehq/airbyte/pull/7339) | Support or improve support for Interval, Money, Date, various geometric data types, inventory_items, and others | +| 0.3.12 | 2021-09-30 | [6585](https://github.com/airbytehq/airbyte/pull/6585) | Improved SSH Tunnel key generation steps | +| 0.3.11 | 2021-09-02 | [5742](https://github.com/airbytehq/airbyte/pull/5742) | Add SSH Tunnel support | +| 0.3.9 | 2021-08-17 | [5304](https://github.com/airbytehq/airbyte/pull/5304) | Fix CDC OOM issue | +| 0.3.8 | 2021-08-13 | [4699](https://github.com/airbytehq/airbyte/pull/4699) | Added json config validator | +| 0.3.4 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support | +| 0.3.3 | 2021-06-08 | [3960](https://github.com/airbytehq/airbyte/pull/3960) | Add method field in specification parameters | +| 0.3.2 | 2021-05-26 | [3179](https://github.com/airbytehq/airbyte/pull/3179) | Remove `isCDC` logging | +| 0.3.1 | 2021-04-21 | [2878](https://github.com/airbytehq/airbyte/pull/2878) | Set defined cursor for CDC | +| 0.3.0 | 2021-04-21 | [2990](https://github.com/airbytehq/airbyte/pull/2990) | Support namespaces | +| 0.2.7 | 2021-04-16 | [2923](https://github.com/airbytehq/airbyte/pull/2923) | SSL spec as optional | +| 0.2.6 | 2021-04-16 | [2757](https://github.com/airbytehq/airbyte/pull/2757) | Support SSL connection | +| 0.2.5 | 2021-04-12 | [2859](https://github.com/airbytehq/airbyte/pull/2859) | CDC bugfix | +| 0.2.4 | 2021-04-09 | [2548](https://github.com/airbytehq/airbyte/pull/2548) | Support CDC | +| 0.2.3 | 2021-03-28 | [2600](https://github.com/airbytehq/airbyte/pull/2600) | Add NCHAR and NVCHAR support to DB and cursor type casting | +| 0.2.2 | 2021-03-26 | [2460](https://github.com/airbytehq/airbyte/pull/2460) | Destination supports destination sync mode | +| 0.2.1 | 2021-03-18 | [2488](https://github.com/airbytehq/airbyte/pull/2488) | Sources support primary keys | +| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | +| 0.1.13 | 2021-02-02 | [1887](https://github.com/airbytehq/airbyte/pull/1887) | Migrate AbstractJdbcSource to use iterators | +| 0.1.12 | 2021-01-25 | [1746](https://github.com/airbytehq/airbyte/pull/1746) | Fix NPE in State Decorator | +| 0.1.11 | 2021-01-25 | [1765](https://github.com/airbytehq/airbyte/pull/1765) | Add field titles to specification | +| 0.1.10 | 2021-01-19 | [1724](https://github.com/airbytehq/airbyte/pull/1724) | Fix JdbcSource handling of tables with same names in different schemas | +| 0.1.9 | 2021-01-14 | [1655](https://github.com/airbytehq/airbyte/pull/1655) | Fix JdbcSource OOM | +| 0.1.8 | 2021-01-13 | [1588](https://github.com/airbytehq/airbyte/pull/1588) | Handle invalid numeric values in JDBC source | +| 0.1.7 | 2021-01-08 | [1307](https://github.com/airbytehq/airbyte/pull/1307) | Migrate Postgres and MySql to use new JdbcSource | +| 0.1.6 | 2020-12-09 | [1172](https://github.com/airbytehq/airbyte/pull/1172) | Support incremental sync | +| 0.1.5 | 2020-11-30 | [1038](https://github.com/airbytehq/airbyte/pull/1038) | Change JDBC sources to discover more than standard schemas | +| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | From ca8cdc40aae629945e08d465871352235f5d53b5 Mon Sep 17 00:00:00 2001 From: Maxime Carbonneau-Leclerc Date: Tue, 24 Jan 2023 10:19:19 -0500 Subject: [PATCH 060/195] =?UTF-8?q?[ISSUE=20#20771]=20limiting=20the=20num?= =?UTF-8?q?ber=20of=20requests=20performed=20to=20the=20backe=E2=80=A6=20(?= =?UTF-8?q?#21525)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ISSUE #20771] limiting the number of requests performed to the backend without flag * [ISSUE #20771] code reviewing my own code * [ISSUE #20771] adding ABC to paginator * [ISSUE #20771] format code * [ISSUE #20771] adding slices to connector builder read request (#21605) * [ISSUE #20771] adding slices to connector builder read request * [ISSUE #20771] formatting * [ISSUE #20771] set flag when limit requests reached (#21619) * [ISSUE #20771] set flag when limit requests reached * [ISSUE #20771] assert proper value on test read objects __init__ * [ISSUE #20771] code review and fix edge case * [ISSUE #20771] fix flake8 error * [ISSUE #20771] code review * 🤖 Bump minor version of Airbyte CDK * to run the CI --- airbyte-cdk/python/.bumpversion.cfg | 2 +- airbyte-cdk/python/CHANGELOG.md | 3 + .../airbyte_cdk/sources/abstract_source.py | 15 +- .../manifest_declarative_source.py | 15 +- .../parsers/model_to_component_factory.py | 1129 +++++++++-------- .../requesters/paginators/__init__.py | 4 +- .../paginators/default_paginator.py | 66 + .../requesters/paginators/paginator.py | 4 +- .../declarative/retrievers/__init__.py | 4 +- .../retrievers/simple_retriever.py | 23 + airbyte-cdk/python/setup.py | 2 +- .../paginators/test_default_paginator.py | 29 +- .../retrievers/test_simple_retriever.py | 26 + .../test_manifest_declarative_source.py | 89 ++ .../sources/test_abstract_source.py | 51 + .../python/unit_tests/sources/test_source.py | 22 +- .../connector_builder/entrypoint.py | 8 +- .../generated/models/stream_read.py | 2 + .../connector_builder/impl/adapter.py | 8 + .../connector_builder/impl/default_api.py | 85 +- .../impl/low_code_cdk_adapter.py | 21 +- airbyte-connector-builder-server/setup.py | 2 +- .../src/main/openapi/openapi.yaml | 4 + .../impl/test_default_api.py | 154 ++- .../impl/test_low_code_cdk_adapter.py | 56 +- 25 files changed, 1179 insertions(+), 645 deletions(-) diff --git a/airbyte-cdk/python/.bumpversion.cfg b/airbyte-cdk/python/.bumpversion.cfg index 44db9b6e9a4d7..1278da16b49c7 100644 --- a/airbyte-cdk/python/.bumpversion.cfg +++ b/airbyte-cdk/python/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.22.0 +current_version = 0.23.0 commit = False [bumpversion:file:setup.py] diff --git a/airbyte-cdk/python/CHANGELOG.md b/airbyte-cdk/python/CHANGELOG.md index ce125c91cac2b..22592251d7022 100644 --- a/airbyte-cdk/python/CHANGELOG.md +++ b/airbyte-cdk/python/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.23.0 +Limiting the number of HTTP requests during a test read + ## 0.22.0 Surface the resolved manifest in the CDK diff --git a/airbyte-cdk/python/airbyte_cdk/sources/abstract_source.py b/airbyte-cdk/python/airbyte_cdk/sources/abstract_source.py index 3f9efab8e48f2..a9efc45fb21bc 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/abstract_source.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/abstract_source.py @@ -2,6 +2,7 @@ # Copyright (c) 2022 Airbyte, Inc., all rights reserved. # +import json import logging from abc import ABC, abstractmethod from typing import Any, Dict, Iterator, List, Mapping, MutableMapping, Optional, Tuple, Union @@ -9,10 +10,12 @@ from airbyte_cdk.models import ( AirbyteCatalog, AirbyteConnectionStatus, + AirbyteLogMessage, AirbyteMessage, AirbyteStateMessage, ConfiguredAirbyteCatalog, ConfiguredAirbyteStream, + Level, Status, SyncMode, ) @@ -34,6 +37,8 @@ class AbstractSource(Source, ABC): in this class to create an Airbyte Specification compliant Source. """ + SLICE_LOG_PREFIX = "slice:" + @abstractmethod def check_connection(self, logger: logging.Logger, config: Mapping[str, Any]) -> Tuple[bool, Optional[Any]]: """ @@ -236,7 +241,10 @@ def _read_incremental( has_slices = False for _slice in slices: has_slices = True - logger.debug("Processing stream slice", extra={"slice": _slice}) + if logger.isEnabledFor(logging.DEBUG): + yield AirbyteMessage( + type=MessageType.LOG, log=AirbyteLogMessage(level=Level.INFO, message=f"{self.SLICE_LOG_PREFIX}{json.dumps(_slice)}") + ) records = stream_instance.read_records( sync_mode=SyncMode.incremental, stream_slice=_slice, @@ -285,7 +293,10 @@ def _read_full_refresh( ) total_records_counter = 0 for _slice in slices: - logger.debug("Processing stream slice", extra={"slice": _slice}) + if logger.isEnabledFor(logging.DEBUG): + yield AirbyteMessage( + type=MessageType.LOG, log=AirbyteLogMessage(level=Level.INFO, message=f"{self.SLICE_LOG_PREFIX}{json.dumps(_slice)}") + ) record_data_or_messages = stream_instance.read_records( stream_slice=_slice, sync_mode=SyncMode.full_refresh, diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/manifest_declarative_source.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/manifest_declarative_source.py index 40fb1b6fac819..05d9e74113583 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/manifest_declarative_source.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/manifest_declarative_source.py @@ -50,7 +50,13 @@ class ManifestDeclarativeSource(DeclarativeSource): VALID_TOP_LEVEL_FIELDS = {"check", "definitions", "schemas", "spec", "streams", "type", "version"} - def __init__(self, source_config: ConnectionDefinition, debug: bool = False, construct_using_pydantic_models: bool = False): + def __init__( + self, + source_config: ConnectionDefinition, + debug: bool = False, + component_factory: ModelToComponentFactory = None, + construct_using_pydantic_models: bool = False, + ): """ :param source_config(Mapping[str, Any]): The manifest of low-code components that describe the source connector :param debug(bool): True if debug mode is enabled @@ -71,7 +77,12 @@ def __init__(self, source_config: ConnectionDefinition, debug: bool = False, con self._legacy_source_config = resolved_source_config self._debug = debug self._legacy_factory = DeclarativeComponentFactory() # Legacy factory used to instantiate declarative components from the manifest - self._constructor = ModelToComponentFactory() # New factory which converts the manifest to Pydantic models to construct components + if component_factory: + self._constructor = component_factory + else: + self._constructor = ( + ModelToComponentFactory() + ) # New factory which converts the manifest to Pydantic models to construct components self._validate_source() diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py index ca5e46d79c6c6..8f022f34fa3ad 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py @@ -89,11 +89,11 @@ WaitUntilTimeFromHeaderBackoffStrategy, ) from airbyte_cdk.sources.declarative.requesters.error_handlers.response_action import ResponseAction -from airbyte_cdk.sources.declarative.requesters.paginators import DefaultPaginator, NoPagination +from airbyte_cdk.sources.declarative.requesters.paginators import DefaultPaginator, NoPagination, PaginatorTestReadDecorator from airbyte_cdk.sources.declarative.requesters.paginators.strategies import CursorPaginationStrategy, OffsetIncrement, PageIncrement from airbyte_cdk.sources.declarative.requesters.request_option import RequestOptionType from airbyte_cdk.sources.declarative.requesters.request_options import InterpolatedRequestOptionsProvider -from airbyte_cdk.sources.declarative.retrievers import SimpleRetriever +from airbyte_cdk.sources.declarative.retrievers import SimpleRetriever, SimpleRetrieverTestReadDecorator from airbyte_cdk.sources.declarative.schema import DefaultSchemaLoader, InlineSchemaLoader, JsonFileSchemaLoader from airbyte_cdk.sources.declarative.spec import Spec from airbyte_cdk.sources.declarative.stream_slicers import ( @@ -116,8 +116,71 @@ class ModelToComponentFactory: - @staticmethod - def create_component(model_type: Type[BaseModel], component_definition: ComponentDefinition, config: Config) -> type: + def __init__(self, limit_pages_fetched_per_slice: int = None, limit_slices_fetched: int = None): + self._init_mappings() + self._limit_pages_fetched_per_slice = limit_pages_fetched_per_slice + self._limit_slices_fetched = limit_slices_fetched + + def _init_mappings(self): + self.PYDANTIC_MODEL_TO_CONSTRUCTOR: [Type[BaseModel], Callable] = { + AddedFieldDefinitionModel: self.create_added_field_definition, + AddFieldsModel: self.create_add_fields, + ApiKeyAuthenticatorModel: self.create_api_key_authenticator, + BasicHttpAuthenticatorModel: self.create_basic_http_authenticator, + BearerAuthenticatorModel: self.create_bearer_authenticator, + CheckStreamModel: self.create_check_stream, + CartesianProductStreamSlicerModel: self.create_cartesian_product_slicer, + CompositeErrorHandlerModel: self.create_composite_error_handler, + ConstantBackoffStrategyModel: self.create_constant_backoff_strategy, + CursorPaginationModel: self.create_cursor_pagination, + CustomAuthenticatorModel: self.create_custom_component, + CustomBackoffStrategyModel: self.create_custom_component, + CustomErrorHandlerModel: self.create_custom_component, + CustomRecordExtractorModel: self.create_custom_component, + CustomRequesterModel: self.create_custom_component, + CustomRequestOptionsProviderModel: self.create_custom_component, + # todo: Remove later when we deprecate request providers from interface + CustomRetrieverModel: self.create_custom_component, + CustomPaginationStrategyModel: self.create_custom_component, + CustomStreamSlicerModel: self.create_custom_component, + CustomTransformationModel: self.create_custom_component, + DatetimeStreamSlicerModel: self.create_datetime_stream_slicer, + DeclarativeStreamModel: self.create_declarative_stream, + DefaultErrorHandlerModel: self.create_default_error_handler, + DefaultPaginatorModel: self.create_default_paginator, + DpathExtractorModel: self.create_dpath_extractor, + ExponentialBackoffStrategyModel: self.create_exponential_backoff_strategy, + HttpRequesterModel: self.create_http_requester, + HttpResponseFilterModel: self.create_http_response_filter, + InlineSchemaLoaderModel: self.create_inline_schema_loader, + InterpolatedRequestOptionsProviderModel: self.create_interpolated_request_options_provider, + JsonDecoderModel: self.create_json_decoder, + JsonFileSchemaLoaderModel: self.create_json_file_schema_loader, + ListStreamSlicerModel: self.create_list_stream_slicer, + MinMaxDatetimeModel: self.create_min_max_datetime, + NoAuthModel: self.create_no_auth, + NoPaginationModel: self.create_no_pagination, + OAuthAuthenticatorModel: self.create_oauth_authenticator, + OffsetIncrementModel: self.create_offset_increment, + PageIncrementModel: self.create_page_increment, + ParentStreamConfigModel: self.create_parent_stream_config, + RecordFilterModel: self.create_record_filter, + RecordSelectorModel: self.create_record_selector, + RemoveFieldsModel: self.create_remove_fields, + RequestOptionModel: self.create_request_option, + SessionTokenAuthenticatorModel: self.create_session_token_authenticator, + SimpleRetrieverModel: self.create_simple_retriever, + SingleSliceModel: self.create_single_slice, + SpecModel: self.create_spec, + SubstreamSlicerModel: self.create_substream_slicer, + WaitTimeFromHeaderModel: self.create_wait_time_from_header, + WaitUntilTimeFromHeaderModel: self.create_wait_until_time_from_header, + } + + # Needed for the case where we need to perform a second parse on the fields of a custom component + self.TYPE_NAME_TO_MODEL = {cls.__name__: cls for cls in self.PYDANTIC_MODEL_TO_CONSTRUCTOR} + + def create_component(self, model_type: Type[BaseModel], component_definition: ComponentDefinition, config: Config) -> type: """ Takes a given Pydantic model type and Mapping representing a component definition and creates a declarative component and subcomponents which will be used at runtime. This is done by first parsing the mapping into a Pydantic model and then creating @@ -138,591 +201,541 @@ def create_component(model_type: Type[BaseModel], component_definition: Componen if not isinstance(declarative_component_model, model_type): raise ValueError(f"Expected {model_type.__name__} component, but received {declarative_component_model.__class__.__name__}") - return _create_component_from_model(model=declarative_component_model, config=config) + return self._create_component_from_model(model=declarative_component_model, config=config) + + def _create_component_from_model(self, model: BaseModel, config: Config, **kwargs) -> Any: + if model.__class__ not in self.PYDANTIC_MODEL_TO_CONSTRUCTOR: + raise ValueError(f"{model.__class__} with attributes {model} is not a valid component type") + component_constructor = self.PYDANTIC_MODEL_TO_CONSTRUCTOR.get(model.__class__) + return component_constructor(model=model, config=config, **kwargs) + @staticmethod + def create_added_field_definition(model: AddedFieldDefinitionModel, config: Config, **kwargs) -> AddedFieldDefinition: + interpolated_value = InterpolatedString.create(model.value, options=model.options) + return AddedFieldDefinition(path=model.path, value=interpolated_value, options=model.options) -def _create_component_from_model(model: BaseModel, config: Config, **kwargs) -> Any: - if model.__class__ not in PYDANTIC_MODEL_TO_CONSTRUCTOR: - raise ValueError(f"{model.__class__} with attributes {model} is not a valid component type") - component_constructor = PYDANTIC_MODEL_TO_CONSTRUCTOR.get(model.__class__) - return component_constructor(model=model, config=config, **kwargs) + def create_add_fields(self, model: AddFieldsModel, config: Config, **kwargs) -> AddFields: + added_field_definitions = [ + self._create_component_from_model(model=added_field_definition_model, config=config) + for added_field_definition_model in model.fields + ] + return AddFields(fields=added_field_definitions, options=model.options) + @staticmethod + def create_api_key_authenticator(model: ApiKeyAuthenticatorModel, config: Config, **kwargs) -> ApiKeyAuthenticator: + return ApiKeyAuthenticator(api_token=model.api_token, header=model.header, config=config, options=model.options) -def create_added_field_definition(model: AddedFieldDefinitionModel, config: Config, **kwargs) -> AddedFieldDefinition: - interpolated_value = InterpolatedString.create(model.value, options=model.options) - return AddedFieldDefinition(path=model.path, value=interpolated_value, options=model.options) + @staticmethod + def create_basic_http_authenticator(model: BasicHttpAuthenticatorModel, config: Config, **kwargs) -> BasicHttpAuthenticator: + return BasicHttpAuthenticator(password=model.password, username=model.username, config=config, options=model.options) + + @staticmethod + def create_bearer_authenticator(model: BearerAuthenticatorModel, config: Config, **kwargs) -> BearerAuthenticator: + return BearerAuthenticator( + api_token=model.api_token, + config=config, + options=model.options, + ) + def create_cartesian_product_slicer( + self, model: CartesianProductStreamSlicerModel, config: Config, **kwargs + ) -> CartesianProductStreamSlicer: + stream_slicers = [ + self._create_component_from_model(model=stream_slicer_model, config=config) for stream_slicer_model in model.stream_slicers + ] + return CartesianProductStreamSlicer(stream_slicers=stream_slicers, options=model.options) -def create_add_fields(model: AddFieldsModel, config: Config, **kwargs) -> AddFields: - added_field_definitions = [ - _create_component_from_model(model=added_field_definition_model, config=config) for added_field_definition_model in model.fields - ] - return AddFields(fields=added_field_definitions, options=model.options) + @staticmethod + def create_check_stream(model: CheckStreamModel, config: Config, **kwargs): + return CheckStream(stream_names=model.stream_names, options={}) + def create_composite_error_handler(self, model: CompositeErrorHandlerModel, config: Config, **kwargs) -> CompositeErrorHandler: + error_handlers = [ + self._create_component_from_model(model=error_handler_model, config=config) for error_handler_model in model.error_handlers + ] + return CompositeErrorHandler(error_handlers=error_handlers, options=model.options) -def create_api_key_authenticator(model: ApiKeyAuthenticatorModel, config: Config, **kwargs) -> ApiKeyAuthenticator: - return ApiKeyAuthenticator(api_token=model.api_token, header=model.header, config=config, options=model.options) + @staticmethod + def create_constant_backoff_strategy(model: ConstantBackoffStrategyModel, config: Config, **kwargs) -> ConstantBackoffStrategy: + return ConstantBackoffStrategy( + backoff_time_in_seconds=model.backoff_time_in_seconds, + config=config, + options=model.options, + ) + def create_cursor_pagination(self, model: CursorPaginationModel, config: Config, **kwargs) -> CursorPaginationStrategy: + if model.decoder: + decoder = self._create_component_from_model(model=model.decoder, config=config) + else: + decoder = JsonDecoder(options=model.options) + + return CursorPaginationStrategy( + cursor_value=model.cursor_value, + decoder=decoder, + page_size=model.page_size, + stop_condition=model.stop_condition, + config=config, + options=model.options, + ) -def create_basic_http_authenticator(model: BasicHttpAuthenticatorModel, config: Config, **kwargs) -> BasicHttpAuthenticator: - return BasicHttpAuthenticator(password=model.password, username=model.username, config=config, options=model.options) + def create_custom_component(self, model, config: Config, **kwargs) -> type: + """ + Generically creates a custom component based on the model type and a class_name reference to the custom Python class being + instantiated. Only the model's additional properties that match the custom class definition are passed to the constructor + :param model: The Pydantic model of the custom component being created + :param config: The custom defined connector config + :return: The declarative component built from the Pydantic model to be used at runtime + """ + custom_component_class = self._get_class_from_fully_qualified_class_name(model.class_name) + component_fields = get_type_hints(custom_component_class) + model_args = model.dict() + model_args["config"] = config + + # Pydantic is unable to parse a custom component's fields that are subcomponents into models because their fields and types are not + # defined in the schema. The fields and types are defined within the Python class implementation. Pydantic can only parse down to + # the custom component and this code performs a second parse to convert the sub-fields first into models, then declarative components + for model_field, model_value in model_args.items(): + # If a custom component field doesn't have a type set, we try to use the type hints to infer the type + if isinstance(model_value, dict) and "type" not in model_value and model_field in component_fields: + derived_type = self._derive_component_type_from_type_hints(component_fields.get(model_field)) + if derived_type: + model_value["type"] = derived_type + + if self._is_component(model_value): + model_args[model_field] = self._create_nested_component(model, model_field, model_value, config) + elif isinstance(model_value, list): + vals = [] + for v in model_value: + if isinstance(v, dict) and "type" not in v and model_field in component_fields: + derived_type = self._derive_component_type_from_type_hints(component_fields.get(model_field)) + if derived_type: + v["type"] = derived_type + if self._is_component(v): + vals.append(self._create_nested_component(model, model_field, v, config)) + else: + vals.append(v) + model_args[model_field] = vals + + kwargs = {class_field: model_args[class_field] for class_field in component_fields.keys() if class_field in model_args} + return custom_component_class(**kwargs) -def create_bearer_authenticator(model: BearerAuthenticatorModel, config: Config, **kwargs) -> BearerAuthenticator: - return BearerAuthenticator( - api_token=model.api_token, - config=config, - options=model.options, - ) + @staticmethod + def _get_class_from_fully_qualified_class_name(class_name: str) -> type: + split = class_name.split(".") + module = ".".join(split[:-1]) + class_name = split[-1] + return getattr(importlib.import_module(module), class_name) + @staticmethod + def _derive_component_type_from_type_hints(field_type: str) -> Optional[str]: + interface = field_type + while True: + origin = get_origin(interface) + if origin: + # Unnest types until we reach the raw type + # List[T] -> T + # Optional[List[T]] -> T + args = get_args(interface) + interface = args[0] + else: + break + if isinstance(interface, type) and not ModelToComponentFactory.is_builtin_type(interface): + return interface.__name__ + return None -def create_cartesian_product_slicer(model: CartesianProductStreamSlicerModel, config: Config, **kwargs) -> CartesianProductStreamSlicer: - stream_slicers = [ - _create_component_from_model(model=stream_slicer_model, config=config) for stream_slicer_model in model.stream_slicers - ] - return CartesianProductStreamSlicer(stream_slicers=stream_slicers, options=model.options) - - -def create_check_stream(model: CheckStreamModel, config: Config, **kwargs): - return CheckStream(stream_names=model.stream_names, options={}) - - -def create_composite_error_handler(model: CompositeErrorHandlerModel, config: Config, **kwargs) -> CompositeErrorHandler: - error_handlers = [ - _create_component_from_model(model=error_handler_model, config=config) for error_handler_model in model.error_handlers - ] - return CompositeErrorHandler(error_handlers=error_handlers, options=model.options) - - -def create_constant_backoff_strategy(model: ConstantBackoffStrategyModel, config: Config, **kwargs) -> ConstantBackoffStrategy: - return ConstantBackoffStrategy( - backoff_time_in_seconds=model.backoff_time_in_seconds, - config=config, - options=model.options, - ) - - -def create_cursor_pagination(model: CursorPaginationModel, config: Config, **kwargs) -> CursorPaginationStrategy: - if model.decoder: - decoder = _create_component_from_model(model=model.decoder, config=config) - else: - decoder = JsonDecoder(options=model.options) - - return CursorPaginationStrategy( - cursor_value=model.cursor_value, - decoder=decoder, - page_size=model.page_size, - stop_condition=model.stop_condition, - config=config, - options=model.options, - ) - - -def create_custom_component(model, config: Config, **kwargs) -> type: - """ - Generically creates a custom component based on the model type and a class_name reference to the custom Python class being - instantiated. Only the model's additional properties that match the custom class definition are passed to the constructor - :param model: The Pydantic model of the custom component being created - :param config: The custom defined connector config - :return: The declarative component built from the Pydantic model to be used at runtime - """ - - custom_component_class = _get_class_from_fully_qualified_class_name(model.class_name) - component_fields = get_type_hints(custom_component_class) - model_args = model.dict() - model_args["config"] = config - - # Pydantic is unable to parse a custom component's fields that are subcomponents into models because their fields and types are not - # defined in the schema. The fields and types are defined within the Python class implementation. Pydantic can only parse down to - # the custom component and this code performs a second parse to convert the sub-fields first into models, then declarative components - for model_field, model_value in model_args.items(): - # If a custom component field doesn't have a type set, we try to use the type hints to infer the type - if isinstance(model_value, dict) and "type" not in model_value and model_field in component_fields: - derived_type = _derive_component_type_from_type_hints(component_fields.get(model_field)) - if derived_type: - model_value["type"] = derived_type - - if _is_component(model_value): - model_args[model_field] = _create_nested_component(model, model_field, model_value, config) - elif isinstance(model_value, list): - vals = [] - for v in model_value: - if isinstance(v, dict) and "type" not in v and model_field in component_fields: - derived_type = _derive_component_type_from_type_hints(component_fields.get(model_field)) - if derived_type: - v["type"] = derived_type - if _is_component(v): - vals.append(_create_nested_component(model, model_field, v, config)) - else: - vals.append(v) - model_args[model_field] = vals - - kwargs = {class_field: model_args[class_field] for class_field in component_fields.keys() if class_field in model_args} - return custom_component_class(**kwargs) - - -def _get_class_from_fully_qualified_class_name(class_name: str) -> type: - split = class_name.split(".") - module = ".".join(split[:-1]) - class_name = split[-1] - return getattr(importlib.import_module(module), class_name) - - -def _derive_component_type_from_type_hints(field_type: str) -> Optional[str]: - interface = field_type - while True: - origin = get_origin(interface) - if origin: - # Unnest types until we reach the raw type - # List[T] -> T - # Optional[List[T]] -> T - args = get_args(interface) - interface = args[0] + @staticmethod + def is_builtin_type(cls) -> bool: + if not cls: + return False + return cls.__module__ == "builtins" + + def _create_nested_component(self, model, model_field: str, model_value: Any, config: Config) -> Any: + type_name = model_value.get("type", None) + if not type_name: + # If no type is specified, we can assume this is a dictionary object which can be returned instead of a subcomponent + return model_value + + model_type = self.TYPE_NAME_TO_MODEL.get(type_name, None) + if model_type: + parsed_model = model_type.parse_obj(model_value) + return self._create_component_from_model(model=parsed_model, config=config) else: - break - if isinstance(interface, type) and not is_builtin_type(interface): - return interface.__name__ - return None - - -def is_builtin_type(cls) -> bool: - if not cls: - return False - return cls.__module__ == "builtins" - - -def _create_nested_component(model, model_field: str, model_value: Any, config: Config) -> Any: - type_name = model_value.get("type", None) - if not type_name: - # If no type is specified, we can assume this is a dictionary object which can be returned instead of a subcomponent - return model_value - - model_type = TYPE_NAME_TO_MODEL.get(type_name, None) - if model_type: - parsed_model = model_type.parse_obj(model_value) - return _create_component_from_model(model=parsed_model, config=config) - else: - raise ValueError( - f"Error creating custom component {model.class_name}. Subcomponent creation has not been implemented for '{type_name}'" + raise ValueError( + f"Error creating custom component {model.class_name}. Subcomponent creation has not been implemented for '{type_name}'" + ) + + @staticmethod + def _is_component(model_value: Any) -> bool: + return isinstance(model_value, dict) and model_value.get("type") + + def create_datetime_stream_slicer(self, model: DatetimeStreamSlicerModel, config: Config, **kwargs) -> DatetimeStreamSlicer: + start_datetime = ( + model.start_datetime if isinstance(model.start_datetime, str) else self.create_min_max_datetime(model.start_datetime, config) + ) + end_datetime = ( + model.end_datetime if isinstance(model.end_datetime, str) else self.create_min_max_datetime(model.end_datetime, config) ) + end_time_option = ( + RequestOption( + inject_into=RequestOptionType(model.end_time_option.inject_into.value), + field_name=model.end_time_option.field_name, + options=model.options, + ) + if model.end_time_option + else None + ) + start_time_option = ( + RequestOption( + inject_into=RequestOptionType(model.start_time_option.inject_into.value), + field_name=model.start_time_option.field_name, + options=model.options, + ) + if model.start_time_option + else None + ) -def _is_component(model_value: Any) -> bool: - return isinstance(model_value, dict) and model_value.get("type") + return DatetimeStreamSlicer( + cursor_field=model.cursor_field, + cursor_granularity=model.cursor_granularity, + datetime_format=model.datetime_format, + end_datetime=end_datetime, + start_datetime=start_datetime, + step=model.step, + end_time_option=end_time_option, + lookback_window=model.lookback_window, + start_time_option=start_time_option, + stream_state_field_end=model.stream_state_field_end, + stream_state_field_start=model.stream_state_field_start, + config=config, + options=model.options, + ) + + def create_declarative_stream(self, model: DeclarativeStreamModel, config: Config, **kwargs) -> DeclarativeStream: + retriever = self._create_component_from_model(model=model.retriever, config=config) + + if model.schema_loader: + schema_loader = self._create_component_from_model(model=model.schema_loader, config=config) + else: + options = model.options or {} + if "name" not in options: + options["name"] = model.name + schema_loader = DefaultSchemaLoader(config=config, options=options) + + transformations = [] + if model.transformations: + for transformation_model in model.transformations: + transformations.append(self._create_component_from_model(model=transformation_model, config=config)) + return DeclarativeStream( + checkpoint_interval=model.checkpoint_interval, + name=model.name, + primary_key=model.primary_key, + retriever=retriever, + schema_loader=schema_loader, + stream_cursor_field=model.stream_cursor_field or [], + transformations=transformations, + config=config, + options={}, + ) + def create_default_error_handler(self, model: DefaultErrorHandlerModel, config: Config, **kwargs) -> DefaultErrorHandler: + backoff_strategies = [] + if model.backoff_strategies: + for backoff_strategy_model in model.backoff_strategies: + backoff_strategies.append(self._create_component_from_model(model=backoff_strategy_model, config=config)) + else: + backoff_strategies.append(DEFAULT_BACKOFF_STRATEGY(config=config, options=model.options)) -def create_datetime_stream_slicer(model: DatetimeStreamSlicerModel, config: Config, **kwargs) -> DatetimeStreamSlicer: - start_datetime = ( - model.start_datetime if isinstance(model.start_datetime, str) else create_min_max_datetime(model.start_datetime, config) - ) - end_datetime = model.end_datetime if isinstance(model.end_datetime, str) else create_min_max_datetime(model.end_datetime, config) + response_filters = [] + if model.response_filters: + for response_filter_model in model.response_filters: + response_filters.append(self._create_component_from_model(model=response_filter_model, config=config)) + else: + response_filters.append( + HttpResponseFilter( + ResponseAction.RETRY, http_codes=HttpResponseFilter.DEFAULT_RETRIABLE_ERRORS, config=config, options=model.options + ) + ) + response_filters.append(HttpResponseFilter(ResponseAction.IGNORE, config=config, options=model.options)) - end_time_option = ( - RequestOption( - inject_into=RequestOptionType(model.end_time_option.inject_into.value), - field_name=model.end_time_option.field_name, + return DefaultErrorHandler( + backoff_strategies=backoff_strategies, + max_retries=model.max_retries, + response_filters=response_filters, + config=config, options=model.options, ) - if model.end_time_option - else None - ) - start_time_option = ( - RequestOption( - inject_into=RequestOptionType(model.start_time_option.inject_into.value), - field_name=model.start_time_option.field_name, + + def create_default_paginator(self, model: DefaultPaginatorModel, config: Config, **kwargs) -> DefaultPaginator: + decoder = self._create_component_from_model(model=model.decoder, config=config) if model.decoder else JsonDecoder(options={}) + page_size_option = ( + self._create_component_from_model(model=model.page_size_option, config=config) if model.page_size_option else None + ) + page_token_option = ( + self._create_component_from_model(model=model.page_token_option, config=config) if model.page_token_option else None + ) + pagination_strategy = self._create_component_from_model(model=model.pagination_strategy, config=config) + + paginator = DefaultPaginator( + decoder=decoder, + page_size_option=page_size_option, + page_token_option=page_token_option, + pagination_strategy=pagination_strategy, + url_base=model.url_base, + config=config, options=model.options, ) - if model.start_time_option - else None - ) - - return DatetimeStreamSlicer( - cursor_field=model.cursor_field, - cursor_granularity=model.cursor_granularity, - datetime_format=model.datetime_format, - end_datetime=end_datetime, - start_datetime=start_datetime, - step=model.step, - end_time_option=end_time_option, - lookback_window=model.lookback_window, - start_time_option=start_time_option, - stream_state_field_end=model.stream_state_field_end, - stream_state_field_start=model.stream_state_field_start, - config=config, - options=model.options, - ) - - -def create_declarative_stream(model: DeclarativeStreamModel, config: Config, **kwargs) -> DeclarativeStream: - retriever = _create_component_from_model(model=model.retriever, config=config) - - if model.schema_loader: - schema_loader = _create_component_from_model(model=model.schema_loader, config=config) - else: - options = model.options or {} - if "name" not in options: - options["name"] = model.name - schema_loader = DefaultSchemaLoader(config=config, options=options) - - transformations = [] - if model.transformations: - for transformation_model in model.transformations: - transformations.append(_create_component_from_model(model=transformation_model, config=config)) - return DeclarativeStream( - checkpoint_interval=model.checkpoint_interval, - name=model.name, - primary_key=model.primary_key, - retriever=retriever, - schema_loader=schema_loader, - stream_cursor_field=model.stream_cursor_field or [], - transformations=transformations, - config=config, - options={}, - ) - - -def create_default_error_handler(model: DefaultErrorHandlerModel, config: Config, **kwargs) -> DefaultErrorHandler: - backoff_strategies = [] - if model.backoff_strategies: - for backoff_strategy_model in model.backoff_strategies: - backoff_strategies.append(_create_component_from_model(model=backoff_strategy_model, config=config)) - else: - backoff_strategies.append(DEFAULT_BACKOFF_STRATEGY(config=config, options=model.options)) - - response_filters = [] - if model.response_filters: - for response_filter_model in model.response_filters: - response_filters.append(_create_component_from_model(model=response_filter_model, config=config)) - else: - response_filters.append( - HttpResponseFilter( - ResponseAction.RETRY, http_codes=HttpResponseFilter.DEFAULT_RETRIABLE_ERRORS, config=config, options=model.options + if self._limit_pages_fetched_per_slice: + return PaginatorTestReadDecorator(paginator, self._limit_pages_fetched_per_slice) + return paginator + + def create_dpath_extractor(self, model: DpathExtractorModel, config: Config, **kwargs) -> DpathExtractor: + decoder = self._create_component_from_model(model.decoder, config=config) if model.decoder else JsonDecoder(options={}) + return DpathExtractor(decoder=decoder, field_pointer=model.field_pointer, config=config, options=model.options) + + @staticmethod + def create_exponential_backoff_strategy(model: ExponentialBackoffStrategyModel, config: Config) -> ExponentialBackoffStrategy: + return ExponentialBackoffStrategy(factor=model.factor, options=model.options, config=config) + + def create_http_requester(self, model: HttpRequesterModel, config: Config, **kwargs) -> HttpRequester: + authenticator = self._create_component_from_model(model=model.authenticator, config=config) if model.authenticator else None + error_handler = ( + self._create_component_from_model(model=model.error_handler, config=config) + if model.error_handler + else DefaultErrorHandler(backoff_strategies=[], response_filters=[], config=config, options=model.options) + ) + request_options_provider = ( + self._create_component_from_model(model=model.request_options_provider, config=config) + if model.request_options_provider + else None + ) + + return HttpRequester( + name=model.name, + url_base=model.url_base, + path=model.path, + authenticator=authenticator, + error_handler=error_handler, + http_method=model.http_method, + request_options_provider=request_options_provider, + config=config, + options=model.options, + ) + + @staticmethod + def create_http_response_filter(model: HttpResponseFilterModel, config: Config, **kwargs) -> HttpResponseFilter: + action = ResponseAction(model.action.value) + http_codes = ( + set(model.http_codes) if model.http_codes else set() + ) # JSON schema notation has no set data type. The schema enforces an array of unique elements + + return HttpResponseFilter( + action=action, + error_message=model.error_message or "", + error_message_contains=model.error_message_contains, + http_codes=http_codes, + predicate=model.predicate or "", + config=config, + options=model.options, + ) + + @staticmethod + def create_inline_schema_loader(model: InlineSchemaLoaderModel, config: Config, **kwargs) -> InlineSchemaLoader: + return InlineSchemaLoader(schema=model.schema_, options={}) + + @staticmethod + def create_interpolated_request_options_provider( + model: InterpolatedRequestOptionsProviderModel, config: Config, **kwargs + ) -> InterpolatedRequestOptionsProvider: + return InterpolatedRequestOptionsProvider( + request_body_data=model.request_body_data, + request_body_json=model.request_body_json, + request_headers=model.request_headers, + request_parameters=model.request_parameters, + config=config, + options=model.options, + ) + + @staticmethod + def create_json_decoder(model: JsonDecoderModel, config: Config, **kwargs) -> JsonDecoder: + return JsonDecoder(options={}) + + @staticmethod + def create_json_file_schema_loader(model: JsonFileSchemaLoaderModel, config: Config, **kwargs) -> JsonFileSchemaLoader: + return JsonFileSchemaLoader(file_path=model.file_path, config=config, options=model.options) + + @staticmethod + def create_list_stream_slicer(model: ListStreamSlicerModel, config: Config, **kwargs) -> ListStreamSlicer: + request_option = ( + RequestOption( + inject_into=RequestOptionType(model.request_option.inject_into.value), + field_name=model.request_option.field_name, + options=model.options, ) + if model.request_option + else None ) - response_filters.append(HttpResponseFilter(ResponseAction.IGNORE, config=config, options=model.options)) - - return DefaultErrorHandler( - backoff_strategies=backoff_strategies, - max_retries=model.max_retries, - response_filters=response_filters, - config=config, - options=model.options, - ) - - -def create_default_paginator(model: DefaultPaginatorModel, config: Config, **kwargs) -> DefaultPaginator: - decoder = _create_component_from_model(model=model.decoder, config=config) if model.decoder else JsonDecoder(options={}) - page_size_option = _create_component_from_model(model=model.page_size_option, config=config) if model.page_size_option else None - page_token_option = _create_component_from_model(model=model.page_token_option, config=config) if model.page_token_option else None - pagination_strategy = _create_component_from_model(model=model.pagination_strategy, config=config) - - return DefaultPaginator( - decoder=decoder, - page_size_option=page_size_option, - page_token_option=page_token_option, - pagination_strategy=pagination_strategy, - url_base=model.url_base, - config=config, - options=model.options, - ) - - -def create_dpath_extractor(model: DpathExtractorModel, config: Config, **kwargs) -> DpathExtractor: - decoder = _create_component_from_model(model.decoder, config=config) if model.decoder else JsonDecoder(options={}) - return DpathExtractor(decoder=decoder, field_pointer=model.field_pointer, config=config, options=model.options) - - -def create_exponential_backoff_strategy(model: ExponentialBackoffStrategyModel, config: Config) -> ExponentialBackoffStrategy: - return ExponentialBackoffStrategy(factor=model.factor, options=model.options, config=config) - - -def create_http_requester(model: HttpRequesterModel, config: Config, **kwargs) -> HttpRequester: - authenticator = _create_component_from_model(model=model.authenticator, config=config) if model.authenticator else None - error_handler = ( - _create_component_from_model(model=model.error_handler, config=config) - if model.error_handler - else DefaultErrorHandler(backoff_strategies=[], response_filters=[], config=config, options=model.options) - ) - request_options_provider = ( - _create_component_from_model(model=model.request_options_provider, config=config) if model.request_options_provider else None - ) - - return HttpRequester( - name=model.name, - url_base=model.url_base, - path=model.path, - authenticator=authenticator, - error_handler=error_handler, - http_method=model.http_method, - request_options_provider=request_options_provider, - config=config, - options=model.options, - ) - - -def create_http_response_filter(model: HttpResponseFilterModel, config: Config, **kwargs) -> HttpResponseFilter: - action = ResponseAction(model.action.value) - http_codes = ( - set(model.http_codes) if model.http_codes else set() - ) # JSON schema notation has no set data type. The schema enforces an array of unique elements - - return HttpResponseFilter( - action=action, - error_message=model.error_message or "", - error_message_contains=model.error_message_contains, - http_codes=http_codes, - predicate=model.predicate or "", - config=config, - options=model.options, - ) - - -def create_inline_schema_loader(model: InlineSchemaLoaderModel, config: Config, **kwargs) -> InlineSchemaLoader: - return InlineSchemaLoader(schema=model.schema_, options={}) - - -def create_interpolated_request_options_provider( - model: InterpolatedRequestOptionsProviderModel, config: Config, **kwargs -) -> InterpolatedRequestOptionsProvider: - return InterpolatedRequestOptionsProvider( - request_body_data=model.request_body_data, - request_body_json=model.request_body_json, - request_headers=model.request_headers, - request_parameters=model.request_parameters, - config=config, - options=model.options, - ) - - -def create_json_decoder(model: JsonDecoderModel, config: Config, **kwargs) -> JsonDecoder: - return JsonDecoder(options={}) - - -def create_json_file_schema_loader(model: JsonFileSchemaLoaderModel, config: Config, **kwargs) -> JsonFileSchemaLoader: - return JsonFileSchemaLoader(file_path=model.file_path, config=config, options=model.options) - - -def create_list_stream_slicer(model: ListStreamSlicerModel, config: Config, **kwargs) -> ListStreamSlicer: - request_option = ( - RequestOption( - inject_into=RequestOptionType(model.request_option.inject_into.value), - field_name=model.request_option.field_name, + return ListStreamSlicer( + cursor_field=model.cursor_field, + request_option=request_option, + slice_values=model.slice_values, + config=config, + options=model.options, + ) + + @staticmethod + def create_min_max_datetime(model: MinMaxDatetimeModel, config: Config, **kwargs) -> MinMaxDatetime: + return MinMaxDatetime( + datetime=model.datetime, + datetime_format=model.datetime_format, + max_datetime=model.max_datetime, + min_datetime=model.min_datetime, + options=model.options, + ) + + @staticmethod + def create_no_auth(model: NoAuthModel, config: Config, **kwargs) -> NoAuth: + return NoAuth(options=model.options) + + @staticmethod + def create_no_pagination(model: NoPaginationModel, config: Config, **kwargs) -> NoPagination: + return NoPagination(options={}) + + @staticmethod + def create_oauth_authenticator(model: OAuthAuthenticatorModel, config: Config, **kwargs) -> DeclarativeOauth2Authenticator: + return DeclarativeOauth2Authenticator( + access_token_name=model.access_token_name, + client_id=model.client_id, + client_secret=model.client_secret, + expires_in_name=model.expires_in_name, + grant_type=model.grant_type, + refresh_request_body=model.refresh_request_body, + refresh_token=model.refresh_token, + scopes=model.scopes, + token_expiry_date=model.token_expiry_date, + token_expiry_date_format=model.token_expiry_date_format, + token_refresh_endpoint=model.token_refresh_endpoint, + config=config, + options=model.options, + ) + + @staticmethod + def create_offset_increment(model: OffsetIncrementModel, config: Config, **kwargs) -> OffsetIncrement: + return OffsetIncrement(page_size=model.page_size, config=config, options=model.options) + + @staticmethod + def create_page_increment(model: PageIncrementModel, config: Config, **kwargs) -> PageIncrement: + return PageIncrement(page_size=model.page_size, start_from_page=model.start_from_page, options=model.options) + + def create_parent_stream_config(self, model: ParentStreamConfigModel, config: Config, **kwargs) -> ParentStreamConfig: + declarative_stream = self._create_component_from_model(model.stream, config=config) + request_option = self._create_component_from_model(model.request_option, config=config) if model.request_option else None + return ParentStreamConfig( + parent_key=model.parent_key, + request_option=request_option, + stream=declarative_stream, + stream_slice_field=model.stream_slice_field, options=model.options, ) - if model.request_option - else None - ) - return ListStreamSlicer( - cursor_field=model.cursor_field, - request_option=request_option, - slice_values=model.slice_values, - config=config, - options=model.options, - ) + @staticmethod + def create_record_filter(model: RecordFilterModel, config: Config, **kwargs) -> RecordFilter: + return RecordFilter(condition=model.condition, config=config, options=model.options) + + @staticmethod + def create_request_option(model: RequestOptionModel, config: Config, **kwargs) -> RequestOption: + inject_into = RequestOptionType(model.inject_into.value) + return RequestOption(field_name=model.field_name, inject_into=inject_into, options={}) + + def create_record_selector(self, model: RecordSelectorModel, config: Config, **kwargs) -> RecordSelector: + extractor = self._create_component_from_model(model=model.extractor, config=config) + record_filter = self._create_component_from_model(model.record_filter, config=config) if model.record_filter else None + + return RecordSelector(extractor=extractor, record_filter=record_filter, options=model.options) -def create_min_max_datetime(model: MinMaxDatetimeModel, config: Config, **kwargs) -> MinMaxDatetime: - return MinMaxDatetime( - datetime=model.datetime, - datetime_format=model.datetime_format, - max_datetime=model.max_datetime, - min_datetime=model.min_datetime, - options=model.options, - ) - - -def create_no_auth(model: NoAuthModel, config: Config, **kwargs) -> NoAuth: - return NoAuth(options=model.options) - - -def create_no_pagination(model: NoPaginationModel, config: Config, **kwargs) -> NoPagination: - return NoPagination(options={}) - - -def create_oauth_authenticator(model: OAuthAuthenticatorModel, config: Config, **kwargs) -> DeclarativeOauth2Authenticator: - return DeclarativeOauth2Authenticator( - access_token_name=model.access_token_name, - client_id=model.client_id, - client_secret=model.client_secret, - expires_in_name=model.expires_in_name, - grant_type=model.grant_type, - refresh_request_body=model.refresh_request_body, - refresh_token=model.refresh_token, - scopes=model.scopes, - token_expiry_date=model.token_expiry_date, - token_expiry_date_format=model.token_expiry_date_format, - token_refresh_endpoint=model.token_refresh_endpoint, - config=config, - options=model.options, - ) - - -def create_offset_increment(model: OffsetIncrementModel, config: Config, **kwargs) -> OffsetIncrement: - return OffsetIncrement(page_size=model.page_size, config=config, options=model.options) - - -def create_page_increment(model: PageIncrementModel, config: Config, **kwargs) -> PageIncrement: - return PageIncrement(page_size=model.page_size, start_from_page=model.start_from_page, options=model.options) - - -def create_parent_stream_config(model: ParentStreamConfigModel, config: Config, **kwargs) -> ParentStreamConfig: - declarative_stream = _create_component_from_model(model.stream, config=config) - request_option = _create_component_from_model(model.request_option, config=config) if model.request_option else None - return ParentStreamConfig( - parent_key=model.parent_key, - request_option=request_option, - stream=declarative_stream, - stream_slice_field=model.stream_slice_field, - options=model.options, - ) - - -def create_record_filter(model: RecordFilterModel, config: Config, **kwargs) -> RecordFilter: - return RecordFilter(condition=model.condition, config=config, options=model.options) - - -def create_request_option(model: RequestOptionModel, config: Config, **kwargs) -> RequestOption: - inject_into = RequestOptionType(model.inject_into.value) - return RequestOption(field_name=model.field_name, inject_into=inject_into, options={}) - - -def create_record_selector(model: RecordSelectorModel, config: Config, **kwargs) -> RecordSelector: - extractor = _create_component_from_model(model=model.extractor, config=config) - record_filter = _create_component_from_model(model.record_filter, config=config) if model.record_filter else None - - return RecordSelector(extractor=extractor, record_filter=record_filter, options=model.options) - - -def create_remove_fields(model: RemoveFieldsModel, config: Config, **kwargs) -> RemoveFields: - return RemoveFields(field_pointers=model.field_pointers, options={}) - - -def create_session_token_authenticator(model: SessionTokenAuthenticatorModel, config: Config, **kwargs) -> SessionTokenAuthenticator: - return SessionTokenAuthenticator( - api_url=model.api_url, - header=model.header, - login_url=model.login_url, - password=model.password, - session_token=model.session_token, - session_token_response_key=model.session_token_response_key, - username=model.username, - validate_session_url=model.validate_session_url, - config=config, - options=model.options, - ) - - -def create_simple_retriever(model: SimpleRetrieverModel, config: Config, **kwargs) -> SimpleRetriever: - requester = _create_component_from_model(model=model.requester, config=config) - record_selector = _create_component_from_model(model=model.record_selector, config=config) - paginator = ( - _create_component_from_model(model=model.paginator, config=config, url_base=model.requester.url_base) - if model.paginator - else NoPagination(options={}) - ) - stream_slicer = ( - _create_component_from_model(model=model.stream_slicer, config=config) if model.stream_slicer else SingleSlice(options={}) - ) - - return SimpleRetriever( - name=model.name, - paginator=paginator, - primary_key=model.primary_key.__root__ if model.primary_key else None, - requester=requester, - record_selector=record_selector, - stream_slicer=stream_slicer, - config=config, - options=model.options, - ) + @staticmethod + def create_remove_fields(model: RemoveFieldsModel, config: Config, **kwargs) -> RemoveFields: + return RemoveFields(field_pointers=model.field_pointers, options={}) - -def create_single_slice(model: SingleSliceModel, config: Config, **kwargs) -> SingleSlice: - return SingleSlice(options={}) - - -def create_spec(model: SpecModel, config: Config, **kwargs) -> Spec: - return Spec(connection_specification=model.connection_specification, documentation_url=model.documentation_url, options={}) - - -def create_substream_slicer(model: SubstreamSlicerModel, config: Config, **kwargs) -> SubstreamSlicer: - parent_stream_configs = [] - if model.parent_stream_configs: - parent_stream_configs.extend( - [ - _create_component_from_model(model=parent_stream_config, config=config) - for parent_stream_config in model.parent_stream_configs - ] + @staticmethod + def create_session_token_authenticator(model: SessionTokenAuthenticatorModel, config: Config, **kwargs) -> SessionTokenAuthenticator: + return SessionTokenAuthenticator( + api_url=model.api_url, + header=model.header, + login_url=model.login_url, + password=model.password, + session_token=model.session_token, + session_token_response_key=model.session_token_response_key, + username=model.username, + validate_session_url=model.validate_session_url, + config=config, + options=model.options, ) - return SubstreamSlicer(parent_stream_configs=parent_stream_configs, options=model.options) - - -def create_wait_time_from_header(model: WaitTimeFromHeaderModel, config: Config, **kwargs) -> WaitTimeFromHeaderBackoffStrategy: - return WaitTimeFromHeaderBackoffStrategy(header=model.header, options=model.options, config=config, regex=model.regex) - - -def create_wait_until_time_from_header( - model: WaitUntilTimeFromHeaderModel, config: Config, **kwargs -) -> WaitUntilTimeFromHeaderBackoffStrategy: - return WaitUntilTimeFromHeaderBackoffStrategy( - header=model.header, options=model.options, config=config, min_wait=model.min_wait, regex=model.regex - ) - - -PYDANTIC_MODEL_TO_CONSTRUCTOR: [Type[BaseModel], Callable] = { - AddedFieldDefinitionModel: create_added_field_definition, - AddFieldsModel: create_add_fields, - ApiKeyAuthenticatorModel: create_api_key_authenticator, - BasicHttpAuthenticatorModel: create_basic_http_authenticator, - BearerAuthenticatorModel: create_bearer_authenticator, - CheckStreamModel: create_check_stream, - CartesianProductStreamSlicerModel: create_cartesian_product_slicer, - CompositeErrorHandlerModel: create_composite_error_handler, - ConstantBackoffStrategyModel: create_constant_backoff_strategy, - CursorPaginationModel: create_cursor_pagination, - CustomAuthenticatorModel: create_custom_component, - CustomBackoffStrategyModel: create_custom_component, - CustomErrorHandlerModel: create_custom_component, - CustomRecordExtractorModel: create_custom_component, - CustomRequesterModel: create_custom_component, - CustomRequestOptionsProviderModel: create_custom_component, # todo: Remove later when we deprecate request providers from interface - CustomRetrieverModel: create_custom_component, - CustomPaginationStrategyModel: create_custom_component, - CustomStreamSlicerModel: create_custom_component, - CustomTransformationModel: create_custom_component, - DatetimeStreamSlicerModel: create_datetime_stream_slicer, - DeclarativeStreamModel: create_declarative_stream, - DefaultErrorHandlerModel: create_default_error_handler, - DefaultPaginatorModel: create_default_paginator, - DpathExtractorModel: create_dpath_extractor, - ExponentialBackoffStrategyModel: create_exponential_backoff_strategy, - HttpRequesterModel: create_http_requester, - HttpResponseFilterModel: create_http_response_filter, - InlineSchemaLoaderModel: create_inline_schema_loader, - InterpolatedRequestOptionsProviderModel: create_interpolated_request_options_provider, - JsonDecoderModel: create_json_decoder, - JsonFileSchemaLoaderModel: create_json_file_schema_loader, - ListStreamSlicerModel: create_list_stream_slicer, - MinMaxDatetimeModel: create_min_max_datetime, - NoAuthModel: create_no_auth, - NoPaginationModel: create_no_pagination, - OAuthAuthenticatorModel: create_oauth_authenticator, - OffsetIncrementModel: create_offset_increment, - PageIncrementModel: create_page_increment, - ParentStreamConfigModel: create_parent_stream_config, - RecordFilterModel: create_record_filter, - RecordSelectorModel: create_record_selector, - RemoveFieldsModel: create_remove_fields, - RequestOptionModel: create_request_option, - SessionTokenAuthenticatorModel: create_session_token_authenticator, - SimpleRetrieverModel: create_simple_retriever, - SingleSliceModel: create_single_slice, - SpecModel: create_spec, - SubstreamSlicerModel: create_substream_slicer, - WaitTimeFromHeaderModel: create_wait_time_from_header, - WaitUntilTimeFromHeaderModel: create_wait_until_time_from_header, -} - - -# Needed for the case where we need to perform a second parse on the fields of a custom component -TYPE_NAME_TO_MODEL = {cls.__name__: cls for cls in PYDANTIC_MODEL_TO_CONSTRUCTOR} + def create_simple_retriever(self, model: SimpleRetrieverModel, config: Config, **kwargs) -> SimpleRetriever: + requester = self._create_component_from_model(model=model.requester, config=config) + record_selector = self._create_component_from_model(model=model.record_selector, config=config) + paginator = ( + self._create_component_from_model(model=model.paginator, config=config, url_base=model.requester.url_base) + if model.paginator + else NoPagination(options={}) + ) + stream_slicer = ( + self._create_component_from_model(model=model.stream_slicer, config=config) if model.stream_slicer else SingleSlice(options={}) + ) + + if self._limit_slices_fetched: + return SimpleRetrieverTestReadDecorator( + name=model.name, + paginator=paginator, + primary_key=model.primary_key.__root__ if model.primary_key else None, + requester=requester, + record_selector=record_selector, + stream_slicer=stream_slicer, + config=config, + maximum_number_of_slices=self._limit_slices_fetched, + options=model.options, + ) + return SimpleRetriever( + name=model.name, + paginator=paginator, + primary_key=model.primary_key.__root__ if model.primary_key else None, + requester=requester, + record_selector=record_selector, + stream_slicer=stream_slicer, + config=config, + options=model.options, + ) + + @staticmethod + def create_single_slice(model: SingleSliceModel, config: Config, **kwargs) -> SingleSlice: + return SingleSlice(options={}) + + @staticmethod + def create_spec(model: SpecModel, config: Config, **kwargs) -> Spec: + return Spec(connection_specification=model.connection_specification, documentation_url=model.documentation_url, options={}) + + def create_substream_slicer(self, model: SubstreamSlicerModel, config: Config, **kwargs) -> SubstreamSlicer: + parent_stream_configs = [] + if model.parent_stream_configs: + parent_stream_configs.extend( + [ + self._create_component_from_model(model=parent_stream_config, config=config) + for parent_stream_config in model.parent_stream_configs + ] + ) + + return SubstreamSlicer(parent_stream_configs=parent_stream_configs, options=model.options) + + @staticmethod + def create_wait_time_from_header(model: WaitTimeFromHeaderModel, config: Config, **kwargs) -> WaitTimeFromHeaderBackoffStrategy: + return WaitTimeFromHeaderBackoffStrategy(header=model.header, options=model.options, config=config, regex=model.regex) + + @staticmethod + def create_wait_until_time_from_header( + model: WaitUntilTimeFromHeaderModel, config: Config, **kwargs + ) -> WaitUntilTimeFromHeaderBackoffStrategy: + return WaitUntilTimeFromHeaderBackoffStrategy( + header=model.header, options=model.options, config=config, min_wait=model.min_wait, regex=model.regex + ) diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py index c8bd6fd13ffdb..cd569f52abcce 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/__init__.py @@ -2,9 +2,9 @@ # Copyright (c) 2022 Airbyte, Inc., all rights reserved. # -from airbyte_cdk.sources.declarative.requesters.paginators.default_paginator import DefaultPaginator +from airbyte_cdk.sources.declarative.requesters.paginators.default_paginator import DefaultPaginator, PaginatorTestReadDecorator from airbyte_cdk.sources.declarative.requesters.paginators.no_pagination import NoPagination from airbyte_cdk.sources.declarative.requesters.paginators.paginator import Paginator from airbyte_cdk.sources.declarative.requesters.paginators.strategies.pagination_strategy import PaginationStrategy -__all__ = ["DefaultPaginator", "NoPagination", "PaginationStrategy", "Paginator"] +__all__ = ["DefaultPaginator", "NoPagination", "PaginationStrategy", "Paginator", "PaginatorTestReadDecorator"] diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py index 2ef4fcd9d672a..ed87e6a070874 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/default_paginator.py @@ -160,3 +160,69 @@ def _get_request_options(self, option_type: RequestOptionType) -> Mapping[str, A if option_type != RequestOptionType.path: options[self.page_size_option.field_name] = self.pagination_strategy.get_page_size() return options + + +class PaginatorTestReadDecorator(Paginator): + """ + In some cases, we want to limit the number of requests that are made to the backend source. This class allows for limiting the number of + pages that are queried throughout a read command. + """ + + _PAGE_COUNT_BEFORE_FIRST_NEXT_CALL = 1 + + def __init__(self, decorated, maximum_number_of_pages: int = 5): + if maximum_number_of_pages and maximum_number_of_pages < 1: + raise ValueError(f"The maximum number of pages on a test read needs to be strictly positive. Got {maximum_number_of_pages}") + self._maximum_number_of_pages = maximum_number_of_pages + self._decorated = decorated + self._page_count = self._PAGE_COUNT_BEFORE_FIRST_NEXT_CALL + + def next_page_token(self, response: requests.Response, last_records: List[Mapping[str, Any]]) -> Optional[Mapping[str, Any]]: + if self._page_count >= self._maximum_number_of_pages: + return None + + self._page_count += 1 + return self._decorated.next_page_token(response, last_records) + + def path(self): + return self._decorated.path() + + def get_request_params( + self, + *, + stream_state: Optional[StreamState] = None, + stream_slice: Optional[StreamSlice] = None, + next_page_token: Optional[Mapping[str, Any]] = None, + ) -> Mapping[str, Any]: + return self._decorated.get_request_params(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token) + + def get_request_headers( + self, + *, + stream_state: Optional[StreamState] = None, + stream_slice: Optional[StreamSlice] = None, + next_page_token: Optional[Mapping[str, Any]] = None, + ) -> Mapping[str, str]: + return self._decorated.get_request_headers(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token) + + def get_request_body_data( + self, + *, + stream_state: Optional[StreamState] = None, + stream_slice: Optional[StreamSlice] = None, + next_page_token: Optional[Mapping[str, Any]] = None, + ) -> Mapping[str, Any]: + return self._decorated.get_request_body_data(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token) + + def get_request_body_json( + self, + *, + stream_state: Optional[StreamState] = None, + stream_slice: Optional[StreamSlice] = None, + next_page_token: Optional[Mapping[str, Any]] = None, + ) -> Mapping[str, Any]: + return self._decorated.get_request_body_json(stream_state=stream_state, stream_slice=stream_slice, next_page_token=next_page_token) + + def reset(self): + self._decorated.reset() + self._page_count = self._PAGE_COUNT_BEFORE_FIRST_NEXT_CALL diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py index bd96fc27b153e..01d8d01e768bf 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/requesters/paginators/paginator.py @@ -2,7 +2,7 @@ # Copyright (c) 2022 Airbyte, Inc., all rights reserved. # -from abc import abstractmethod +from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Any, List, Mapping, Optional @@ -12,7 +12,7 @@ @dataclass -class Paginator(RequestOptionsProvider, JsonSchemaMixin): +class Paginator(ABC, RequestOptionsProvider, JsonSchemaMixin): """ Defines the token to use to fetch the next page of records from the API. diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/retrievers/__init__.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/retrievers/__init__.py index 9c47818b3e725..a160e9d27da7b 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/retrievers/__init__.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/retrievers/__init__.py @@ -3,6 +3,6 @@ # from airbyte_cdk.sources.declarative.retrievers.retriever import Retriever -from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever +from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetriever, SimpleRetrieverTestReadDecorator -__all__ = ["Retriever", "SimpleRetriever"] +__all__ = ["Retriever", "SimpleRetriever", "SimpleRetrieverTestReadDecorator"] diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py index 65128a3494832..049b4af70a476 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/retrievers/simple_retriever.py @@ -5,6 +5,7 @@ import json import logging from dataclasses import InitVar, dataclass, field +from itertools import islice from json import JSONDecodeError from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Union @@ -416,6 +417,28 @@ def _parse_records_and_emit_request_and_responses(self, request, response, strea yield from self.parse_response(response, stream_slice=stream_slice, stream_state=stream_state) +@dataclass +class SimpleRetrieverTestReadDecorator(SimpleRetriever): + """ + In some cases, we want to limit the number of requests that are made to the backend source. This class allows for limiting the number of + slices that are queried throughout a read command. + """ + + maximum_number_of_slices: int = 5 + + def __post_init__(self, options: Mapping[str, Any]): + super().__post_init__(options) + if self.maximum_number_of_slices and self.maximum_number_of_slices < 1: + raise ValueError( + f"The maximum number of slices on a test read needs to be strictly positive. Got {self.maximum_number_of_slices}" + ) + + def stream_slices( + self, *, sync_mode: SyncMode, cursor_field: List[str] = None, stream_state: Optional[StreamState] = None + ) -> Iterable[Optional[Mapping[str, Any]]]: + return islice(super().stream_slices(sync_mode=sync_mode, stream_state=stream_state), self.maximum_number_of_slices) + + def _prepared_request_to_airbyte_message(request: requests.PreparedRequest) -> AirbyteMessage: # FIXME: this should return some sort of trace message request_dict = { diff --git a/airbyte-cdk/python/setup.py b/airbyte-cdk/python/setup.py index ccb663e991ba7..8424ac5cb726e 100644 --- a/airbyte-cdk/python/setup.py +++ b/airbyte-cdk/python/setup.py @@ -15,7 +15,7 @@ setup( name="airbyte-cdk", - version="0.22.0", + version="0.23.0", description="A framework for writing Airbyte Connectors.", long_description=README, long_description_content_type="text/markdown", diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py b/airbyte-cdk/python/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py index 8aec567318bbf..a55726e992276 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/requesters/paginators/test_default_paginator.py @@ -9,7 +9,12 @@ import requests from airbyte_cdk.sources.declarative.decoders.json_decoder import JsonDecoder from airbyte_cdk.sources.declarative.interpolation.interpolated_boolean import InterpolatedBoolean -from airbyte_cdk.sources.declarative.requesters.paginators.default_paginator import DefaultPaginator, RequestOption, RequestOptionType +from airbyte_cdk.sources.declarative.requesters.paginators.default_paginator import ( + DefaultPaginator, + PaginatorTestReadDecorator, + RequestOption, + RequestOptionType, +) from airbyte_cdk.sources.declarative.requesters.paginators.strategies.cursor_pagination_strategy import CursorPaginationStrategy @@ -202,3 +207,25 @@ def test_reset(): strategy = MagicMock() DefaultPaginator(strategy, config, url_base, options={}, page_size_option=page_size_request_option, page_token_option=page_token_request_option).reset() assert strategy.reset.called + + +def test_limit_page_fetched(): + maximum_number_of_pages = 5 + number_of_next_performed = maximum_number_of_pages - 1 + paginator = PaginatorTestReadDecorator( + DefaultPaginator( + page_size_option=MagicMock(), + page_token_option=MagicMock(), + pagination_strategy=MagicMock(), + config=MagicMock(), + url_base=MagicMock(), + options={}, + ), + maximum_number_of_pages + ) + + for _ in range(number_of_next_performed): + last_token = paginator.next_page_token(MagicMock(), MagicMock()) + assert last_token + + assert not paginator.next_page_token(MagicMock(), MagicMock()) diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/retrievers/test_simple_retriever.py b/airbyte-cdk/python/unit_tests/sources/declarative/retrievers/test_simple_retriever.py index abb33bf3ca377..1a8db7a368bfb 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/retrievers/test_simple_retriever.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/retrievers/test_simple_retriever.py @@ -15,6 +15,7 @@ from airbyte_cdk.sources.declarative.requesters.requester import HttpMethod from airbyte_cdk.sources.declarative.retrievers.simple_retriever import ( SimpleRetriever, + SimpleRetrieverTestReadDecorator, _prepared_request_to_airbyte_message, _response_to_airbyte_message, ) @@ -629,3 +630,28 @@ def test_response_to_airbyte_message(test_name, response_body, response_headers, actual_airbyte_message = _response_to_airbyte_message(response) assert expected_airbyte_message == actual_airbyte_message + + +def test_limit_stream_slices(): + maximum_number_of_slices = 4 + stream_slicer = MagicMock() + stream_slicer.stream_slices.return_value = _generate_slices(maximum_number_of_slices * 2) + retriever = SimpleRetrieverTestReadDecorator( + name="stream_name", + primary_key=primary_key, + requester=MagicMock(), + paginator=MagicMock(), + record_selector=MagicMock(), + stream_slicer=stream_slicer, + maximum_number_of_slices=maximum_number_of_slices, + options={}, + config={}, + ) + + truncated_slices = list(retriever.stream_slices(sync_mode=SyncMode.incremental, stream_state=None)) + + assert truncated_slices == _generate_slices(maximum_number_of_slices) + + +def _generate_slices(number_of_slices): + return [{"date": f"2022-01-0{day + 1}"} for day in range(number_of_slices)] diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/test_manifest_declarative_source.py b/airbyte-cdk/python/unit_tests/sources/declarative/test_manifest_declarative_source.py index 01faf5c25c44e..7d22e1cb7674f 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/test_manifest_declarative_source.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/test_manifest_declarative_source.py @@ -6,6 +6,7 @@ import logging import os import sys +from unittest.mock import patch import pytest import yaml @@ -541,6 +542,94 @@ def test_manifest_without_at_least_one_stream(self, construct_using_pydantic_mod with pytest.raises(ValidationError): ManifestDeclarativeSource(source_config=manifest, construct_using_pydantic_models=construct_using_pydantic_models) + @patch("airbyte_cdk.sources.declarative.declarative_source.DeclarativeSource.read") + def test_given_debug_when_read_then_set_log_level(self, declarative_source_read): + any_valid_manifest = { + "version": "version", + "definitions": { + "schema_loader": {"name": "{{ options.stream_name }}", "file_path": "./source_sendgrid/schemas/{{ options.name }}.yaml"}, + "retriever": { + "paginator": { + "type": "DefaultPaginator", + "page_size": 10, + "page_size_option": {"inject_into": "request_parameter", "field_name": "page_size"}, + "page_token_option": {"inject_into": "path"}, + "pagination_strategy": {"type": "CursorPagination", "cursor_value": "{{ response._metadata.next }}"}, + }, + "requester": { + "path": "/v3/marketing/lists", + "authenticator": {"type": "BearerAuthenticator", "api_token": "{{ config.apikey }}"}, + "request_parameters": {"page_size": 10}, + }, + "record_selector": {"extractor": {"field_pointer": ["result"]}}, + }, + }, + "streams": [ + { + "type": "DeclarativeStream", + "$options": {"name": "lists", "primary_key": "id", "url_base": "https://api.sendgrid.com"}, + "schema_loader": { + "name": "{{ options.stream_name }}", + "file_path": "./source_sendgrid/schemas/{{ options.name }}.yaml", + }, + "retriever": { + "paginator": { + "type": "DefaultPaginator", + "page_size": 10, + "page_size_option": {"inject_into": "request_parameter", "field_name": "page_size"}, + "page_token_option": {"inject_into": "path"}, + "pagination_strategy": { + "type": "CursorPagination", + "cursor_value": "{{ response._metadata.next }}", + "page_size": 10, + }, + }, + "requester": { + "path": "/v3/marketing/lists", + "authenticator": {"type": "BearerAuthenticator", "api_token": "{{ config.apikey }}"}, + "request_parameters": {"page_size": 10}, + }, + "record_selector": {"extractor": {"field_pointer": ["result"]}}, + }, + }, + { + "type": "DeclarativeStream", + "$options": {"name": "stream_with_custom_requester", "primary_key": "id", "url_base": "https://api.sendgrid.com"}, + "schema_loader": { + "name": "{{ options.stream_name }}", + "file_path": "./source_sendgrid/schemas/{{ options.name }}.yaml", + }, + "retriever": { + "paginator": { + "type": "DefaultPaginator", + "page_size": 10, + "page_size_option": {"inject_into": "request_parameter", "field_name": "page_size"}, + "page_token_option": {"inject_into": "path"}, + "pagination_strategy": { + "type": "CursorPagination", + "cursor_value": "{{ response._metadata.next }}", + "page_size": 10, + }, + }, + "requester": { + "type": "CustomRequester", + "class_name": "unit_tests.sources.declarative.external_component.SampleCustomComponent", + "path": "/v3/marketing/lists", + "custom_request_parameters": {"page_size": 10}, + }, + "record_selector": {"extractor": {"field_pointer": ["result"]}}, + }, + }, + ], + "check": {"type": "CheckStream", "stream_names": ["lists"]}, + } + source = ManifestDeclarativeSource(source_config=any_valid_manifest, debug=True, construct_using_pydantic_models=True) + + debug_logger = logging.getLogger("logger.debug") + list(source.read(debug_logger, {}, {}, {})) + + assert debug_logger.isEnabledFor(logging.DEBUG) + def test_generate_schema(): schema_str = ManifestDeclarativeSource.generate_schema() diff --git a/airbyte-cdk/python/unit_tests/sources/test_abstract_source.py b/airbyte-cdk/python/unit_tests/sources/test_abstract_source.py index bbb808a0ec747..b7747bc5f0d00 100644 --- a/airbyte-cdk/python/unit_tests/sources/test_abstract_source.py +++ b/airbyte-cdk/python/unit_tests/sources/test_abstract_source.py @@ -331,6 +331,57 @@ def test_valid_full_refresh_read_with_slices(mocker): assert expected == messages +def test_read_full_refresh_with_slices_sends_slice_messages(mocker): + """Given the logger is debug and a full refresh, AirbyteMessages are sent for slices""" + debug_logger = logging.getLogger("airbyte.debug") + debug_logger.setLevel(logging.DEBUG) + slices = [{"1": "1"}, {"2": "2"}] + stream = MockStream( + [({"sync_mode": SyncMode.full_refresh, "stream_slice": s}, [s]) for s in slices], + name="s1", + ) + + mocker.patch.object(MockStream, "get_json_schema", return_value={}) + mocker.patch.object(MockStream, "stream_slices", return_value=slices) + + src = MockSource(streams=[stream]) + catalog = ConfiguredAirbyteCatalog( + streams=[ + _configured_stream(stream, SyncMode.full_refresh), + ] + ) + + messages = src.read(debug_logger, {}, catalog) + + assert 2 == len(list(filter(lambda message: message.log and message.log.message.startswith("slice:"), messages))) + + +def test_read_incremental_with_slices_sends_slice_messages(mocker): + """Given the logger is debug and a incremental, AirbyteMessages are sent for slices""" + debug_logger = logging.getLogger("airbyte.debug") + debug_logger.setLevel(logging.DEBUG) + slices = [{"1": "1"}, {"2": "2"}] + stream = MockStream( + [({"sync_mode": SyncMode.incremental, "stream_slice": s, 'stream_state': {}}, [s]) for s in slices], + name="s1", + ) + + MockStream.supports_incremental = mocker.PropertyMock(return_value=True) + mocker.patch.object(MockStream, "get_json_schema", return_value={}) + mocker.patch.object(MockStream, "stream_slices", return_value=slices) + + src = MockSource(streams=[stream]) + catalog = ConfiguredAirbyteCatalog( + streams=[ + _configured_stream(stream, SyncMode.incremental), + ] + ) + + messages = src.read(debug_logger, {}, catalog) + + assert 2 == len(list(filter(lambda message: message.log and message.log.message.startswith("slice:"), messages))) + + class TestIncrementalRead: @pytest.mark.parametrize( "use_legacy", diff --git a/airbyte-cdk/python/unit_tests/sources/test_source.py b/airbyte-cdk/python/unit_tests/sources/test_source.py index 0cae909b2f083..b8a8291058e82 100644 --- a/airbyte-cdk/python/unit_tests/sources/test_source.py +++ b/airbyte-cdk/python/unit_tests/sources/test_source.py @@ -401,6 +401,7 @@ def test_internal_config_limit(mocker, abstract_source, catalog): logger_mock.level = logging.DEBUG del catalog.streams[1] STREAM_LIMIT = 2 + SLICE_DEBUG_LOG_COUNT = 1 FULL_RECORDS_NUMBER = 3 streams = abstract_source.streams(None) http_stream = streams[0] @@ -409,7 +410,7 @@ def test_internal_config_limit(mocker, abstract_source, catalog): catalog.streams[0].sync_mode = SyncMode.full_refresh records = [r for r in abstract_source.read(logger=logger_mock, config=internal_config, catalog=catalog, state={})] - assert len(records) == STREAM_LIMIT + assert len(records) == STREAM_LIMIT + SLICE_DEBUG_LOG_COUNT logger_info_args = [call[0][0] for call in logger_mock.info.call_args_list] # Check if log line matches number of limit read_log_record = [_l for _l in logger_info_args if _l.startswith("Read")] @@ -418,13 +419,13 @@ def test_internal_config_limit(mocker, abstract_source, catalog): # No limit, check if state record produced for incremental stream catalog.streams[0].sync_mode = SyncMode.incremental records = [r for r in abstract_source.read(logger=logger_mock, config={}, catalog=catalog, state={})] - assert len(records) == FULL_RECORDS_NUMBER + 1 + assert len(records) == FULL_RECORDS_NUMBER + SLICE_DEBUG_LOG_COUNT + 1 assert records[-1].type == Type.STATE # Set limit and check if state is produced when limit is set for incremental stream logger_mock.reset_mock() records = [r for r in abstract_source.read(logger=logger_mock, config=internal_config, catalog=catalog, state={})] - assert len(records) == STREAM_LIMIT + 1 + assert len(records) == STREAM_LIMIT + SLICE_DEBUG_LOG_COUNT + 1 assert records[-1].type == Type.STATE logger_info_args = [call[0][0] for call in logger_mock.info.call_args_list] read_log_record = [_l for _l in logger_info_args if _l.startswith("Read")] @@ -435,6 +436,7 @@ def test_internal_config_limit(mocker, abstract_source, catalog): def test_source_config_no_transform(mocker, abstract_source, catalog): + SLICE_DEBUG_LOG_COUNT = 1 logger_mock = mocker.MagicMock() logger_mock.level = logging.DEBUG streams = abstract_source.streams(None) @@ -442,8 +444,8 @@ def test_source_config_no_transform(mocker, abstract_source, catalog): http_stream.get_json_schema.return_value = non_http_stream.get_json_schema.return_value = SCHEMA http_stream.read_records.return_value, non_http_stream.read_records.return_value = [[{"value": 23}] * 5] * 2 records = [r for r in abstract_source.read(logger=logger_mock, config={}, catalog=catalog, state={})] - assert len(records) == 2 * 5 - assert [r.record.data for r in records] == [{"value": 23}] * 2 * 5 + assert len(records) == 2 * (5 + SLICE_DEBUG_LOG_COUNT) + assert [r.record.data for r in records if r.type == Type.RECORD] == [{"value": 23}] * 2 * 5 assert http_stream.get_json_schema.call_count == 5 assert non_http_stream.get_json_schema.call_count == 5 @@ -451,6 +453,7 @@ def test_source_config_no_transform(mocker, abstract_source, catalog): def test_source_config_transform(mocker, abstract_source, catalog): logger_mock = mocker.MagicMock() logger_mock.level = logging.DEBUG + SLICE_DEBUG_LOG_COUNT = 2 streams = abstract_source.streams(None) http_stream, non_http_stream = streams http_stream.transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) @@ -458,21 +461,22 @@ def test_source_config_transform(mocker, abstract_source, catalog): http_stream.get_json_schema.return_value = non_http_stream.get_json_schema.return_value = SCHEMA http_stream.read_records.return_value, non_http_stream.read_records.return_value = [{"value": 23}], [{"value": 23}] records = [r for r in abstract_source.read(logger=logger_mock, config={}, catalog=catalog, state={})] - assert len(records) == 2 - assert [r.record.data for r in records] == [{"value": "23"}] * 2 + assert len(records) == 2 + SLICE_DEBUG_LOG_COUNT + assert [r.record.data for r in records if r.type == Type.RECORD] == [{"value": "23"}] * 2 def test_source_config_transform_and_no_transform(mocker, abstract_source, catalog): logger_mock = mocker.MagicMock() logger_mock.level = logging.DEBUG + SLICE_DEBUG_LOG_COUNT = 2 streams = abstract_source.streams(None) http_stream, non_http_stream = streams http_stream.transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) http_stream.get_json_schema.return_value = non_http_stream.get_json_schema.return_value = SCHEMA http_stream.read_records.return_value, non_http_stream.read_records.return_value = [{"value": 23}], [{"value": 23}] records = [r for r in abstract_source.read(logger=logger_mock, config={}, catalog=catalog, state={})] - assert len(records) == 2 - assert [r.record.data for r in records] == [{"value": "23"}, {"value": 23}] + assert len(records) == 2 + SLICE_DEBUG_LOG_COUNT + assert [r.record.data for r in records if r.type == Type.RECORD] == [{"value": "23"}, {"value": 23}] def test_read_default_http_availability_strategy_stream_available(catalog, mocker): diff --git a/airbyte-connector-builder-server/connector_builder/entrypoint.py b/airbyte-connector-builder-server/connector_builder/entrypoint.py index c277501551785..d2ee54d20c2bc 100644 --- a/airbyte-connector-builder-server/connector_builder/entrypoint.py +++ b/airbyte-connector-builder-server/connector_builder/entrypoint.py @@ -4,10 +4,14 @@ from connector_builder.generated.apis.default_api_interface import initialize_router from connector_builder.impl.default_api import DefaultApiImpl -from connector_builder.impl.low_code_cdk_adapter import LowCodeSourceAdapter +from connector_builder.impl.low_code_cdk_adapter import LowCodeSourceAdapterFactory from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +_MAXIMUM_NUMBER_OF_PAGES_PER_SLICE = 5 +_MAXIMUM_NUMBER_OF_SLICES = 5 +_ADAPTER_FACTORY = LowCodeSourceAdapterFactory(_MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, _MAXIMUM_NUMBER_OF_SLICES) + app = FastAPI( title="Connector Builder Server API", description="Connector Builder Server API ", @@ -22,4 +26,4 @@ allow_headers=["*"], ) -app.include_router(initialize_router(DefaultApiImpl(LowCodeSourceAdapter))) +app.include_router(initialize_router(DefaultApiImpl(_ADAPTER_FACTORY, _MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, _MAXIMUM_NUMBER_OF_SLICES))) diff --git a/airbyte-connector-builder-server/connector_builder/generated/models/stream_read.py b/airbyte-connector-builder-server/connector_builder/generated/models/stream_read.py index 163bb131e7c28..775b148fa3a70 100644 --- a/airbyte-connector-builder-server/connector_builder/generated/models/stream_read.py +++ b/airbyte-connector-builder-server/connector_builder/generated/models/stream_read.py @@ -19,11 +19,13 @@ class StreamRead(BaseModel): logs: The logs of this StreamRead. slices: The slices of this StreamRead. + test_read_limit_reached: The test_read_limit_reached of this StreamRead. inferred_schema: The inferred_schema of this StreamRead [Optional]. """ logs: List[object] slices: List[StreamReadSlices] + test_read_limit_reached: bool inferred_schema: Optional[Dict[str, Any]] = None StreamRead.update_forward_refs() diff --git a/airbyte-connector-builder-server/connector_builder/impl/adapter.py b/airbyte-connector-builder-server/connector_builder/impl/adapter.py index 840e0996fbaaf..33da6ced709a0 100644 --- a/airbyte-connector-builder-server/connector_builder/impl/adapter.py +++ b/airbyte-connector-builder-server/connector_builder/impl/adapter.py @@ -32,3 +32,11 @@ def read_stream(self, stream: str, config: Dict[str, Any]) -> Iterator[AirbyteMe :param config: The user-provided configuration as specified by the source's spec. :return: An iterator over `AirbyteMessage` objects. """ + + +class CdkAdapterFactory(ABC): + + @abstractmethod + def create(self, manifest: Dict[str, Any]) -> CdkAdapter: + """Return an implementation of CdkAdapter""" + pass diff --git a/airbyte-connector-builder-server/connector_builder/impl/default_api.py b/airbyte-connector-builder-server/connector_builder/impl/default_api.py index 973defc09c418..675e928f6cbb7 100644 --- a/airbyte-connector-builder-server/connector_builder/impl/default_api.py +++ b/airbyte-connector-builder-server/connector_builder/impl/default_api.py @@ -6,7 +6,7 @@ import logging import traceback from json import JSONDecodeError -from typing import Any, Callable, Dict, Iterable, Iterator, Optional, Union +from typing import Any, Dict, Iterable, Iterator, Optional, Union from urllib.parse import parse_qs, urljoin, urlparse from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, Type @@ -24,17 +24,21 @@ from connector_builder.generated.models.streams_list_read import StreamsListRead from connector_builder.generated.models.streams_list_read_streams import StreamsListReadStreams from connector_builder.generated.models.streams_list_request_body import StreamsListRequestBody -from connector_builder.impl.adapter import CdkAdapter +from connector_builder.impl.adapter import CdkAdapter, CdkAdapterFactory from fastapi import Body, HTTPException from jsonschema import ValidationError class DefaultApiImpl(DefaultApi): + logger = logging.getLogger("airbyte.connector-builder") - def __init__(self, adapter_cls: Callable[[Dict[str, Any]], CdkAdapter], max_record_limit: int = 1000): - self.adapter_cls = adapter_cls + def __init__(self, adapter_factory: CdkAdapterFactory, max_pages_per_slice, max_slices, max_record_limit: int = 1000): + self.adapter_factory = adapter_factory + self._max_pages_per_slice = max_pages_per_slice + self._max_slices = max_slices self.max_record_limit = max_record_limit + super().__init__() async def get_manifest_template(self) -> str: @@ -128,7 +132,7 @@ async def read_stream(self, stream_read_request_body: StreamReadRequestBody = Bo else: record_limit = min(stream_read_request_body.record_limit, self.max_record_limit) - single_slice = StreamReadSlices(pages=[]) + slices = [] log_messages = [] try: for message_group in self._get_message_groups( @@ -139,7 +143,7 @@ async def read_stream(self, stream_read_request_body: StreamReadRequestBody = Bo if isinstance(message_group, AirbyteLogMessage): log_messages.append({"message": message_group.message}) else: - single_slice.pages.append(message_group) + slices.append(message_group) except Exception as error: # TODO: We're temporarily using FastAPI's default exception model. Ideally we should use exceptions defined in the OpenAPI spec self.logger.error(f"Could not perform read with with error: {error.args[0]} - {self._get_stacktrace_as_string(error)}") @@ -149,9 +153,21 @@ async def read_stream(self, stream_read_request_body: StreamReadRequestBody = Bo ) return StreamRead( - logs=log_messages, slices=[single_slice], inferred_schema=schema_inferrer.get_stream_schema(stream_read_request_body.stream) + logs=log_messages, + slices=slices, + test_read_limit_reached=self._has_reached_limit(slices), + inferred_schema=schema_inferrer.get_stream_schema(stream_read_request_body.stream) ) + def _has_reached_limit(self, slices): + if len(slices) >= self._max_slices: + return True + + for slice in slices: + if len(slice.pages) >= self._max_pages_per_slice: + return True + return False + async def resolve_manifest( self, resolve_manifest_request_body: ResolveManifestRequestBody = Body(None, description="") ) -> ResolveManifest: @@ -191,33 +207,56 @@ def _get_message_groups( Note: The exception is that normal log messages can be received at any time which are not incorporated into grouping """ - first_page = True - current_records = [] + records_count = 0 + at_least_one_page_in_group = False + current_page_records = [] + current_slice_pages = [] current_page_request: Optional[HttpRequest] = None current_page_response: Optional[HttpResponse] = None - while len(current_records) < limit and (message := next(messages, None)): - if first_page and message.type == Type.LOG and message.log.message.startswith("request:"): - first_page = False - request = self._create_request_from_log_message(message.log) - current_page_request = request + while records_count < limit and (message := next(messages, None)): + if self._need_to_close_page(at_least_one_page_in_group, message): + self._close_page(current_page_request, current_page_response, current_slice_pages, current_page_records) + current_page_request = None + current_page_response = None + + if at_least_one_page_in_group and message.type == Type.LOG and message.log.message.startswith("slice:"): + yield StreamReadSlices(pages=current_slice_pages) + current_slice_pages = [] + at_least_one_page_in_group = False elif message.type == Type.LOG and message.log.message.startswith("request:"): - if not current_page_request or not current_page_response: - raise ValueError("Every message grouping should have at least one request and response") - yield StreamReadPages(request=current_page_request, response=current_page_response, records=current_records) + if not at_least_one_page_in_group: + at_least_one_page_in_group = True current_page_request = self._create_request_from_log_message(message.log) - current_records = [] elif message.type == Type.LOG and message.log.message.startswith("response:"): current_page_response = self._create_response_from_log_message(message.log) elif message.type == Type.LOG: yield message.log elif message.type == Type.RECORD: - current_records.append(message.record.data) + current_page_records.append(message.record.data) + records_count += 1 schema_inferrer.accumulate(message.record) else: - if not current_page_request or not current_page_response: - raise ValueError("Every message grouping should have at least one request and response") - yield StreamReadPages(request=current_page_request, response=current_page_response, records=current_records) + self._close_page(current_page_request, current_page_response, current_slice_pages, current_page_records) + yield StreamReadSlices(pages=current_slice_pages) + + @staticmethod + def _need_to_close_page(at_least_one_page_in_group, message): + return ( + at_least_one_page_in_group + and message.type == Type.LOG + and (message.log.message.startswith("request:") or message.log.message.startswith("slice:")) + ) + + @staticmethod + def _close_page(current_page_request, current_page_response, current_slice_pages, current_page_records): + if not current_page_request or not current_page_response: + raise ValueError("Every message grouping should have at least one request and response") + + current_slice_pages.append( + StreamReadPages(request=current_page_request, response=current_page_response, records=current_page_records) + ) + current_page_records.clear() def _create_request_from_log_message(self, log_message: AirbyteLogMessage) -> Optional[HttpRequest]: # TODO: As a temporary stopgap, the CDK emits request data as a log message string. Ideally this should come in the @@ -255,7 +294,7 @@ def _create_response_from_log_message(self, log_message: AirbyteLogMessage) -> O def _create_low_code_adapter(self, manifest: Dict[str, Any]) -> CdkAdapter: try: - return self.adapter_cls(manifest=manifest) + return self.adapter_factory.create(manifest) except ValidationError as error: # TODO: We're temporarily using FastAPI's default exception model. Ideally we should use exceptions defined in the OpenAPI spec self.logger.error(f"Invalid connector manifest with error: {error.message} - {DefaultApiImpl._get_stacktrace_as_string(error)}") diff --git a/airbyte-connector-builder-server/connector_builder/impl/low_code_cdk_adapter.py b/airbyte-connector-builder-server/connector_builder/impl/low_code_cdk_adapter.py index 580d0d7c42e72..f298cc3588ad0 100644 --- a/airbyte-connector-builder-server/connector_builder/impl/low_code_cdk_adapter.py +++ b/airbyte-connector-builder-server/connector_builder/impl/low_code_cdk_adapter.py @@ -7,15 +7,20 @@ from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, ConfiguredAirbyteCatalog, Level from airbyte_cdk.models import Type as MessageType from airbyte_cdk.sources.declarative.declarative_stream import DeclarativeStream +from airbyte_cdk.sources.declarative.parsers.model_to_component_factory import ModelToComponentFactory from airbyte_cdk.sources.declarative.yaml_declarative_source import ManifestDeclarativeSource from airbyte_cdk.sources.streams.http import HttpStream -from connector_builder.impl.adapter import CdkAdapter +from connector_builder.impl.adapter import CdkAdapter, CdkAdapterFactory class LowCodeSourceAdapter(CdkAdapter): - def __init__(self, manifest: Dict[str, Any]): + def __init__(self, manifest: Dict[str, Any], limit_page_fetched_per_slice, limit_slices_fetched): # Request and response messages are only emitted for a sources that have debug turned on - self._source = ManifestDeclarativeSource(manifest, debug=True) + self._source = ManifestDeclarativeSource( + manifest, + debug=True, + component_factory=ModelToComponentFactory(limit_page_fetched_per_slice, limit_slices_fetched) + ) def get_http_streams(self, config: Dict[str, Any]) -> List[HttpStream]: http_streams = [] @@ -58,3 +63,13 @@ def read_stream(self, stream: str, config: Dict[str, Any]) -> Iterator[AirbyteMe except Exception as e: yield AirbyteMessage(type=MessageType.LOG, log=AirbyteLogMessage(level=Level.ERROR, message=str(e))) return + + +class LowCodeSourceAdapterFactory(CdkAdapterFactory): + + def __init__(self, max_pages_per_slice, max_slices): + self._max_pages_per_slice = max_pages_per_slice + self._max_slices = max_slices + + def create(self, manifest: Dict[str, Any]) -> CdkAdapter: + return LowCodeSourceAdapter(manifest, self._max_pages_per_slice, self._max_slices) diff --git a/airbyte-connector-builder-server/setup.py b/airbyte-connector-builder-server/setup.py index b674bfc6f836d..dc8c94871803b 100644 --- a/airbyte-connector-builder-server/setup.py +++ b/airbyte-connector-builder-server/setup.py @@ -41,7 +41,7 @@ }, packages=find_packages(exclude=("unit_tests", "integration_tests", "docs")), package_data={}, - install_requires=["airbyte-cdk==0.22", "fastapi", "uvicorn"], + install_requires=["airbyte-cdk==0.23", "fastapi", "uvicorn"], python_requires=">=3.9.11", extras_require={ "tests": [ diff --git a/airbyte-connector-builder-server/src/main/openapi/openapi.yaml b/airbyte-connector-builder-server/src/main/openapi/openapi.yaml index a104000d0fcb1..6f2147668e99f 100644 --- a/airbyte-connector-builder-server/src/main/openapi/openapi.yaml +++ b/airbyte-connector-builder-server/src/main/openapi/openapi.yaml @@ -98,6 +98,7 @@ components: required: - logs - slices + - test_read_limit_reached properties: logs: type: array @@ -144,6 +145,9 @@ components: type: object description: The STATE AirbyteMessage emitted at the end of this slice. This can be omitted if a stream slicer is not configured. # $ref: "#/components/schemas/AirbyteProtocol/definitions/AirbyteStateMessage" + test_read_limit_reached: + type: boolean + description: Whether the maximum number of request per slice or the maximum number of slices queried has been reached inferred_schema: type: object description: The narrowest JSON Schema against which every AirbyteRecord in the slices can validate successfully. This is inferred from reading every record in the output slices. diff --git a/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py b/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py index 4dead48f3dad6..ea1d10682e2dc 100644 --- a/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py +++ b/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_default_api.py @@ -20,10 +20,13 @@ from connector_builder.generated.models.streams_list_read_streams import StreamsListReadStreams from connector_builder.generated.models.streams_list_request_body import StreamsListRequestBody from connector_builder.impl.default_api import DefaultApiImpl -from connector_builder.impl.low_code_cdk_adapter import LowCodeSourceAdapter +from connector_builder.impl.low_code_cdk_adapter import LowCodeSourceAdapterFactory from fastapi import HTTPException from pydantic.error_wrappers import ValidationError +MAX_PAGES_PER_SLICE = 4 +MAX_SLICES = 3 + MANIFEST = { "version": "0.1.0", "type": "DeclarativeSource", @@ -95,13 +98,17 @@ def record_message(stream: str, data: dict) -> AirbyteMessage: return AirbyteMessage(type=Type.RECORD, record=AirbyteRecordMessage(stream=stream, data=data, emitted_at=1234)) +def slice_message() -> AirbyteMessage: + return AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message='slice:{"key": "value"}')) + + def test_list_streams(): expected_streams = [ StreamsListReadStreams(name="hashiras", url="https://demonslayers.com/api/v1/hashiras"), StreamsListReadStreams(name="breathing-techniques", url="https://demonslayers.com/api/v1/breathing_techniques"), ] - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) streams_list_request_body = StreamsListRequestBody(manifest=MANIFEST, config=CONFIG) loop = asyncio.get_event_loop() actual_streams = loop.run_until_complete(api.list_streams(streams_list_request_body)) @@ -135,7 +142,7 @@ def test_list_streams_with_interpolated_urls(): expected_streams = StreamsListRead(streams=[StreamsListReadStreams(name="demons", url="https://upper-six.muzan.com/api/v1/demons")]) - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) streams_list_request_body = StreamsListRequestBody(manifest=manifest, config=CONFIG) loop = asyncio.get_event_loop() actual_streams = loop.run_until_complete(api.list_streams(streams_list_request_body)) @@ -169,7 +176,7 @@ def test_list_streams_with_unresolved_interpolation(): # The interpolated string {{ config['not_in_config'] }} doesn't resolve to anything so it ends up blank during interpolation expected_streams = StreamsListRead(streams=[StreamsListReadStreams(name="demons", url="https://.muzan.com/api/v1/demons")]) - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) streams_list_request_body = StreamsListRequestBody(manifest=manifest, config=CONFIG) loop = asyncio.get_event_loop() @@ -212,7 +219,7 @@ def test_read_stream(): ), ] - mock_source_adapter_cls = make_mock_adapter_cls( + mock_source_adapter_cls = make_mock_adapter_factory( iter( [ request_log_message(request), @@ -226,7 +233,7 @@ def test_read_stream(): ) ) - api = DefaultApiImpl(mock_source_adapter_cls) + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() actual_response: StreamRead = loop.run_until_complete( @@ -277,7 +284,7 @@ def test_read_stream_with_logs(): {"message": "log message after the response"}, ] - mock_source_adapter_cls = make_mock_adapter_cls( + mock_source_adapter_cls = make_mock_adapter_factory( iter( [ AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="log message before the request")), @@ -291,7 +298,7 @@ def test_read_stream_with_logs(): ) ) - api = DefaultApiImpl(mock_source_adapter_cls) + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() actual_response: StreamRead = loop.run_until_complete( @@ -320,7 +327,7 @@ def test_read_stream_record_limit(request_record_limit, max_record_limit): "body": {"custom": "field"}, } response = {"status_code": 200, "headers": {"field": "value"}, "body": '{"name": "field"}'} - mock_source_adapter_cls = make_mock_adapter_cls( + mock_source_adapter_cls = make_mock_adapter_factory( iter( [ request_log_message(request), @@ -337,7 +344,7 @@ def test_read_stream_record_limit(request_record_limit, max_record_limit): n_records = 2 record_limit = min(request_record_limit, max_record_limit) - api = DefaultApiImpl(mock_source_adapter_cls, max_record_limit=max_record_limit) + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES, max_record_limit=max_record_limit) loop = asyncio.get_event_loop() actual_response: StreamRead = loop.run_until_complete( api.read_stream(StreamReadRequestBody(manifest=MANIFEST, config=CONFIG, stream="hashiras", record_limit=request_record_limit)) @@ -363,7 +370,7 @@ def test_read_stream_default_record_limit(max_record_limit): "body": {"custom": "field"}, } response = {"status_code": 200, "headers": {"field": "value"}, "body": '{"name": "field"}'} - mock_source_adapter_cls = make_mock_adapter_cls( + mock_source_adapter_cls = make_mock_adapter_factory( iter( [ request_log_message(request), @@ -379,7 +386,7 @@ def test_read_stream_default_record_limit(max_record_limit): ) n_records = 2 - api = DefaultApiImpl(mock_source_adapter_cls, max_record_limit=max_record_limit) + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES, max_record_limit=max_record_limit) loop = asyncio.get_event_loop() actual_response: StreamRead = loop.run_until_complete( api.read_stream(StreamReadRequestBody(manifest=MANIFEST, config=CONFIG, stream="hashiras")) @@ -398,7 +405,7 @@ def test_read_stream_limit_0(): "body": {"custom": "field"}, } response = {"status_code": 200, "headers": {"field": "value"}, "body": '{"name": "field"}'} - mock_source_adapter_cls = make_mock_adapter_cls( + mock_source_adapter_cls = make_mock_adapter_factory( iter( [ request_log_message(request), @@ -412,7 +419,7 @@ def test_read_stream_limit_0(): ] ) ) - api = DefaultApiImpl(mock_source_adapter_cls) + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() with pytest.raises(ValidationError): @@ -453,7 +460,7 @@ def test_read_stream_no_records(): ), ] - mock_source_adapter_cls = make_mock_adapter_cls( + mock_source_adapter_cls = make_mock_adapter_factory( iter( [ request_log_message(request), @@ -464,7 +471,7 @@ def test_read_stream_no_records(): ) ) - api = DefaultApiImpl(mock_source_adapter_cls) + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() actual_response: StreamRead = loop.run_until_complete( @@ -501,7 +508,7 @@ def test_invalid_manifest(): expected_status_code = 400 - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() with pytest.raises(HTTPException) as actual_exception: loop.run_until_complete(api.read_stream(StreamReadRequestBody(manifest=invalid_manifest, config={}, stream="hashiras"))) @@ -512,7 +519,7 @@ def test_invalid_manifest(): def test_read_stream_invalid_group_format(): response = {"status_code": 200, "headers": {"field": "value"}, "body": '{"name": "field"}'} - mock_source_adapter_cls = make_mock_adapter_cls( + mock_source_adapter_cls = make_mock_adapter_factory( iter( [ response_log_message(response), @@ -522,7 +529,7 @@ def test_read_stream_invalid_group_format(): ) ) - api = DefaultApiImpl(mock_source_adapter_cls) + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() with pytest.raises(HTTPException) as actual_exception: @@ -534,7 +541,7 @@ def test_read_stream_invalid_group_format(): def test_read_stream_returns_error_if_stream_does_not_exist(): expected_status_code = 400 - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() with pytest.raises(HTTPException) as actual_exception: loop.run_until_complete(api.read_stream(StreamReadRequestBody(manifest=MANIFEST, config={}, stream="not_in_manifest"))) @@ -584,7 +591,7 @@ def test_read_stream_returns_error_if_stream_does_not_exist(): ) def test_create_request_from_log_message(log_message, expected_request): airbyte_log_message = AirbyteLogMessage(level=Level.INFO, message=log_message) - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) actual_request = api._create_request_from_log_message(airbyte_log_message) assert actual_request == expected_request @@ -619,12 +626,101 @@ def test_create_response_from_log_message(log_message, expected_response): response_message = f"response:{json.dumps(log_message)}" airbyte_log_message = AirbyteLogMessage(level=Level.INFO, message=response_message) - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) actual_response = api._create_response_from_log_message(airbyte_log_message) assert actual_response == expected_response +def test_read_stream_with_many_slices(): + request = {} + response = {"status_code": 200} + + mock_source_adapter_cls = make_mock_adapter_factory( + iter( + [ + slice_message(), + request_log_message(request), + response_log_message(response), + record_message("hashiras", {"name": "Muichiro Tokito"}), + slice_message(), + request_log_message(request), + response_log_message(response), + record_message("hashiras", {"name": "Shinobu Kocho"}), + record_message("hashiras", {"name": "Mitsuri Kanroji"}), + request_log_message(request), + response_log_message(response), + record_message("hashiras", {"name": "Obanai Iguro"}), + request_log_message(request), + response_log_message(response), + ] + ) + ) + + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES) + + loop = asyncio.get_event_loop() + stream_read: StreamRead = loop.run_until_complete( + api.read_stream(StreamReadRequestBody(manifest=MANIFEST, config=CONFIG, stream="hashiras")) + ) + + assert not stream_read.test_read_limit_reached + assert len(stream_read.slices) == 2 + + assert len(stream_read.slices[0].pages) == 1 + assert len(stream_read.slices[0].pages[0].records) == 1 + + assert len(stream_read.slices[1].pages) == 3 + assert len(stream_read.slices[1].pages[0].records) == 2 + assert len(stream_read.slices[1].pages[1].records) == 1 + assert len(stream_read.slices[1].pages[2].records) == 0 + + + +def test_read_stream_given_maximum_number_of_slices_then_test_read_limit_reached(): + maximum_number_of_slices = 5 + request = {} + response = {"status_code": 200} + mock_source_adapter_cls = make_mock_adapter_factory( + iter( + [ + slice_message(), + request_log_message(request), + response_log_message(response) + ] * maximum_number_of_slices + ) + ) + + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES) + + loop = asyncio.get_event_loop() + stream_read: StreamRead = loop.run_until_complete( + api.read_stream(StreamReadRequestBody(manifest=MANIFEST, config=CONFIG, stream="hashiras")) + ) + + assert stream_read.test_read_limit_reached + + +def test_read_stream_given_maximum_number_of_pages_then_test_read_limit_reached(): + maximum_number_of_pages_per_slice = 5 + request = {} + response = {"status_code": 200} + mock_source_adapter_cls = make_mock_adapter_factory( + iter( + [slice_message()] + [request_log_message(request), response_log_message(response)] * maximum_number_of_pages_per_slice + ) + ) + + api = DefaultApiImpl(mock_source_adapter_cls, MAX_PAGES_PER_SLICE, MAX_SLICES) + + loop = asyncio.get_event_loop() + stream_read: StreamRead = loop.run_until_complete( + api.read_stream(StreamReadRequestBody(manifest=MANIFEST, config=CONFIG, stream="hashiras")) + ) + + assert stream_read.test_read_limit_reached + + def test_resolve_manifest(): _stream_name = "stream_with_custom_requester" _stream_primary_key = "id" @@ -775,7 +871,7 @@ def test_resolve_manifest(): "check": {"type": "CheckStream", "stream_names": ["lists"]}, } - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() actual_response: ResolveManifest = loop.run_until_complete(api.resolve_manifest(ResolveManifestRequestBody(manifest=manifest))) @@ -794,7 +890,7 @@ def test_resolve_manifest_unresolvable_references(): "check": {"type": "CheckStream", "stream_names": ["lists"]}, } - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() with pytest.raises(HTTPException) as actual_exception: loop.run_until_complete(api.resolve_manifest(ResolveManifestRequestBody(manifest=invalid_manifest))) @@ -807,7 +903,7 @@ def test_resolve_manifest_invalid(): expected_status_code = 400 invalid_manifest = {"version": "version"} - api = DefaultApiImpl(LowCodeSourceAdapter) + api = DefaultApiImpl(LowCodeSourceAdapterFactory(MAX_PAGES_PER_SLICE, MAX_SLICES), MAX_PAGES_PER_SLICE, MAX_SLICES) loop = asyncio.get_event_loop() with pytest.raises(HTTPException) as actual_exception: loop.run_until_complete(api.resolve_manifest(ResolveManifestRequestBody(manifest=invalid_manifest))) @@ -816,9 +912,9 @@ def test_resolve_manifest_invalid(): assert actual_exception.value.status_code == expected_status_code -def make_mock_adapter_cls(return_value: Iterator) -> MagicMock: - mock_source_adapter_cls = MagicMock() +def make_mock_adapter_factory(return_value: Iterator) -> MagicMock: + mock_source_adapter_factory = MagicMock() mock_source_adapter = MagicMock() mock_source_adapter.read_stream.return_value = return_value - mock_source_adapter_cls.return_value = mock_source_adapter - return mock_source_adapter_cls + mock_source_adapter_factory.create.return_value = mock_source_adapter + return mock_source_adapter_factory diff --git a/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_low_code_cdk_adapter.py b/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_low_code_cdk_adapter.py index b097f5e9a2933..645969186ff9e 100644 --- a/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_low_code_cdk_adapter.py +++ b/airbyte-connector-builder-server/unit_tests/connector_builder/impl/test_low_code_cdk_adapter.py @@ -10,6 +10,8 @@ import requests from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, AirbyteRecordMessage, Level, Type from airbyte_cdk.sources.declarative.declarative_stream import DeclarativeStream +from airbyte_cdk.sources.declarative.requesters.paginators import PaginatorTestReadDecorator +from airbyte_cdk.sources.declarative.retrievers.simple_retriever import SimpleRetrieverTestReadDecorator from airbyte_cdk.sources.declarative.parsers.custom_exceptions import UndefinedReferenceException from airbyte_cdk.sources.streams.http import HttpStream @@ -176,10 +178,37 @@ def parse_response( } } +MANIFEST_WITH_PAGINATOR = { + "version": "0.1.0", + "type" : "DeclarativeSource", + "definitions": { + }, + "streams": [ + { + "type" : "DeclarativeStream", + "retriever": { + "type" : "SimpleRetriever", + "record_selector": {"extractor": {"field_pointer": ["items"], "type": "DpathExtractor"}, "type": "RecordSelector"}, + "paginator": { + "type": "DefaultPaginator", + "pagination_strategy": { + "type": "OffsetIncrement", + "page_size": 10 + }, + "url_base": "https://demonslayers.com/api/v1/" + }, + "requester": {"url_base": "https://demonslayers.com/api/v1/", "http_method": "GET", "type": "HttpRequester"}, + }, + "$options": {"name": "hashiras", "path": "/hashiras"}, + }, + ], + "check": {"stream_names": ["hashiras"], "type": "CheckStream"}, +} + def test_get_http_streams(): expected_urls = {"https://demonslayers.com/api/v1/breathing_techniques", "https://demonslayers.com/api/v1/hashiras"} - adapter = LowCodeSourceAdapter(MANIFEST) + adapter = LowCodeSourceAdapter(MANIFEST, MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, MAXIMUM_NUMBER_OF_SLICES) actual_streams = adapter.get_http_streams(config={}) actual_urls = {http_stream.url_base + http_stream.path() for http_stream in actual_streams} @@ -187,10 +216,13 @@ def test_get_http_streams(): assert actual_urls == expected_urls +MAXIMUM_NUMBER_OF_PAGES_PER_SLICE = 5 +MAXIMUM_NUMBER_OF_SLICES = 5 + def test_get_http_manifest_with_references(): expected_urls = {"https://demonslayers.com/api/v1/ranks"} - adapter = LowCodeSourceAdapter(MANIFEST_WITH_REFERENCES) + adapter = LowCodeSourceAdapter(MANIFEST_WITH_REFERENCES, MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, MAXIMUM_NUMBER_OF_SLICES) actual_streams = adapter.get_http_streams(config={}) actual_urls = {http_stream.url_base + http_stream.path() for http_stream in actual_streams} @@ -204,7 +236,7 @@ def test_get_http_streams_non_declarative_streams(): mock_source = MagicMock() mock_source.streams.return_value = [non_declarative_stream] - adapter = LowCodeSourceAdapter(MANIFEST) + adapter = LowCodeSourceAdapter(MANIFEST, MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, MAXIMUM_NUMBER_OF_SLICES) adapter._source = mock_source with pytest.raises(TypeError): adapter.get_http_streams(config={}) @@ -217,7 +249,7 @@ def test_get_http_streams_non_http_stream(): mock_source = MagicMock() mock_source.streams.return_value = [declarative_stream_non_http_retriever] - adapter = LowCodeSourceAdapter(MANIFEST) + adapter = LowCodeSourceAdapter(MANIFEST, MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, MAXIMUM_NUMBER_OF_SLICES) adapter._source = mock_source with pytest.raises(TypeError): adapter.get_http_streams(config={}) @@ -247,7 +279,7 @@ def test_read_streams(): mock_source = MagicMock() mock_source.read.return_value = expected_messages - adapter = LowCodeSourceAdapter(MANIFEST) + adapter = LowCodeSourceAdapter(MANIFEST, MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, MAXIMUM_NUMBER_OF_SLICES) adapter._source = mock_source actual_messages = list(adapter.read_stream("hashiras", {})) @@ -272,7 +304,7 @@ def return_value(*args, **kwargs): mock_source.read.side_effect = return_value - adapter = LowCodeSourceAdapter(MANIFEST) + adapter = LowCodeSourceAdapter(MANIFEST, MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, MAXIMUM_NUMBER_OF_SLICES) adapter._source = mock_source actual_messages = list(adapter.read_stream("hashiras", {})) @@ -309,4 +341,14 @@ def test_read_streams_invalid_reference(): } with pytest.raises(UndefinedReferenceException): - LowCodeSourceAdapter(invalid_reference_manifest) + LowCodeSourceAdapter(invalid_reference_manifest, MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, MAXIMUM_NUMBER_OF_SLICES) + + +def test_stream_use_read_test_retriever_and_paginator(): + adapter = LowCodeSourceAdapter(MANIFEST_WITH_PAGINATOR, MAXIMUM_NUMBER_OF_PAGES_PER_SLICE, MAXIMUM_NUMBER_OF_SLICES) + streams = adapter.get_http_streams(config={}) + + assert streams + for stream in streams: + assert isinstance(stream, SimpleRetrieverTestReadDecorator) + assert isinstance(stream.paginator, PaginatorTestReadDecorator) From 62c0972de30f0311f0e63ff12db21ab62ba653d1 Mon Sep 17 00:00:00 2001 From: Jonathan Pearlin Date: Tue, 24 Jan 2023 10:33:29 -0500 Subject: [PATCH 061/195] Return set of role labels (#21751) --- .../io/airbyte/commons/auth/AuthRole.java | 5 ++-- .../io/airbyte/commons/auth/AuthRoleTest.java | 28 ++++++++++--------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRole.java b/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRole.java index b2ff02702545f..63b176034100a 100644 --- a/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRole.java +++ b/airbyte-commons/src/main/java/io/airbyte/commons/auth/AuthRole.java @@ -70,9 +70,9 @@ public String getLabel() { *

    * * @param authRole An {@link AuthRole} (may be {@code null}). - * @return The set of {@link AuthRole}s based on the provided {@link AuthRole}. + * @return The set of {@link AuthRole} labels based on the provided {@link AuthRole}. */ - public static Set buildAuthRolesSet(final AuthRole authRole) { + public static Set buildAuthRolesSet(final AuthRole authRole) { final Set authRoles = new HashSet<>(); if (authRole != null) { @@ -86,6 +86,7 @@ public static Set buildAuthRolesSet(final AuthRole authRole) { // Sort final set by descending authority order return authRoles.stream() .sorted(Comparator.comparingInt(AuthRole::getAuthority)) + .map(role -> role.getLabel()) .collect(Collectors.toCollection(LinkedHashSet::new)); } diff --git a/airbyte-commons/src/test/java/io/airbyte/commons/auth/AuthRoleTest.java b/airbyte-commons/src/test/java/io/airbyte/commons/auth/AuthRoleTest.java index 835488fdd84a1..0db106bcfd1f5 100644 --- a/airbyte-commons/src/test/java/io/airbyte/commons/auth/AuthRoleTest.java +++ b/airbyte-commons/src/test/java/io/airbyte/commons/auth/AuthRoleTest.java @@ -16,31 +16,33 @@ class AuthRoleTest { @Test void testBuildingAuthRoleSet() { - final Set ownerResult = AuthRole.buildAuthRolesSet(AuthRole.OWNER); + final Set ownerResult = AuthRole.buildAuthRolesSet(AuthRole.OWNER); assertEquals(5, ownerResult.size()); - assertEquals(Set.of(AuthRole.OWNER, AuthRole.ADMIN, AuthRole.EDITOR, AuthRole.READER, AuthRole.AUTHENTICATED_USER), ownerResult); + assertEquals(Set.of(AuthRole.OWNER.getLabel(), AuthRole.ADMIN.getLabel(), AuthRole.EDITOR.getLabel(), AuthRole.READER.getLabel(), + AuthRole.AUTHENTICATED_USER.getLabel()), ownerResult); - final Set adminResult = AuthRole.buildAuthRolesSet(AuthRole.ADMIN); + final Set adminResult = AuthRole.buildAuthRolesSet(AuthRole.ADMIN); assertEquals(4, adminResult.size()); - assertEquals(Set.of(AuthRole.ADMIN, AuthRole.EDITOR, AuthRole.READER, AuthRole.AUTHENTICATED_USER), adminResult); + assertEquals(Set.of(AuthRole.ADMIN.getLabel(), AuthRole.EDITOR.getLabel(), AuthRole.READER.getLabel(), AuthRole.AUTHENTICATED_USER.getLabel()), + adminResult); - final Set editorResult = AuthRole.buildAuthRolesSet(AuthRole.EDITOR); + final Set editorResult = AuthRole.buildAuthRolesSet(AuthRole.EDITOR); assertEquals(3, editorResult.size()); - assertEquals(Set.of(AuthRole.EDITOR, AuthRole.READER, AuthRole.AUTHENTICATED_USER), editorResult); + assertEquals(Set.of(AuthRole.EDITOR.getLabel(), AuthRole.READER.getLabel(), AuthRole.AUTHENTICATED_USER.getLabel()), editorResult); - final Set readerResult = AuthRole.buildAuthRolesSet(AuthRole.READER); + final Set readerResult = AuthRole.buildAuthRolesSet(AuthRole.READER); assertEquals(2, readerResult.size()); - assertEquals(Set.of(AuthRole.READER, AuthRole.AUTHENTICATED_USER), readerResult); + assertEquals(Set.of(AuthRole.READER.getLabel(), AuthRole.AUTHENTICATED_USER.getLabel()), readerResult); - final Set authenticatedUserResult = AuthRole.buildAuthRolesSet(AuthRole.AUTHENTICATED_USER); + final Set authenticatedUserResult = AuthRole.buildAuthRolesSet(AuthRole.AUTHENTICATED_USER); assertEquals(1, authenticatedUserResult.size()); - assertEquals(Set.of(AuthRole.AUTHENTICATED_USER), authenticatedUserResult); + assertEquals(Set.of(AuthRole.AUTHENTICATED_USER.getLabel()), authenticatedUserResult); - final Set noneResult = AuthRole.buildAuthRolesSet(AuthRole.NONE); + final Set noneResult = AuthRole.buildAuthRolesSet(AuthRole.NONE); assertEquals(1, noneResult.size()); - assertEquals(Set.of(AuthRole.NONE), noneResult); + assertEquals(Set.of(AuthRole.NONE.getLabel()), noneResult); - final Set nullResult = AuthRole.buildAuthRolesSet(null); + final Set nullResult = AuthRole.buildAuthRolesSet(null); assertEquals(0, nullResult.size()); } From daa8eb19db81f81130d25f1ba300868d8856e188 Mon Sep 17 00:00:00 2001 From: Maxime Carbonneau-Leclerc Date: Tue, 24 Jan 2023 10:36:08 -0500 Subject: [PATCH 062/195] [ISSUE #19981] improve changelog in slack notification (#21791) --- .github/workflows/publish-cdk-command-manually.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-cdk-command-manually.yml b/.github/workflows/publish-cdk-command-manually.yml index c51ffa0bf0ad8..7e607f2aca804 100644 --- a/.github/workflows/publish-cdk-command-manually.yml +++ b/.github/workflows/publish-cdk-command-manually.yml @@ -178,14 +178,14 @@ jobs: "type": "section", "text": { "type": "mrkdwn", - "text": "A new version of Airbyte CDK has been released!\n\n" + "text": "A new version of Airbyte CDK has been released with changelog: ${{ github.event.inputs.changelog-message }}!\n\n" } }, { "type": "section", "text": { "type": "mrkdwn", - "text": "See details on and \n" + "text": "See details on \n" } } ] From 0b97ce3d6c925099c0d8d1a8e69ef22a45dbc9e3 Mon Sep 17 00:00:00 2001 From: Benoit Moriceau Date: Tue, 24 Jan 2023 07:51:20 -0800 Subject: [PATCH 063/195] Extract split the server into 2 modules (#21736) * tmp * For diff * Extract common server * Format * Better way to get resources * Extract the old mapper * Move test as well * Format --- airbyte-commons-server/build.gradle | 69 ++++++++++++++++++ .../commons}/server/RequestLogger.java | 2 +- .../commons}/server/ServerConstants.java | 2 +- .../server/converters/ApiPojoConverters.java | 4 +- .../converters/CatalogDiffConverters.java | 2 +- .../converters/ConfigurationUpdate.java | 2 +- .../server/converters/JobConverter.java | 6 +- .../converters/NotificationConverter.java | 2 +- .../converters/OauthModelConverter.java | 2 +- .../converters/OperationsConverter.java | 2 +- .../server/converters/SpecFetcher.java | 4 +- .../converters/WorkflowStateConverter.java | 2 +- .../WorkspaceWebhookConfigsConverter.java | 2 +- .../ApplicationErrorKnownException.java | 2 +- .../errors/BadObjectSchemaKnownException.java | 2 +- .../errors/ConnectFailureKnownException.java | 2 +- .../errors/IdNotFoundExceptionMapper.java | 2 +- .../errors/IdNotFoundKnownException.java | 2 +- .../errors/InternalServerKnownException.java | 2 +- .../errors/InvalidInputExceptionMapper.java | 47 ++++++++++++ .../errors/InvalidJsonExceptionMapper.java | 2 +- .../InvalidJsonInputExceptionMapper.java | 2 +- .../server/errors/KnownException.java | 2 +- .../server/errors/KnownExceptionMapper.java | 2 +- .../errors/NotFoundExceptionMapper.java | 2 +- .../errors/UncaughtExceptionMapper.java | 2 +- .../UnsupportedProtocolVersionException.java | 2 +- .../errors/ValueConflictKnownException.java | 2 +- .../server/handlers/AttemptHandler.java | 2 +- .../server/handlers/ConnectionsHandler.java | 18 ++--- .../DestinationDefinitionsHandler.java | 23 +++--- .../server/handlers/DestinationHandler.java | 4 +- .../server/handlers/HealthCheckHandler.java | 2 +- .../server/handlers/JobHistoryHandler.java | 6 +- .../commons}/server/handlers/LogsHandler.java | 2 +- .../server/handlers/OAuthHandler.java | 4 +- .../server/handlers/OpenApiConfigHandler.java | 2 +- .../server/handlers/OperationsHandler.java | 4 +- .../server/handlers/SchedulerHandler.java | 20 ++--- .../handlers/SourceDefinitionsHandler.java | 23 +++--- .../server/handlers/SourceHandler.java | 6 +- .../server/handlers/StateHandler.java | 2 +- .../WebBackendCheckUpdatesHandler.java | 4 +- .../WebBackendConnectionsHandler.java | 8 +- .../WebBackendGeographiesHandler.java | 2 +- .../server/handlers/WorkspacesHandler.java | 14 ++-- .../handlers/helpers/CatalogConverter.java | 2 +- .../handlers/helpers/ConnectionMatcher.java | 2 +- .../helpers/ConnectionScheduleHelper.java | 4 +- .../handlers/helpers/DestinationMatcher.java | 2 +- .../server/handlers/helpers/Matchable.java | 2 +- .../handlers/helpers/OAuthPathExtractor.java | 2 +- .../handlers/helpers/SourceMatcher.java | 2 +- .../DefaultSynchronousSchedulerClient.java | 2 +- .../server/scheduler/EventRunner.java | 2 +- .../scheduler/SynchronousJobMetadata.java | 2 +- .../server/scheduler/SynchronousResponse.java | 2 +- .../scheduler/SynchronousSchedulerClient.java | 2 +- .../server/scheduler/TemporalEventRunner.java | 2 +- .../server/services/AirbyteGithubStore.java | 2 +- .../commons}/server/RequestLoggerTest.java | 2 +- .../converters/CatalogConverterTest.java | 10 +-- .../converters/CatalogDiffConvertersTest.java | 2 +- .../converters/ConfigurationUpdateTest.java | 2 +- .../server/converters/JobConverterTest.java | 2 +- .../converters/OauthModelConverterTest.java | 2 +- .../server/handlers/AttemptHandlerTest.java | 2 +- .../ConnectionSchedulerHelperTest.java | 4 +- .../handlers/ConnectionsHandlerTest.java | 14 ++-- .../DestinationDefinitionsHandlerTest.java | 14 ++-- .../handlers/DestinationHandlerTest.java | 8 +- .../handlers/HealthCheckHandlerTest.java | 2 +- .../handlers/JobHistoryHandlerTest.java | 14 ++-- .../server/handlers/LogsHandlerTest.java | 2 +- .../server/handlers/OAuthHandlerTest.java | 2 +- .../handlers/OpenApiConfigHandlerTest.java | 2 +- .../handlers/OperationsHandlerTest.java | 2 +- .../server/handlers/SchedulerHandlerTest.java | 22 +++--- .../SourceDefinitionsHandlerTest.java | 14 ++-- .../server/handlers/SourceHandlerTest.java | 12 +-- .../server/handlers/StateHandlerTest.java | 2 +- .../WebBackendCheckUpdatesHandlerTest.java | 4 +- .../WebBackendConnectionsHandlerTest.java | 16 ++-- .../WebBackendGeographiesHandlerTest.java | 2 +- .../handlers/WorkspacesHandlerTest.java | 4 +- .../helper/OAuthPathExtractorTest.java | 4 +- .../server/helpers/ConnectionHelpers.java | 6 +- .../ConnectorSpecificationHelpers.java | 4 +- .../helpers/DestinationDefinitionHelpers.java | 2 +- .../server/helpers/DestinationHelpers.java | 6 +- .../helpers/SourceDefinitionHelpers.java | 2 +- .../server/helpers/SourceHelpers.java | 6 +- ...DefaultSynchronousSchedulerClientTest.java | 2 +- .../services/AirbyteGithubStoreTest.java | 2 +- .../test/resources/icons/test-destination.svg | 0 .../src/test/resources/icons/test-source.svg | 0 .../resources/json/TestImplementation.json | 0 .../resources/json/TestSpecification.json | 0 .../03a4c904-c91d-447f-ab59-27a43b52c2fd.gz | Bin .../4e00862d-5484-4f50-9860-f3bbb4317397.json | 0 .../5434615d-a3b7-4351-bc6b-a9a695555a30.json | 0 .../28ffee2b-372a-4f72-9b95-8ed56a8b99c5.json | 0 .../e48cae1a-1f5c-42cc-9ec1-a44ff7fb4969.json | 0 .../22f6c74f-5699-40ff-833c-4a879ea40133.json | 0 .../25c5221d-dce2-4163-ade9-739ef790f503.json | 0 .../424892c4-daac-4491-b35d-c6688ba547ba.json | 0 .../8be1cf83-fde1-477f-a4ad-318d23c9f3c6.json | 0 .../a625d593-bba5-4a1c-a53d-2d246268a816.json | 0 .../af7c921e-5892-4ff2-b6c1-4a5ab258fb7e.json | 0 .../f7a7d195-377f-cf5b-70a5-be6b819019dc.json | 0 .../00405b19-9768-4e0c-b1ae-9fc2ee2b2a8c.json | 0 .../2470e835-feaf-4db6-96f3-70fd645acc77.json | 0 .../2af123bf-0aaf-4e0d-9784-cb497f23741a.json | 0 .../396e4ca3-8a97-4b85-aa4e-c9d8c2d5f992.json | 0 .../41375467-61ae-4204-8e38-e2b8b7365f23.json | 0 .../435bb9a5-7887-4809-aa58-28c27df0d7ad.json | 0 .../445831eb-78db-4b1f-8f1f-0d96ad8739e2.json | 0 .../4eb22946-2a79-4d20-a3e6-effd234613c3.json | 0 .../57eb1576-8f52-463d-beb6-2e107cdf571d.json | 0 .../59f1e50a-331f-4f09-b3e8-2e8d4d355f44.json | 0 .../68e63de2-bb83-4c7e-93fa-a8a9051e3993.json | 0 .../71607ba1-c0ac-4799-8049-7f4b90dd50f7.json | 0 .../778daa7c-feaf-4db6-96f3-70fd645acc77.json | 0 .../859e501d-2b67-471f-91bb-1c801414d28f.json | 0 .../9e0556f4-69df-4522-a3fb-03264d36b348.json | 0 .../9fed261d-d107-47fd-8c8b-323023db6e20.json | 0 .../aea2fd0d-377d-465e-86c0-4fdc4f688e51.json | 0 .../b03a9f3e-22a5-11eb-adc1-0242ac120002.json | 0 .../b1892b11-788d-44bd-b9ec-3a436f7b54ce.json | 0 .../b5ea17b1-f170-46dc-bc31-cc744ca984c1.json | 0 .../cd42861b-01fc-4658-a8ab-5d11d0510f01.json | 0 .../d2147be5-fa36-4936-977e-f031affa5895.json | 0 .../d29764f8-80d7-4dd7-acbe-1a42005ee5aa.json | 0 .../d8313939-3782-41b0-be29-b3ca20d8dd3a.json | 0 .../decd338e-5647-4c0b-adf4-da0e75f5a750.json | 0 .../e094cb9a-26de-4645-8761-65c0c425d1de.json | 0 .../e7778cfc-e97c-4458-9ecb-b4f2bba8946c.json | 0 .../e87ffa8e-a3b5-f69c-9076-6011339de1f6.json | 0 .../eaf50f04-21dd-4620-913b-2a83f5635227.json | 0 .../ec4b9503-13cb-48ab-a4ab-6ade4be46567.json | 0 .../ed799e2b-2158-4c66-8da4-b40fe63bc72a.json | 0 .../ef69ef6e-aa7f-4af1-a01d-ef775033524e.json | 0 .../fbb5fbe2-16ad-4cf4-af7d-ff9d9c316c87.json | 0 .../49dae3f0-158b-4737-b6e4-0eed77d4b74e.json | 0 .../a294256f-1abe-4837-925f-91602c7207b4.json | 0 .../49dae3f0-158b-4737-b6e4-0eed77d4b74e.json | 0 .../a294256f-1abe-4837-925f-91602c7207b4.json | 0 .../5ae6b09b-fdec-41af-aaf7-7d94cfc33ef6.json | 0 .../src/test/resources/migration/schema.sql | 0 airbyte-server/build.gradle | 1 + .../java/io/airbyte/server/ServerApp.java | 13 ++-- .../java/io/airbyte/server/ServerFactory.java | 6 +- .../io/airbyte/server/apis/ApiHelper.java | 4 +- .../server/apis/AttemptApiController.java | 2 +- .../server/apis/ConnectionApiController.java | 6 +- .../server/apis/DestinationApiController.java | 4 +- .../DestinationDefinitionApiController.java | 2 +- ...nDefinitionSpecificationApiController.java | 2 +- .../apis/DestinationOauthApiController.java | 2 +- .../server/apis/HealthApiController.java | 2 +- .../server/apis/JobsApiController.java | 4 +- .../server/apis/LogsApiController.java | 2 +- .../apis/NotificationsApiController.java | 2 +- .../server/apis/OpenapiApiController.java | 2 +- .../server/apis/OperationApiController.java | 2 +- .../server/apis/SchedulerApiController.java | 2 +- .../server/apis/SourceApiController.java | 4 +- .../apis/SourceDefinitionApiController.java | 2 +- ...eDefinitionSpecificationApiController.java | 2 +- .../server/apis/SourceOauthApiController.java | 2 +- .../server/apis/StateApiController.java | 2 +- .../server/apis/WebBackendApiController.java | 6 +- .../server/apis/WorkspaceApiController.java | 2 +- .../server/config/ApplicationBeanFactory.java | 6 +- .../server/config/TemporalBeanFactory.java | 4 +- .../errors/InvalidInputExceptionHandler.java | 26 +------ .../errors/InvalidInputExceptionMapper.java | 24 ------ .../errors/InvalidJsonExceptionHandler.java | 1 + .../InvalidJsonInputExceptionHandler.java | 1 + .../server/errors/KnownExceptionHandler.java | 1 + .../errors/NotFoundExceptionHandler.java | 2 + .../errors/UncaughtExceptionHandler.java | 1 + .../server/apis/HealthCheckApiTest.java | 2 +- gradle.properties | 2 +- settings.gradle | 3 + 185 files changed, 389 insertions(+), 310 deletions(-) create mode 100644 airbyte-commons-server/build.gradle rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/RequestLogger.java (99%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/ServerConstants.java (81%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/ApiPojoConverters.java (99%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/CatalogDiffConverters.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/ConfigurationUpdate.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/JobConverter.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/NotificationConverter.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/OauthModelConverter.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/OperationsConverter.java (99%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/SpecFetcher.java (82%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/WorkflowStateConverter.java (90%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/converters/WorkspaceWebhookConfigsConverter.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/ApplicationErrorKnownException.java (90%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/BadObjectSchemaKnownException.java (90%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/ConnectFailureKnownException.java (90%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/IdNotFoundExceptionMapper.java (96%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/IdNotFoundKnownException.java (96%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/InternalServerKnownException.java (90%) create mode 100644 airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidInputExceptionMapper.java rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/InvalidJsonExceptionMapper.java (93%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/InvalidJsonInputExceptionMapper.java (94%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/KnownException.java (96%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/KnownExceptionMapper.java (95%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/NotFoundExceptionMapper.java (96%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/UncaughtExceptionMapper.java (95%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/UnsupportedProtocolVersionException.java (94%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/errors/ValueConflictKnownException.java (90%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/AttemptHandler.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/ConnectionsHandler.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/DestinationDefinitionsHandler.java (96%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/DestinationHandler.java (99%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/HealthCheckHandler.java (92%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/JobHistoryHandler.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/LogsHandler.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/OAuthHandler.java (99%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/OpenApiConfigHandler.java (93%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/OperationsHandler.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/SchedulerHandler.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/SourceDefinitionsHandler.java (95%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/SourceHandler.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/StateHandler.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/WebBackendCheckUpdatesHandler.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/WebBackendConnectionsHandler.java (99%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/WebBackendGeographiesHandler.java (95%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/WorkspacesHandler.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/helpers/CatalogConverter.java (99%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/helpers/ConnectionMatcher.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/helpers/ConnectionScheduleHelper.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/helpers/DestinationMatcher.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/helpers/Matchable.java (71%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/helpers/OAuthPathExtractor.java (96%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/handlers/helpers/SourceMatcher.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/scheduler/DefaultSynchronousSchedulerClient.java (99%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/scheduler/EventRunner.java (95%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/scheduler/SynchronousJobMetadata.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/scheduler/SynchronousResponse.java (98%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/scheduler/SynchronousSchedulerClient.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/scheduler/TemporalEventRunner.java (97%) rename {airbyte-server/src/main/java/io/airbyte => airbyte-commons-server/src/main/java/io/airbyte/commons}/server/services/AirbyteGithubStore.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/RequestLoggerTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/converters/CatalogConverterTest.java (95%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/converters/CatalogDiffConvertersTest.java (94%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/converters/ConfigurationUpdateTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/converters/JobConverterTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/converters/OauthModelConverterTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/AttemptHandlerTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/ConnectionSchedulerHelperTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/ConnectionsHandlerTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/DestinationDefinitionsHandlerTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/DestinationHandlerTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/HealthCheckHandlerTest.java (95%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/JobHistoryHandlerTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/LogsHandlerTest.java (97%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/OAuthHandlerTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/OpenApiConfigHandlerTest.java (92%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/OperationsHandlerTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/SchedulerHandlerTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/SourceDefinitionsHandlerTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/SourceHandlerTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/StateHandlerTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/WebBackendCheckUpdatesHandlerTest.java (98%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/WebBackendConnectionsHandlerTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/WebBackendGeographiesHandlerTest.java (96%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/WorkspacesHandlerTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/handlers/helper/OAuthPathExtractorTest.java (93%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/helpers/ConnectionHelpers.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/helpers/ConnectorSpecificationHelpers.java (82%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/helpers/DestinationDefinitionHelpers.java (92%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/helpers/DestinationHelpers.java (92%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/helpers/SourceDefinitionHelpers.java (92%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/helpers/SourceHelpers.java (90%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/scheduler/DefaultSynchronousSchedulerClientTest.java (99%) rename {airbyte-server/src/test/java/io/airbyte => airbyte-commons-server/src/test/java/io/airbyte/commons}/server/services/AirbyteGithubStoreTest.java (99%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/icons/test-destination.svg (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/icons/test-source.svg (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/json/TestImplementation.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/json/TestSpecification.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/03a4c904-c91d-447f-ab59-27a43b52c2fd.gz (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/4e00862d-5484-4f50-9860-f3bbb4317397.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/5434615d-a3b7-4351-bc6b-a9a695555a30.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/28ffee2b-372a-4f72-9b95-8ed56a8b99c5.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/e48cae1a-1f5c-42cc-9ec1-a44ff7fb4969.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/22f6c74f-5699-40ff-833c-4a879ea40133.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/25c5221d-dce2-4163-ade9-739ef790f503.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/424892c4-daac-4491-b35d-c6688ba547ba.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/8be1cf83-fde1-477f-a4ad-318d23c9f3c6.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/a625d593-bba5-4a1c-a53d-2d246268a816.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/af7c921e-5892-4ff2-b6c1-4a5ab258fb7e.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/f7a7d195-377f-cf5b-70a5-be6b819019dc.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/00405b19-9768-4e0c-b1ae-9fc2ee2b2a8c.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2470e835-feaf-4db6-96f3-70fd645acc77.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2af123bf-0aaf-4e0d-9784-cb497f23741a.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/396e4ca3-8a97-4b85-aa4e-c9d8c2d5f992.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/41375467-61ae-4204-8e38-e2b8b7365f23.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/435bb9a5-7887-4809-aa58-28c27df0d7ad.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/445831eb-78db-4b1f-8f1f-0d96ad8739e2.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/4eb22946-2a79-4d20-a3e6-effd234613c3.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/57eb1576-8f52-463d-beb6-2e107cdf571d.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/59f1e50a-331f-4f09-b3e8-2e8d4d355f44.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/68e63de2-bb83-4c7e-93fa-a8a9051e3993.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/71607ba1-c0ac-4799-8049-7f4b90dd50f7.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/778daa7c-feaf-4db6-96f3-70fd645acc77.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/859e501d-2b67-471f-91bb-1c801414d28f.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9e0556f4-69df-4522-a3fb-03264d36b348.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9fed261d-d107-47fd-8c8b-323023db6e20.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/aea2fd0d-377d-465e-86c0-4fdc4f688e51.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b03a9f3e-22a5-11eb-adc1-0242ac120002.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b1892b11-788d-44bd-b9ec-3a436f7b54ce.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b5ea17b1-f170-46dc-bc31-cc744ca984c1.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/cd42861b-01fc-4658-a8ab-5d11d0510f01.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d2147be5-fa36-4936-977e-f031affa5895.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d29764f8-80d7-4dd7-acbe-1a42005ee5aa.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d8313939-3782-41b0-be29-b3ca20d8dd3a.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/decd338e-5647-4c0b-adf4-da0e75f5a750.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e094cb9a-26de-4645-8761-65c0c425d1de.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e7778cfc-e97c-4458-9ecb-b4f2bba8946c.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e87ffa8e-a3b5-f69c-9076-6011339de1f6.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/eaf50f04-21dd-4620-913b-2a83f5635227.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ec4b9503-13cb-48ab-a4ab-6ade4be46567.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ed799e2b-2158-4c66-8da4-b40fe63bc72a.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ef69ef6e-aa7f-4af1-a01d-ef775033524e.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/fbb5fbe2-16ad-4cf4-af7d-ff9d9c316c87.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/a294256f-1abe-4837-925f-91602c7207b4.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/a294256f-1abe-4837-925f-91602c7207b4.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/dummy_data/config/STANDARD_WORKSPACE/5ae6b09b-fdec-41af-aaf7-7d94cfc33ef6.json (100%) rename {airbyte-server => airbyte-commons-server}/src/test/resources/migration/schema.sql (100%) delete mode 100644 airbyte-server/src/main/java/io/airbyte/server/errors/InvalidInputExceptionMapper.java diff --git a/airbyte-commons-server/build.gradle b/airbyte-commons-server/build.gradle new file mode 100644 index 0000000000000..f0ea82dcb4e5f --- /dev/null +++ b/airbyte-commons-server/build.gradle @@ -0,0 +1,69 @@ +plugins { + id "java-library" +} + +dependencies { + annotationProcessor platform(libs.micronaut.bom) + annotationProcessor libs.bundles.micronaut.annotation.processor + annotationProcessor libs.micronaut.jaxrs.processor + + implementation platform(libs.micronaut.bom) + implementation libs.bundles.micronaut + implementation libs.micronaut.jaxrs.server + + // Ensure that the versions defined in deps.toml are used + // instead of versions from transitive dependencies + implementation(libs.flyway.core) { + force = true + } + implementation(libs.s3) { + // Force to avoid updated version brought in transitively from Micronaut 3.8+ + // that is incompatible with our current Helm setup + force = true + } + implementation(libs.aws.java.sdk.s3) { + // Force to avoid updated version brought in transitively from Micronaut 3.8+ + // that is incompatible with our current Helm setup + force = true + } + + implementation project(':airbyte-analytics') + implementation project(':airbyte-api') + implementation project(':airbyte-commons-docker') + implementation project(':airbyte-commons-temporal') + implementation project(':airbyte-commons-worker') + implementation project(':airbyte-config:init') + implementation project(':airbyte-config:config-models') + implementation project(':airbyte-config:config-persistence') + implementation project(':airbyte-config:specs') + implementation project(':airbyte-metrics:metrics-lib') + implementation project(':airbyte-db:db-lib') + implementation project(":airbyte-json-validation") + implementation project(':airbyte-notification') + implementation project(':airbyte-oauth') + implementation project(':airbyte-protocol:protocol-models') + implementation project(':airbyte-persistence:job-persistence') + + implementation 'com.github.slugify:slugify:2.4' + implementation 'commons-cli:commons-cli:1.4' + implementation libs.temporal.sdk + implementation 'org.apache.cxf:cxf-core:3.4.2' + implementation 'org.eclipse.jetty:jetty-server:9.4.31.v20200723' + implementation 'org.eclipse.jetty:jetty-servlet:9.4.31.v20200723' + implementation 'org.glassfish.jaxb:jaxb-runtime:3.0.2' + implementation 'org.glassfish.jersey.containers:jersey-container-servlet' + implementation 'org.glassfish.jersey.inject:jersey-hk2' + implementation 'org.glassfish.jersey.media:jersey-media-json-jackson' + implementation 'org.glassfish.jersey.ext:jersey-bean-validation' + implementation 'org.quartz-scheduler:quartz:2.3.2' + implementation 'io.sentry:sentry:6.3.1' + implementation 'io.swagger:swagger-annotations:1.6.2' + + testImplementation project(':airbyte-test-utils') + testImplementation libs.postgresql + testImplementation libs.platform.testcontainers.postgresql + testImplementation 'com.squareup.okhttp3:mockwebserver:4.9.1' + testImplementation 'org.mockito:mockito-inline:4.7.0' +} + +Task publishArtifactsTask = getPublishArtifactsTask("$rootProject.ext.version", project) \ No newline at end of file diff --git a/airbyte-server/src/main/java/io/airbyte/server/RequestLogger.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/RequestLogger.java similarity index 99% rename from airbyte-server/src/main/java/io/airbyte/server/RequestLogger.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/RequestLogger.java index 6406d6b860262..2d43ff574a2c4 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/RequestLogger.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/RequestLogger.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server; +package io.airbyte.commons.server; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerConstants.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/ServerConstants.java similarity index 81% rename from airbyte-server/src/main/java/io/airbyte/server/ServerConstants.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/ServerConstants.java index 6c40fc37ba917..6c8a3ececc294 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerConstants.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/ServerConstants.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server; +package io.airbyte.commons.server; public class ServerConstants { diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/ApiPojoConverters.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/ApiPojoConverters.java similarity index 99% rename from airbyte-server/src/main/java/io/airbyte/server/converters/ApiPojoConverters.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/ApiPojoConverters.java index 9b85de35c34b0..ea63090306765 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/ApiPojoConverters.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/ApiPojoConverters.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import io.airbyte.api.model.generated.ActorDefinitionResourceRequirements; import io.airbyte.api.model.generated.ConnectionRead; @@ -18,10 +18,10 @@ import io.airbyte.api.model.generated.NormalizationDestinationDefinitionConfig; import io.airbyte.api.model.generated.ResourceRequirements; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; import io.airbyte.config.BasicSchedule; import io.airbyte.config.Schedule; import io.airbyte.config.StandardSync; -import io.airbyte.server.handlers.helpers.CatalogConverter; import java.util.stream.Collectors; public class ApiPojoConverters { diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/CatalogDiffConverters.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/CatalogDiffConverters.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/converters/CatalogDiffConverters.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/CatalogDiffConverters.java index 181be5454880e..7b14abe1f2be4 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/CatalogDiffConverters.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/CatalogDiffConverters.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import io.airbyte.api.model.generated.FieldAdd; import io.airbyte.api.model.generated.FieldRemove; diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/ConfigurationUpdate.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/ConfigurationUpdate.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/converters/ConfigurationUpdate.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/ConfigurationUpdate.java index 8eaf31178ac71..0b0fc05be5b49 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/ConfigurationUpdate.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/ConfigurationUpdate.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import com.fasterxml.jackson.databind.JsonNode; import io.airbyte.commons.json.Jsons; diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/JobConverter.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/JobConverter.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/converters/JobConverter.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/JobConverter.java index 9a3d479749e0f..ad138b919c3d3 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/JobConverter.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/JobConverter.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import io.airbyte.api.model.generated.AttemptFailureOrigin; import io.airbyte.api.model.generated.AttemptFailureReason; @@ -28,6 +28,8 @@ import io.airbyte.api.model.generated.SourceDefinitionRead; import io.airbyte.api.model.generated.SynchronousJobRead; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.server.scheduler.SynchronousJobMetadata; +import io.airbyte.commons.server.scheduler.SynchronousResponse; import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs.WorkerEnvironment; import io.airbyte.config.JobConfig.ConfigType; @@ -42,8 +44,6 @@ import io.airbyte.persistence.job.models.Attempt; import io.airbyte.persistence.job.models.AttemptNormalizationStatus; import io.airbyte.persistence.job.models.Job; -import io.airbyte.server.scheduler.SynchronousJobMetadata; -import io.airbyte.server.scheduler.SynchronousResponse; import io.airbyte.workers.helper.ProtocolConverters; import jakarta.inject.Singleton; import java.io.IOException; diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/NotificationConverter.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/NotificationConverter.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/converters/NotificationConverter.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/NotificationConverter.java index c24346a123f58..50fc1a1f36013 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/NotificationConverter.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/NotificationConverter.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import io.airbyte.commons.enums.Enums; import java.util.Collections; diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/OauthModelConverter.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/OauthModelConverter.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/converters/OauthModelConverter.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/OauthModelConverter.java index 78c44bcda3d18..86220d17a7bff 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/OauthModelConverter.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/OauthModelConverter.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import io.airbyte.api.model.generated.AdvancedAuth; import io.airbyte.api.model.generated.AdvancedAuth.AuthFlowTypeEnum; diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/OperationsConverter.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/OperationsConverter.java similarity index 99% rename from airbyte-server/src/main/java/io/airbyte/server/converters/OperationsConverter.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/OperationsConverter.java index 9862ba52b6111..b390f51f486d9 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/OperationsConverter.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/OperationsConverter.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import static io.airbyte.api.model.generated.OperatorWebhook.WebhookTypeEnum.DBTCLOUD; diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/SpecFetcher.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/SpecFetcher.java similarity index 82% rename from airbyte-server/src/main/java/io/airbyte/server/converters/SpecFetcher.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/SpecFetcher.java index 5934e6fb7756f..6c46d76499905 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/SpecFetcher.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/SpecFetcher.java @@ -2,11 +2,11 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import com.google.common.base.Preconditions; +import io.airbyte.commons.server.scheduler.SynchronousResponse; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.scheduler.SynchronousResponse; public class SpecFetcher { diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/WorkflowStateConverter.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/WorkflowStateConverter.java similarity index 90% rename from airbyte-server/src/main/java/io/airbyte/server/converters/WorkflowStateConverter.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/WorkflowStateConverter.java index 76bd67ab20675..4f0d8a526734d 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/WorkflowStateConverter.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/WorkflowStateConverter.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import io.airbyte.api.model.generated.WorkflowStateRead; import io.airbyte.commons.temporal.scheduling.state.WorkflowState; diff --git a/airbyte-server/src/main/java/io/airbyte/server/converters/WorkspaceWebhookConfigsConverter.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/WorkspaceWebhookConfigsConverter.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/converters/WorkspaceWebhookConfigsConverter.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/WorkspaceWebhookConfigsConverter.java index a8a86b838d2b8..68826e525fef1 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/converters/WorkspaceWebhookConfigsConverter.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/converters/WorkspaceWebhookConfigsConverter.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import com.fasterxml.jackson.databind.JsonNode; import io.airbyte.api.model.generated.WebhookConfigRead; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/ApplicationErrorKnownException.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ApplicationErrorKnownException.java similarity index 90% rename from airbyte-server/src/main/java/io/airbyte/server/errors/ApplicationErrorKnownException.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ApplicationErrorKnownException.java index 69f3c86c58581..371601e85d49e 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/ApplicationErrorKnownException.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ApplicationErrorKnownException.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; public class ApplicationErrorKnownException extends KnownException { diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/BadObjectSchemaKnownException.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/BadObjectSchemaKnownException.java similarity index 90% rename from airbyte-server/src/main/java/io/airbyte/server/errors/BadObjectSchemaKnownException.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/BadObjectSchemaKnownException.java index 5e880ba3483fe..34b455a6e4a55 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/BadObjectSchemaKnownException.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/BadObjectSchemaKnownException.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; public class BadObjectSchemaKnownException extends KnownException { diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/ConnectFailureKnownException.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ConnectFailureKnownException.java similarity index 90% rename from airbyte-server/src/main/java/io/airbyte/server/errors/ConnectFailureKnownException.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ConnectFailureKnownException.java index 1b3c462d90e47..5997ce894a8d9 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/ConnectFailureKnownException.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ConnectFailureKnownException.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; public class ConnectFailureKnownException extends KnownException { diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/IdNotFoundExceptionMapper.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/IdNotFoundExceptionMapper.java similarity index 96% rename from airbyte-server/src/main/java/io/airbyte/server/errors/IdNotFoundExceptionMapper.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/IdNotFoundExceptionMapper.java index 4cd9b709cf040..0dfc234bee286 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/IdNotFoundExceptionMapper.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/IdNotFoundExceptionMapper.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpRequest; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/IdNotFoundKnownException.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/IdNotFoundKnownException.java similarity index 96% rename from airbyte-server/src/main/java/io/airbyte/server/errors/IdNotFoundKnownException.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/IdNotFoundKnownException.java index 460e48dc13390..76699cceb8d82 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/IdNotFoundKnownException.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/IdNotFoundKnownException.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import io.airbyte.api.model.generated.NotFoundKnownExceptionInfo; import org.apache.logging.log4j.core.util.Throwables; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/InternalServerKnownException.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InternalServerKnownException.java similarity index 90% rename from airbyte-server/src/main/java/io/airbyte/server/errors/InternalServerKnownException.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InternalServerKnownException.java index 7900e02f24513..4b9fd4b28419b 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/InternalServerKnownException.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InternalServerKnownException.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; public class InternalServerKnownException extends KnownException { diff --git a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidInputExceptionMapper.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidInputExceptionMapper.java new file mode 100644 index 0000000000000..fd8b0b368a698 --- /dev/null +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidInputExceptionMapper.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.commons.server.errors; + +import io.airbyte.api.model.generated.InvalidInputExceptionInfo; +import io.airbyte.api.model.generated.InvalidInputProperty; +import io.airbyte.commons.json.Jsons; +import java.util.ArrayList; +import java.util.List; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; +import org.apache.logging.log4j.core.util.Throwables; + +@Provider +public class InvalidInputExceptionMapper implements ExceptionMapper { + + public static InvalidInputExceptionInfo infoFromConstraints(final ConstraintViolationException cve) { + final InvalidInputExceptionInfo exceptionInfo = new InvalidInputExceptionInfo() + .exceptionClassName(cve.getClass().getName()) + .message("Some properties contained invalid input.") + .exceptionStack(Throwables.toStringList(cve)); + + final List props = new ArrayList(); + for (final ConstraintViolation cv : cve.getConstraintViolations()) { + props.add(new InvalidInputProperty() + .propertyPath(cv.getPropertyPath().toString()) + .message(cv.getMessage()) + .invalidValue(cv.getInvalidValue() != null ? cv.getInvalidValue().toString() : "null")); + } + exceptionInfo.validationErrors(props); + return exceptionInfo; + } + + @Override + public Response toResponse(final ConstraintViolationException e) { + return Response.status(Response.Status.BAD_REQUEST) + .entity(Jsons.serialize(InvalidInputExceptionMapper.infoFromConstraints(e))) + .type("application/json") + .build(); + } + +} diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonExceptionMapper.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidJsonExceptionMapper.java similarity index 93% rename from airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonExceptionMapper.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidJsonExceptionMapper.java index c126f12993254..a073c369aca57 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonExceptionMapper.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidJsonExceptionMapper.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import com.fasterxml.jackson.core.JsonParseException; import javax.ws.rs.core.Response; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonInputExceptionMapper.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidJsonInputExceptionMapper.java similarity index 94% rename from airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonInputExceptionMapper.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidJsonInputExceptionMapper.java index 90700f7717821..d504333c4f0eb 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonInputExceptionMapper.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/InvalidJsonInputExceptionMapper.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import com.fasterxml.jackson.databind.JsonMappingException; import io.airbyte.commons.json.Jsons; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/KnownException.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/KnownException.java similarity index 96% rename from airbyte-server/src/main/java/io/airbyte/server/errors/KnownException.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/KnownException.java index d9b5716a8c6c4..2067e3d872996 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/KnownException.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/KnownException.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import io.airbyte.api.model.generated.KnownExceptionInfo; import org.apache.logging.log4j.core.util.Throwables; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/KnownExceptionMapper.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/KnownExceptionMapper.java similarity index 95% rename from airbyte-server/src/main/java/io/airbyte/server/errors/KnownExceptionMapper.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/KnownExceptionMapper.java index 9d81a3fc7174c..5ead770ad91c3 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/KnownExceptionMapper.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/KnownExceptionMapper.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import io.airbyte.commons.json.Jsons; import io.micronaut.context.annotation.Requires; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/NotFoundExceptionMapper.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/NotFoundExceptionMapper.java similarity index 96% rename from airbyte-server/src/main/java/io/airbyte/server/errors/NotFoundExceptionMapper.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/NotFoundExceptionMapper.java index 0317cdf952cb4..93a430472a6b0 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/NotFoundExceptionMapper.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/NotFoundExceptionMapper.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import io.airbyte.commons.json.Jsons; import javax.ws.rs.NotFoundException; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/UncaughtExceptionMapper.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/UncaughtExceptionMapper.java similarity index 95% rename from airbyte-server/src/main/java/io/airbyte/server/errors/UncaughtExceptionMapper.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/UncaughtExceptionMapper.java index 3aac5522570e7..8057734d660af 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/UncaughtExceptionMapper.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/UncaughtExceptionMapper.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import io.airbyte.api.model.generated.KnownExceptionInfo; import io.airbyte.commons.json.Jsons; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/UnsupportedProtocolVersionException.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/UnsupportedProtocolVersionException.java similarity index 94% rename from airbyte-server/src/main/java/io/airbyte/server/errors/UnsupportedProtocolVersionException.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/UnsupportedProtocolVersionException.java index 5b83844a54c1b..661e7e40a4855 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/UnsupportedProtocolVersionException.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/UnsupportedProtocolVersionException.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; import io.airbyte.commons.version.Version; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/ValueConflictKnownException.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ValueConflictKnownException.java similarity index 90% rename from airbyte-server/src/main/java/io/airbyte/server/errors/ValueConflictKnownException.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ValueConflictKnownException.java index b84ed0da6472c..c6ac8dbe92ef3 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/ValueConflictKnownException.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/errors/ValueConflictKnownException.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.errors; +package io.airbyte.commons.server.errors; public class ValueConflictKnownException extends KnownException { diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/AttemptHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/AttemptHandler.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/AttemptHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/AttemptHandler.java index 6a07ff3044083..c7132665fe927 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/AttemptHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/AttemptHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import io.airbyte.api.model.generated.InternalOperationResult; import io.airbyte.api.model.generated.SaveStatsRequestBody; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/ConnectionsHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/ConnectionsHandler.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/ConnectionsHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/ConnectionsHandler.java index 12aff047d12a0..698d66716c7dd 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/ConnectionsHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/ConnectionsHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -26,6 +26,14 @@ import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.enums.Enums; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.converters.ApiPojoConverters; +import io.airbyte.commons.server.converters.CatalogDiffConverters; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; +import io.airbyte.commons.server.handlers.helpers.ConnectionMatcher; +import io.airbyte.commons.server.handlers.helpers.ConnectionScheduleHelper; +import io.airbyte.commons.server.handlers.helpers.DestinationMatcher; +import io.airbyte.commons.server.handlers.helpers.SourceMatcher; +import io.airbyte.commons.server.scheduler.EventRunner; import io.airbyte.config.ActorCatalog; import io.airbyte.config.BasicSchedule; import io.airbyte.config.DestinationConnection; @@ -46,14 +54,6 @@ import io.airbyte.persistence.job.WorkspaceHelper; import io.airbyte.protocol.models.CatalogHelpers; import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; -import io.airbyte.server.converters.ApiPojoConverters; -import io.airbyte.server.converters.CatalogDiffConverters; -import io.airbyte.server.handlers.helpers.CatalogConverter; -import io.airbyte.server.handlers.helpers.ConnectionMatcher; -import io.airbyte.server.handlers.helpers.ConnectionScheduleHelper; -import io.airbyte.server.handlers.helpers.DestinationMatcher; -import io.airbyte.server.handlers.helpers.SourceMatcher; -import io.airbyte.server.scheduler.EventRunner; import io.airbyte.validation.json.JsonValidationException; import io.airbyte.workers.helper.ConnectionHelper; import jakarta.inject.Singleton; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationDefinitionsHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/DestinationDefinitionsHandler.java similarity index 96% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationDefinitionsHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/DestinationDefinitionsHandler.java index 8dbd84014459c..813cda084b555 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationDefinitionsHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/DestinationDefinitionsHandler.java @@ -2,9 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; - -import static io.airbyte.server.ServerConstants.DEV_IMAGE_TAG; +package io.airbyte.commons.server.handlers; import com.google.common.annotations.VisibleForTesting; import io.airbyte.api.model.generated.CustomDestinationDefinitionCreate; @@ -21,6 +19,15 @@ import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.docker.DockerUtils; import io.airbyte.commons.resources.MoreResources; +import io.airbyte.commons.server.ServerConstants; +import io.airbyte.commons.server.converters.ApiPojoConverters; +import io.airbyte.commons.server.converters.SpecFetcher; +import io.airbyte.commons.server.errors.IdNotFoundKnownException; +import io.airbyte.commons.server.errors.InternalServerKnownException; +import io.airbyte.commons.server.errors.UnsupportedProtocolVersionException; +import io.airbyte.commons.server.scheduler.SynchronousResponse; +import io.airbyte.commons.server.scheduler.SynchronousSchedulerClient; +import io.airbyte.commons.server.services.AirbyteGithubStore; import io.airbyte.commons.util.MoreLists; import io.airbyte.commons.version.AirbyteProtocolVersion; import io.airbyte.commons.version.AirbyteProtocolVersionRange; @@ -29,14 +36,6 @@ import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.converters.ApiPojoConverters; -import io.airbyte.server.converters.SpecFetcher; -import io.airbyte.server.errors.IdNotFoundKnownException; -import io.airbyte.server.errors.InternalServerKnownException; -import io.airbyte.server.errors.UnsupportedProtocolVersionException; -import io.airbyte.server.scheduler.SynchronousResponse; -import io.airbyte.server.scheduler.SynchronousSchedulerClient; -import io.airbyte.server.services.AirbyteGithubStore; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Singleton; import java.io.IOException; @@ -240,7 +239,7 @@ public DestinationDefinitionRead updateDestinationDefinition(final DestinationDe // specs are re-fetched from the container if the image tag has changed, or if the tag is "dev", // to allow for easier iteration of dev images final boolean specNeedsUpdate = !currentDestination.getDockerImageTag().equals(destinationDefinitionUpdate.getDockerImageTag()) - || destinationDefinitionUpdate.getDockerImageTag().equals(DEV_IMAGE_TAG); + || ServerConstants.DEV_IMAGE_TAG.equals(destinationDefinitionUpdate.getDockerImageTag()); final ConnectorSpecification spec = specNeedsUpdate ? getSpecForImage(currentDestination.getDockerRepository(), destinationDefinitionUpdate.getDockerImageTag(), currentDestination.getCustom()) : currentDestination.getSpec(); diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/DestinationHandler.java similarity index 99% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/DestinationHandler.java index d105a514e0ec5..4a5fa21e52572 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/DestinationHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/DestinationHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.annotations.VisibleForTesting; @@ -20,6 +20,7 @@ import io.airbyte.api.model.generated.DestinationUpdate; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.converters.ConfigurationUpdate; import io.airbyte.config.DestinationConnection; import io.airbyte.config.StandardDestinationDefinition; import io.airbyte.config.persistence.ConfigNotFoundException; @@ -29,7 +30,6 @@ import io.airbyte.config.persistence.split_secrets.JsonSecretsProcessor; import io.airbyte.persistence.job.factory.OAuthConfigSupplier; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.converters.ConfigurationUpdate; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Inject; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/HealthCheckHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/HealthCheckHandler.java similarity index 92% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/HealthCheckHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/HealthCheckHandler.java index 2843fbc2c09d6..bd96e2df625fa 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/HealthCheckHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/HealthCheckHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import io.airbyte.api.model.generated.HealthCheckRead; import io.airbyte.config.persistence.ConfigRepository; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/JobHistoryHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/JobHistoryHandler.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/JobHistoryHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/JobHistoryHandler.java index 579e0b4672a4e..65fddab329572 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/JobHistoryHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/JobHistoryHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import com.google.common.base.Preconditions; import io.airbyte.api.model.generated.AttemptInfoRead; @@ -31,6 +31,8 @@ import io.airbyte.api.model.generated.SourceIdRequestBody; import io.airbyte.api.model.generated.SourceRead; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.server.converters.JobConverter; +import io.airbyte.commons.server.converters.WorkflowStateConverter; import io.airbyte.commons.temporal.TemporalClient; import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs.WorkerEnvironment; @@ -42,8 +44,6 @@ import io.airbyte.persistence.job.JobPersistence.JobAttemptPair; import io.airbyte.persistence.job.models.Job; import io.airbyte.persistence.job.models.JobStatus; -import io.airbyte.server.converters.JobConverter; -import io.airbyte.server.converters.WorkflowStateConverter; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Singleton; import java.io.IOException; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/LogsHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/LogsHandler.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/LogsHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/LogsHandler.java index b9ac2378aca4d..4fb5ce2f8d66d 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/LogsHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/LogsHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import io.airbyte.api.model.generated.LogsRequestBody; import io.airbyte.config.Configs; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/OAuthHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OAuthHandler.java similarity index 99% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/OAuthHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OAuthHandler.java index 6823d6d5a8f60..8a4cb5089d504 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/OAuthHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OAuthHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static io.airbyte.metrics.lib.ApmTraceConstants.Tags.DESTINATION_DEFINITION_ID_KEY; import static io.airbyte.metrics.lib.ApmTraceConstants.Tags.SOURCE_DEFINITION_ID_KEY; @@ -22,6 +22,7 @@ import io.airbyte.commons.constants.AirbyteSecretConstants; import io.airbyte.commons.json.JsonPaths; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.handlers.helpers.OAuthPathExtractor; import io.airbyte.config.DestinationConnection; import io.airbyte.config.DestinationOAuthParameter; import io.airbyte.config.SourceConnection; @@ -37,7 +38,6 @@ import io.airbyte.persistence.job.factory.OAuthConfigSupplier; import io.airbyte.persistence.job.tracker.TrackingMetadata; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.handlers.helpers.OAuthPathExtractor; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Singleton; import java.io.IOException; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/OpenApiConfigHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OpenApiConfigHandler.java similarity index 93% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/OpenApiConfigHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OpenApiConfigHandler.java index e9d4b3614ec89..4192ff00dbb58 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/OpenApiConfigHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OpenApiConfigHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import io.airbyte.commons.resources.MoreResources; import jakarta.inject.Singleton; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/OperationsHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OperationsHandler.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/OperationsHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OperationsHandler.java index 7e6c45140508b..7510b26cc846d 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/OperationsHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/OperationsHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; @@ -17,13 +17,13 @@ import io.airbyte.api.model.generated.OperationUpdate; import io.airbyte.api.model.generated.OperatorConfiguration; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.server.converters.OperationsConverter; import io.airbyte.config.ConfigSchema; import io.airbyte.config.StandardSync; import io.airbyte.config.StandardSyncOperation; import io.airbyte.config.StandardSyncOperation.OperatorType; import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; -import io.airbyte.server.converters.OperationsConverter; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Inject; import jakarta.inject.Singleton; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SchedulerHandler.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SchedulerHandler.java index 97e8bfb5cc006..51c38b824b283 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SchedulerHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SchedulerHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Charsets; @@ -45,6 +45,15 @@ import io.airbyte.commons.enums.Enums; import io.airbyte.commons.features.FeatureFlags; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.converters.ConfigurationUpdate; +import io.airbyte.commons.server.converters.JobConverter; +import io.airbyte.commons.server.converters.OauthModelConverter; +import io.airbyte.commons.server.errors.ValueConflictKnownException; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; +import io.airbyte.commons.server.scheduler.EventRunner; +import io.airbyte.commons.server.scheduler.SynchronousJobMetadata; +import io.airbyte.commons.server.scheduler.SynchronousResponse; +import io.airbyte.commons.server.scheduler.SynchronousSchedulerClient; import io.airbyte.commons.temporal.ErrorCode; import io.airbyte.commons.temporal.TemporalClient.ManualOperationResult; import io.airbyte.commons.version.Version; @@ -65,15 +74,6 @@ import io.airbyte.persistence.job.models.Job; import io.airbyte.protocol.models.AirbyteCatalog; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.converters.ConfigurationUpdate; -import io.airbyte.server.converters.JobConverter; -import io.airbyte.server.converters.OauthModelConverter; -import io.airbyte.server.errors.ValueConflictKnownException; -import io.airbyte.server.handlers.helpers.CatalogConverter; -import io.airbyte.server.scheduler.EventRunner; -import io.airbyte.server.scheduler.SynchronousJobMetadata; -import io.airbyte.server.scheduler.SynchronousResponse; -import io.airbyte.server.scheduler.SynchronousSchedulerClient; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Singleton; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceDefinitionsHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SourceDefinitionsHandler.java similarity index 95% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/SourceDefinitionsHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SourceDefinitionsHandler.java index 578d8398153ad..9ee876cba701e 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceDefinitionsHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SourceDefinitionsHandler.java @@ -2,9 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; - -import static io.airbyte.server.ServerConstants.DEV_IMAGE_TAG; +package io.airbyte.commons.server.handlers; import com.google.common.annotations.VisibleForTesting; import io.airbyte.api.model.generated.CustomSourceDefinitionCreate; @@ -22,6 +20,15 @@ import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.docker.DockerUtils; import io.airbyte.commons.resources.MoreResources; +import io.airbyte.commons.server.ServerConstants; +import io.airbyte.commons.server.converters.ApiPojoConverters; +import io.airbyte.commons.server.converters.SpecFetcher; +import io.airbyte.commons.server.errors.IdNotFoundKnownException; +import io.airbyte.commons.server.errors.InternalServerKnownException; +import io.airbyte.commons.server.errors.UnsupportedProtocolVersionException; +import io.airbyte.commons.server.scheduler.SynchronousResponse; +import io.airbyte.commons.server.scheduler.SynchronousSchedulerClient; +import io.airbyte.commons.server.services.AirbyteGithubStore; import io.airbyte.commons.util.MoreLists; import io.airbyte.commons.version.AirbyteProtocolVersion; import io.airbyte.commons.version.AirbyteProtocolVersionRange; @@ -30,14 +37,6 @@ import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.converters.ApiPojoConverters; -import io.airbyte.server.converters.SpecFetcher; -import io.airbyte.server.errors.IdNotFoundKnownException; -import io.airbyte.server.errors.InternalServerKnownException; -import io.airbyte.server.errors.UnsupportedProtocolVersionException; -import io.airbyte.server.scheduler.SynchronousResponse; -import io.airbyte.server.scheduler.SynchronousSchedulerClient; -import io.airbyte.server.services.AirbyteGithubStore; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Inject; import jakarta.inject.Singleton; @@ -242,7 +241,7 @@ public SourceDefinitionRead updateSourceDefinition(final SourceDefinitionUpdate // specs are re-fetched from the container if the image tag has changed, or if the tag is "dev", // to allow for easier iteration of dev images final boolean specNeedsUpdate = !currentSourceDefinition.getDockerImageTag().equals(sourceDefinitionUpdate.getDockerImageTag()) - || sourceDefinitionUpdate.getDockerImageTag().equals(DEV_IMAGE_TAG); + || ServerConstants.DEV_IMAGE_TAG.equals(sourceDefinitionUpdate.getDockerImageTag()); final ConnectorSpecification spec = specNeedsUpdate ? getSpecForImage(currentSourceDefinition.getDockerRepository(), sourceDefinitionUpdate.getDockerImageTag(), currentSourceDefinition.getCustom()) diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SourceHandler.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SourceHandler.java index c8c366bab4a8b..fe95cf6ec1c36 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/SourceHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SourceHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Lists; @@ -21,6 +21,8 @@ import io.airbyte.api.model.generated.SourceSnippetRead; import io.airbyte.api.model.generated.SourceUpdate; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; +import io.airbyte.commons.server.converters.ConfigurationUpdate; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; import io.airbyte.config.SourceConnection; import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.persistence.ConfigNotFoundException; @@ -31,8 +33,6 @@ import io.airbyte.persistence.job.factory.OAuthConfigSupplier; import io.airbyte.protocol.models.AirbyteCatalog; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.converters.ConfigurationUpdate; -import io.airbyte.server.handlers.helpers.CatalogConverter; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Inject; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/StateHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/StateHandler.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/StateHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/StateHandler.java index 977f95813aadf..8bc2a8f68e125 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/StateHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/StateHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendCheckUpdatesHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendCheckUpdatesHandler.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendCheckUpdatesHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendCheckUpdatesHandler.java index 7c51e26c5494f..13a2c0d3cd2a8 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendCheckUpdatesHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendCheckUpdatesHandler.java @@ -2,13 +2,13 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import io.airbyte.api.model.generated.WebBackendCheckUpdatesRead; +import io.airbyte.commons.server.services.AirbyteGithubStore; import io.airbyte.config.StandardDestinationDefinition; import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.persistence.ConfigRepository; -import io.airbyte.server.services.AirbyteGithubStore; import jakarta.inject.Singleton; import java.io.IOException; import java.util.List; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendConnectionsHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandler.java similarity index 99% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendConnectionsHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandler.java index e45c356867041..3e71207370573 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendConnectionsHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static java.util.stream.Collectors.toMap; @@ -49,6 +49,9 @@ import io.airbyte.commons.enums.Enums; import io.airbyte.commons.json.Jsons; import io.airbyte.commons.lang.MoreBooleans; +import io.airbyte.commons.server.converters.ApiPojoConverters; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; +import io.airbyte.commons.server.scheduler.EventRunner; import io.airbyte.config.ActorCatalog; import io.airbyte.config.ActorCatalogFetchEvent; import io.airbyte.config.StandardSync; @@ -56,9 +59,6 @@ import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.config.persistence.ConfigRepository.StandardSyncQuery; import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; -import io.airbyte.server.converters.ApiPojoConverters; -import io.airbyte.server.handlers.helpers.CatalogConverter; -import io.airbyte.server.scheduler.EventRunner; import io.airbyte.validation.json.JsonValidationException; import io.airbyte.workers.helper.ProtocolConverters; import jakarta.inject.Singleton; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendGeographiesHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendGeographiesHandler.java similarity index 95% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendGeographiesHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendGeographiesHandler.java index 3d39209098f15..7e33d5374e7ec 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/WebBackendGeographiesHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendGeographiesHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import io.airbyte.api.model.generated.Geography; import io.airbyte.api.model.generated.WebBackendGeographiesListResult; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/WorkspacesHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WorkspacesHandler.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/WorkspacesHandler.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WorkspacesHandler.java index 6829747a30140..29b739ffe8d3f 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/WorkspacesHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WorkspacesHandler.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import com.github.slugify.Slugify; import com.google.common.annotations.VisibleForTesting; @@ -26,17 +26,17 @@ import io.airbyte.api.model.generated.WorkspaceUpdate; import io.airbyte.api.model.generated.WorkspaceUpdateName; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.server.converters.ApiPojoConverters; +import io.airbyte.commons.server.converters.NotificationConverter; +import io.airbyte.commons.server.converters.WorkspaceWebhookConfigsConverter; +import io.airbyte.commons.server.errors.IdNotFoundKnownException; +import io.airbyte.commons.server.errors.InternalServerKnownException; +import io.airbyte.commons.server.errors.ValueConflictKnownException; import io.airbyte.config.StandardWorkspace; import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.config.persistence.SecretsRepositoryWriter; import io.airbyte.notification.NotificationClient; -import io.airbyte.server.converters.ApiPojoConverters; -import io.airbyte.server.converters.NotificationConverter; -import io.airbyte.server.converters.WorkspaceWebhookConfigsConverter; -import io.airbyte.server.errors.IdNotFoundKnownException; -import io.airbyte.server.errors.InternalServerKnownException; -import io.airbyte.server.errors.ValueConflictKnownException; import io.airbyte.validation.json.JsonValidationException; import jakarta.inject.Inject; import jakarta.inject.Singleton; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/CatalogConverter.java similarity index 99% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/CatalogConverter.java index 6cf626f381b47..48ae8630b2059 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/CatalogConverter.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/CatalogConverter.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers.helpers; +package io.airbyte.commons.server.handlers.helpers; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/ConnectionMatcher.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/ConnectionMatcher.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/ConnectionMatcher.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/ConnectionMatcher.java index 2afaf63aec8bf..d9b0387fca177 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/ConnectionMatcher.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/ConnectionMatcher.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers.helpers; +package io.airbyte.commons.server.handlers.helpers; import io.airbyte.api.model.generated.ConnectionRead; import io.airbyte.api.model.generated.ConnectionSearch; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/ConnectionScheduleHelper.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/ConnectionScheduleHelper.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/ConnectionScheduleHelper.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/ConnectionScheduleHelper.java index 807072626cb37..e49d31a6449e4 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/ConnectionScheduleHelper.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/ConnectionScheduleHelper.java @@ -2,17 +2,17 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers.helpers; +package io.airbyte.commons.server.handlers.helpers; import io.airbyte.api.model.generated.ConnectionScheduleData; import io.airbyte.api.model.generated.ConnectionScheduleType; +import io.airbyte.commons.server.converters.ApiPojoConverters; import io.airbyte.config.BasicSchedule; import io.airbyte.config.Cron; import io.airbyte.config.Schedule; import io.airbyte.config.ScheduleData; import io.airbyte.config.StandardSync; import io.airbyte.config.StandardSync.ScheduleType; -import io.airbyte.server.converters.ApiPojoConverters; import io.airbyte.validation.json.JsonValidationException; import java.text.ParseException; import java.util.TimeZone; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/DestinationMatcher.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/DestinationMatcher.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/DestinationMatcher.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/DestinationMatcher.java index b9c374c31e003..05f2752d1df28 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/DestinationMatcher.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/DestinationMatcher.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers.helpers; +package io.airbyte.commons.server.handlers.helpers; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/Matchable.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/Matchable.java similarity index 71% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/Matchable.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/Matchable.java index b1de20b95fdcd..2e87767d3a765 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/Matchable.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/Matchable.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers.helpers; +package io.airbyte.commons.server.handlers.helpers; @FunctionalInterface interface Matchable { diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/OAuthPathExtractor.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/OAuthPathExtractor.java similarity index 96% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/OAuthPathExtractor.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/OAuthPathExtractor.java index 4a6ed4580020d..60da416a51089 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/OAuthPathExtractor.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/OAuthPathExtractor.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers.helpers; +package io.airbyte.commons.server.handlers.helpers; import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; diff --git a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/SourceMatcher.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/SourceMatcher.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/SourceMatcher.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/SourceMatcher.java index ee4e35d7d2c7c..78c13fc4e9921 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/handlers/helpers/SourceMatcher.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/SourceMatcher.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers.helpers; +package io.airbyte.commons.server.handlers.helpers; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/airbyte-server/src/main/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClient.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/DefaultSynchronousSchedulerClient.java similarity index 99% rename from airbyte-server/src/main/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClient.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/DefaultSynchronousSchedulerClient.java index 28036302a9bea..f01806f089583 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClient.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/DefaultSynchronousSchedulerClient.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.scheduler; +package io.airbyte.commons.server.scheduler; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.annotations.VisibleForTesting; diff --git a/airbyte-server/src/main/java/io/airbyte/server/scheduler/EventRunner.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/EventRunner.java similarity index 95% rename from airbyte-server/src/main/java/io/airbyte/server/scheduler/EventRunner.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/EventRunner.java index bc4a83a07042a..627df14556b37 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/scheduler/EventRunner.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/EventRunner.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.scheduler; +package io.airbyte.commons.server.scheduler; import io.airbyte.commons.temporal.TemporalClient.ManualOperationResult; import io.airbyte.protocol.models.StreamDescriptor; diff --git a/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousJobMetadata.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousJobMetadata.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousJobMetadata.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousJobMetadata.java index b4689b9fa6bf0..a3731db99e524 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousJobMetadata.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousJobMetadata.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.scheduler; +package io.airbyte.commons.server.scheduler; import io.airbyte.commons.temporal.JobMetadata; import io.airbyte.config.JobConfig.ConfigType; diff --git a/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousResponse.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousResponse.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousResponse.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousResponse.java index 463564e8fe981..1c135ce85aaf8 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousResponse.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousResponse.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.scheduler; +package io.airbyte.commons.server.scheduler; import io.airbyte.commons.temporal.TemporalResponse; import io.airbyte.config.ConnectorJobOutput; diff --git a/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousSchedulerClient.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousSchedulerClient.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousSchedulerClient.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousSchedulerClient.java index 7ff4257e1f2bf..a9bceabccc645 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/scheduler/SynchronousSchedulerClient.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/SynchronousSchedulerClient.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.scheduler; +package io.airbyte.commons.server.scheduler; import io.airbyte.commons.version.Version; import io.airbyte.config.DestinationConnection; diff --git a/airbyte-server/src/main/java/io/airbyte/server/scheduler/TemporalEventRunner.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/TemporalEventRunner.java similarity index 97% rename from airbyte-server/src/main/java/io/airbyte/server/scheduler/TemporalEventRunner.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/TemporalEventRunner.java index 5aa469a1a9d5a..e6976a7f9de1c 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/scheduler/TemporalEventRunner.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/scheduler/TemporalEventRunner.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.scheduler; +package io.airbyte.commons.server.scheduler; import io.airbyte.commons.temporal.TemporalClient; import io.airbyte.commons.temporal.TemporalClient.ManualOperationResult; diff --git a/airbyte-server/src/main/java/io/airbyte/server/services/AirbyteGithubStore.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/services/AirbyteGithubStore.java similarity index 98% rename from airbyte-server/src/main/java/io/airbyte/server/services/AirbyteGithubStore.java rename to airbyte-commons-server/src/main/java/io/airbyte/commons/server/services/AirbyteGithubStore.java index 8500d6e8dc558..06113d752d482 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/services/AirbyteGithubStore.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/services/AirbyteGithubStore.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.services; +package io.airbyte.commons.server.services; import com.google.common.annotations.VisibleForTesting; import io.airbyte.config.EnvConfigs; diff --git a/airbyte-server/src/test/java/io/airbyte/server/RequestLoggerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/RequestLoggerTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/RequestLoggerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/RequestLoggerTest.java index 46498b4e0b60f..042baedd324eb 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/RequestLoggerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/RequestLoggerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server; +package io.airbyte.commons.server; import io.airbyte.commons.io.IOs; import io.airbyte.config.Configs.WorkerEnvironment; diff --git a/airbyte-server/src/test/java/io/airbyte/server/converters/CatalogConverterTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/CatalogConverterTest.java similarity index 95% rename from airbyte-server/src/test/java/io/airbyte/server/converters/CatalogConverterTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/CatalogConverterTest.java index d9d41bda7ec4a..5747a8d910662 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/converters/CatalogConverterTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/CatalogConverterTest.java @@ -2,10 +2,10 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; -import static io.airbyte.server.helpers.ConnectionHelpers.FIELD_NAME; -import static io.airbyte.server.helpers.ConnectionHelpers.SECOND_FIELD_NAME; +import static io.airbyte.commons.server.helpers.ConnectionHelpers.FIELD_NAME; +import static io.airbyte.commons.server.helpers.ConnectionHelpers.SECOND_FIELD_NAME; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -16,10 +16,10 @@ import io.airbyte.api.model.generated.SelectedFieldInfo; import io.airbyte.api.model.generated.SyncMode; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; +import io.airbyte.commons.server.helpers.ConnectionHelpers; import io.airbyte.config.DataType; import io.airbyte.config.FieldSelectionData; -import io.airbyte.server.handlers.helpers.CatalogConverter; -import io.airbyte.server.helpers.ConnectionHelpers; import io.airbyte.validation.json.JsonValidationException; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/airbyte-server/src/test/java/io/airbyte/server/converters/CatalogDiffConvertersTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/CatalogDiffConvertersTest.java similarity index 94% rename from airbyte-server/src/test/java/io/airbyte/server/converters/CatalogDiffConvertersTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/CatalogDiffConvertersTest.java index d9108cd6f577f..e18c89ef10ba6 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/converters/CatalogDiffConvertersTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/CatalogDiffConvertersTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/airbyte-server/src/test/java/io/airbyte/server/converters/ConfigurationUpdateTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/ConfigurationUpdateTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/converters/ConfigurationUpdateTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/ConfigurationUpdateTest.java index 654c7af8c44b9..831bbc58ff241 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/converters/ConfigurationUpdateTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/ConfigurationUpdateTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; diff --git a/airbyte-server/src/test/java/io/airbyte/server/converters/JobConverterTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/JobConverterTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/converters/JobConverterTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/JobConverterTest.java index f73ec6e62aad5..eb2595333f857 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/converters/JobConverterTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/JobConverterTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; diff --git a/airbyte-server/src/test/java/io/airbyte/server/converters/OauthModelConverterTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/OauthModelConverterTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/converters/OauthModelConverterTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/OauthModelConverterTest.java index c96a23d1bab1b..494e9c3a2b7f6 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/converters/OauthModelConverterTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/converters/OauthModelConverterTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.converters; +package io.airbyte.commons.server.converters; import static org.junit.jupiter.api.Assertions.*; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/AttemptHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/AttemptHandlerTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/AttemptHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/AttemptHandlerTest.java index 4698ed5c63876..eeb2c0ff48c71 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/AttemptHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/AttemptHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionSchedulerHelperTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/ConnectionSchedulerHelperTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionSchedulerHelperTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/ConnectionSchedulerHelperTest.java index 7c8f2bc0bc826..83c68ec03c452 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionSchedulerHelperTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/ConnectionSchedulerHelperTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -15,11 +15,11 @@ import io.airbyte.api.model.generated.ConnectionScheduleDataBasicSchedule.TimeUnitEnum; import io.airbyte.api.model.generated.ConnectionScheduleDataCron; import io.airbyte.api.model.generated.ConnectionScheduleType; +import io.airbyte.commons.server.handlers.helpers.ConnectionScheduleHelper; import io.airbyte.config.BasicSchedule.TimeUnit; import io.airbyte.config.Schedule; import io.airbyte.config.StandardSync; import io.airbyte.config.StandardSync.ScheduleType; -import io.airbyte.server.handlers.helpers.ConnectionScheduleHelper; import io.airbyte.validation.json.JsonValidationException; import org.junit.jupiter.api.Test; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionsHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/ConnectionsHandlerTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionsHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/ConnectionsHandlerTest.java index 9a2364a8cf454..b2445c5d43b03 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/ConnectionsHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/ConnectionsHandlerTest.java @@ -2,10 +2,10 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; -import static io.airbyte.server.helpers.ConnectionHelpers.FIELD_NAME; -import static io.airbyte.server.helpers.ConnectionHelpers.SECOND_FIELD_NAME; +import static io.airbyte.commons.server.helpers.ConnectionHelpers.FIELD_NAME; +import static io.airbyte.commons.server.helpers.ConnectionHelpers.SECOND_FIELD_NAME; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -43,6 +43,10 @@ import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.enums.Enums; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.converters.ApiPojoConverters; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; +import io.airbyte.commons.server.helpers.ConnectionHelpers; +import io.airbyte.commons.server.scheduler.EventRunner; import io.airbyte.config.BasicSchedule; import io.airbyte.config.ConfigSchema; import io.airbyte.config.Cron; @@ -65,10 +69,6 @@ import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.persistence.job.WorkspaceHelper; import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; -import io.airbyte.server.converters.ApiPojoConverters; -import io.airbyte.server.handlers.helpers.CatalogConverter; -import io.airbyte.server.helpers.ConnectionHelpers; -import io.airbyte.server.scheduler.EventRunner; import io.airbyte.validation.json.JsonValidationException; import io.airbyte.workers.helper.ConnectionHelper; import java.io.IOException; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationDefinitionsHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/DestinationDefinitionsHandlerTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationDefinitionsHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/DestinationDefinitionsHandlerTest.java index 8eadc7abf46a0..4a65cc85aa936 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationDefinitionsHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/DestinationDefinitionsHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -31,6 +31,12 @@ import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.docker.DockerUtils; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.errors.IdNotFoundKnownException; +import io.airbyte.commons.server.errors.UnsupportedProtocolVersionException; +import io.airbyte.commons.server.scheduler.SynchronousJobMetadata; +import io.airbyte.commons.server.scheduler.SynchronousResponse; +import io.airbyte.commons.server.scheduler.SynchronousSchedulerClient; +import io.airbyte.commons.server.services.AirbyteGithubStore; import io.airbyte.commons.version.AirbyteProtocolVersionRange; import io.airbyte.commons.version.Version; import io.airbyte.config.ActorDefinitionResourceRequirements; @@ -44,12 +50,6 @@ import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.errors.IdNotFoundKnownException; -import io.airbyte.server.errors.UnsupportedProtocolVersionException; -import io.airbyte.server.scheduler.SynchronousJobMetadata; -import io.airbyte.server.scheduler.SynchronousResponse; -import io.airbyte.server.scheduler.SynchronousSchedulerClient; -import io.airbyte.server.services.AirbyteGithubStore; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; import java.net.URI; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/DestinationHandlerTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/DestinationHandlerTest.java index 728d60bbee48e..9448aa5a36094 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/DestinationHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/DestinationHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -24,6 +24,9 @@ import io.airbyte.api.model.generated.DestinationUpdate; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.converters.ConfigurationUpdate; +import io.airbyte.commons.server.helpers.ConnectorSpecificationHelpers; +import io.airbyte.commons.server.helpers.DestinationHelpers; import io.airbyte.config.DestinationConnection; import io.airbyte.config.StandardDestinationDefinition; import io.airbyte.config.persistence.ConfigNotFoundException; @@ -33,9 +36,6 @@ import io.airbyte.config.persistence.split_secrets.JsonSecretsProcessor; import io.airbyte.persistence.job.factory.OAuthConfigSupplier; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.converters.ConfigurationUpdate; -import io.airbyte.server.helpers.ConnectorSpecificationHelpers; -import io.airbyte.server.helpers.DestinationHelpers; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/HealthCheckHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/HealthCheckHandlerTest.java similarity index 95% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/HealthCheckHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/HealthCheckHandlerTest.java index 2d83a4bd02c98..7dedbe3142d2a 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/HealthCheckHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/HealthCheckHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mock; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/JobHistoryHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/JobHistoryHandlerTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/JobHistoryHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/JobHistoryHandlerTest.java index 02bd7034f6f5c..3ab2582afdb45 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/JobHistoryHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/JobHistoryHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -35,6 +35,12 @@ import io.airbyte.api.model.generated.SourceIdRequestBody; import io.airbyte.api.model.generated.SourceRead; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.server.converters.JobConverter; +import io.airbyte.commons.server.helpers.ConnectionHelpers; +import io.airbyte.commons.server.helpers.DestinationDefinitionHelpers; +import io.airbyte.commons.server.helpers.DestinationHelpers; +import io.airbyte.commons.server.helpers.SourceDefinitionHelpers; +import io.airbyte.commons.server.helpers.SourceHelpers; import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs.WorkerEnvironment; import io.airbyte.config.DestinationConnection; @@ -57,12 +63,6 @@ import io.airbyte.persistence.job.models.AttemptStatus; import io.airbyte.persistence.job.models.Job; import io.airbyte.persistence.job.models.JobStatus; -import io.airbyte.server.converters.JobConverter; -import io.airbyte.server.helpers.ConnectionHelpers; -import io.airbyte.server.helpers.DestinationDefinitionHelpers; -import io.airbyte.server.helpers.DestinationHelpers; -import io.airbyte.server.helpers.SourceDefinitionHelpers; -import io.airbyte.server.helpers.SourceHelpers; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; import java.net.URISyntaxException; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/LogsHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/LogsHandlerTest.java similarity index 97% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/LogsHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/LogsHandlerTest.java index 098f05f1a4a36..3b730f1997714 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/LogsHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/LogsHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/OAuthHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OAuthHandlerTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/OAuthHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OAuthHandlerTest.java index 08d9d2f95e530..57daf559363d9 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/OAuthHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OAuthHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/OpenApiConfigHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OpenApiConfigHandlerTest.java similarity index 92% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/OpenApiConfigHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OpenApiConfigHandlerTest.java index 5b7311433e9bb..99dd0ccb4b4b6 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/OpenApiConfigHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OpenApiConfigHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.*; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/OperationsHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OperationsHandlerTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/OperationsHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OperationsHandlerTest.java index e3e2d49542f19..97082336b16dc 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/OperationsHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/OperationsHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SchedulerHandlerTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SchedulerHandlerTest.java index dc8721c4cf550..b495ab19e1a19 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SchedulerHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SchedulerHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -52,6 +52,16 @@ import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.commons.json.Jsons; import io.airbyte.commons.lang.Exceptions; +import io.airbyte.commons.server.converters.ConfigurationUpdate; +import io.airbyte.commons.server.converters.JobConverter; +import io.airbyte.commons.server.errors.ValueConflictKnownException; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; +import io.airbyte.commons.server.helpers.DestinationHelpers; +import io.airbyte.commons.server.helpers.SourceHelpers; +import io.airbyte.commons.server.scheduler.EventRunner; +import io.airbyte.commons.server.scheduler.SynchronousJobMetadata; +import io.airbyte.commons.server.scheduler.SynchronousResponse; +import io.airbyte.commons.server.scheduler.SynchronousSchedulerClient; import io.airbyte.commons.temporal.ErrorCode; import io.airbyte.commons.temporal.TemporalClient.ManualOperationResult; import io.airbyte.commons.version.Version; @@ -76,16 +86,6 @@ import io.airbyte.protocol.models.Field; import io.airbyte.protocol.models.JsonSchemaType; import io.airbyte.protocol.models.StreamDescriptor; -import io.airbyte.server.converters.ConfigurationUpdate; -import io.airbyte.server.converters.JobConverter; -import io.airbyte.server.errors.ValueConflictKnownException; -import io.airbyte.server.handlers.helpers.CatalogConverter; -import io.airbyte.server.helpers.DestinationHelpers; -import io.airbyte.server.helpers.SourceHelpers; -import io.airbyte.server.scheduler.EventRunner; -import io.airbyte.server.scheduler.SynchronousJobMetadata; -import io.airbyte.server.scheduler.SynchronousResponse; -import io.airbyte.server.scheduler.SynchronousSchedulerClient; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceDefinitionsHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceDefinitionsHandlerTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/SourceDefinitionsHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceDefinitionsHandlerTest.java index 424ae0d49e3dd..76c2c70dd036a 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceDefinitionsHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceDefinitionsHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -33,6 +33,12 @@ import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.docker.DockerUtils; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.errors.IdNotFoundKnownException; +import io.airbyte.commons.server.errors.UnsupportedProtocolVersionException; +import io.airbyte.commons.server.scheduler.SynchronousJobMetadata; +import io.airbyte.commons.server.scheduler.SynchronousResponse; +import io.airbyte.commons.server.scheduler.SynchronousSchedulerClient; +import io.airbyte.commons.server.services.AirbyteGithubStore; import io.airbyte.commons.version.AirbyteProtocolVersionRange; import io.airbyte.commons.version.Version; import io.airbyte.config.ActorDefinitionResourceRequirements; @@ -45,12 +51,6 @@ import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.protocol.models.ConnectorSpecification; -import io.airbyte.server.errors.IdNotFoundKnownException; -import io.airbyte.server.errors.UnsupportedProtocolVersionException; -import io.airbyte.server.scheduler.SynchronousJobMetadata; -import io.airbyte.server.scheduler.SynchronousResponse; -import io.airbyte.server.scheduler.SynchronousSchedulerClient; -import io.airbyte.server.services.AirbyteGithubStore; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; import java.net.URI; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceHandlerTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/SourceHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceHandlerTest.java index 61a27553bea37..d36423baeb531 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/SourceHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -29,6 +29,11 @@ import io.airbyte.api.model.generated.SourceUpdate; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.converters.ConfigurationUpdate; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; +import io.airbyte.commons.server.helpers.ConnectionHelpers; +import io.airbyte.commons.server.helpers.ConnectorSpecificationHelpers; +import io.airbyte.commons.server.helpers.SourceHelpers; import io.airbyte.config.SourceConnection; import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.StandardSync; @@ -43,11 +48,6 @@ import io.airbyte.protocol.models.ConnectorSpecification; import io.airbyte.protocol.models.Field; import io.airbyte.protocol.models.JsonSchemaType; -import io.airbyte.server.converters.ConfigurationUpdate; -import io.airbyte.server.handlers.helpers.CatalogConverter; -import io.airbyte.server.helpers.ConnectionHelpers; -import io.airbyte.server.helpers.ConnectorSpecificationHelpers; -import io.airbyte.server.helpers.SourceHelpers; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/StateHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/StateHandlerTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/StateHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/StateHandlerTest.java index 53cc95fc90276..f43633cc98afe 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/StateHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/StateHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendCheckUpdatesHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendCheckUpdatesHandlerTest.java similarity index 98% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendCheckUpdatesHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendCheckUpdatesHandlerTest.java index 78ac5ee79b565..4c9e51f910cc3 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendCheckUpdatesHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendCheckUpdatesHandlerTest.java @@ -2,17 +2,17 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import io.airbyte.api.model.generated.WebBackendCheckUpdatesRead; +import io.airbyte.commons.server.services.AirbyteGithubStore; import io.airbyte.config.StandardDestinationDefinition; import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.persistence.ConfigRepository; -import io.airbyte.server.services.AirbyteGithubStore; import java.io.IOException; import java.util.List; import java.util.Map; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandlerTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandlerTest.java index abf564dee15aa..fb75429471309 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendConnectionsHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -75,6 +75,13 @@ import io.airbyte.api.model.generated.WebBackendWorkspaceState; import io.airbyte.commons.enums.Enums; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.handlers.helpers.CatalogConverter; +import io.airbyte.commons.server.helpers.ConnectionHelpers; +import io.airbyte.commons.server.helpers.DestinationDefinitionHelpers; +import io.airbyte.commons.server.helpers.DestinationHelpers; +import io.airbyte.commons.server.helpers.SourceDefinitionHelpers; +import io.airbyte.commons.server.helpers.SourceHelpers; +import io.airbyte.commons.server.scheduler.EventRunner; import io.airbyte.commons.temporal.TemporalClient.ManualOperationResult; import io.airbyte.config.ActorCatalog; import io.airbyte.config.ActorCatalogFetchEvent; @@ -93,13 +100,6 @@ import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; import io.airbyte.protocol.models.Field; import io.airbyte.protocol.models.JsonSchemaType; -import io.airbyte.server.handlers.helpers.CatalogConverter; -import io.airbyte.server.helpers.ConnectionHelpers; -import io.airbyte.server.helpers.DestinationDefinitionHelpers; -import io.airbyte.server.helpers.DestinationHelpers; -import io.airbyte.server.helpers.SourceDefinitionHelpers; -import io.airbyte.server.helpers.SourceHelpers; -import io.airbyte.server.scheduler.EventRunner; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; import java.lang.reflect.Method; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendGeographiesHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendGeographiesHandlerTest.java similarity index 96% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendGeographiesHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendGeographiesHandlerTest.java index e4f014aa3c1db..f0c14e2e69ff3 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/WebBackendGeographiesHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WebBackendGeographiesHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import io.airbyte.api.model.generated.Geography; import io.airbyte.api.model.generated.WebBackendGeographiesListResult; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/WorkspacesHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WorkspacesHandlerTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/WorkspacesHandlerTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WorkspacesHandlerTest.java index 4e604e12855da..c3c6a94419381 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/WorkspacesHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/WorkspacesHandlerTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers; +package io.airbyte.commons.server.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -34,6 +34,7 @@ import io.airbyte.api.model.generated.WorkspaceUpdate; import io.airbyte.api.model.generated.WorkspaceUpdateName; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.converters.NotificationConverter; import io.airbyte.config.Geography; import io.airbyte.config.Notification; import io.airbyte.config.Notification.NotificationType; @@ -43,7 +44,6 @@ import io.airbyte.config.persistence.ConfigRepository; import io.airbyte.config.persistence.SecretsRepositoryWriter; import io.airbyte.config.persistence.split_secrets.SecretPersistence; -import io.airbyte.server.converters.NotificationConverter; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; import java.util.Collections; diff --git a/airbyte-server/src/test/java/io/airbyte/server/handlers/helper/OAuthPathExtractorTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/helper/OAuthPathExtractorTest.java similarity index 93% rename from airbyte-server/src/test/java/io/airbyte/server/handlers/helper/OAuthPathExtractorTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/helper/OAuthPathExtractorTest.java index e7c7d95f83080..5a45c37b2af5a 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/handlers/helper/OAuthPathExtractorTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/helper/OAuthPathExtractorTest.java @@ -2,11 +2,11 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.handlers.helper; +package io.airbyte.commons.server.handlers.helper; import com.fasterxml.jackson.databind.JsonNode; import io.airbyte.commons.json.Jsons; -import io.airbyte.server.handlers.helpers.OAuthPathExtractor; +import io.airbyte.commons.server.handlers.helpers.OAuthPathExtractor; import java.util.List; import java.util.Map; import org.assertj.core.api.Assertions; diff --git a/airbyte-server/src/test/java/io/airbyte/server/helpers/ConnectionHelpers.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/ConnectionHelpers.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/helpers/ConnectionHelpers.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/ConnectionHelpers.java index 00afd4ff6a803..300079b72964c 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/helpers/ConnectionHelpers.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/ConnectionHelpers.java @@ -2,9 +2,9 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.helpers; +package io.airbyte.commons.server.helpers; -import static io.airbyte.server.handlers.helpers.CatalogConverter.toApi; +import static io.airbyte.commons.server.handlers.helpers.CatalogConverter.toApi; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Lists; @@ -30,6 +30,7 @@ import io.airbyte.api.model.generated.SyncMode; import io.airbyte.api.model.generated.WebBackendConnectionListItem; import io.airbyte.commons.enums.Enums; +import io.airbyte.commons.server.converters.ApiPojoConverters; import io.airbyte.commons.text.Names; import io.airbyte.config.BasicSchedule; import io.airbyte.config.JobSyncConfig.NamespaceDefinitionType; @@ -45,7 +46,6 @@ import io.airbyte.protocol.models.Field; import io.airbyte.protocol.models.JsonSchemaType; import io.airbyte.protocol.models.StreamDescriptor; -import io.airbyte.server.converters.ApiPojoConverters; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/airbyte-server/src/test/java/io/airbyte/server/helpers/ConnectorSpecificationHelpers.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/ConnectorSpecificationHelpers.java similarity index 82% rename from airbyte-server/src/test/java/io/airbyte/server/helpers/ConnectorSpecificationHelpers.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/ConnectorSpecificationHelpers.java index dd843b96cbdb2..50ac208ba8dd9 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/helpers/ConnectorSpecificationHelpers.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/ConnectorSpecificationHelpers.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.helpers; +package io.airbyte.commons.server.helpers; import io.airbyte.commons.json.Jsons; import io.airbyte.protocol.models.ConnectorSpecification; @@ -17,7 +17,7 @@ public class ConnectorSpecificationHelpers { public static ConnectorSpecification generateConnectorSpecification() throws IOException { - final Path path = Paths.get("../airbyte-server/src/test/resources/json/TestSpecification.json"); + final Path path = Paths.get(ConnectorSpecificationHelpers.class.getClassLoader().getResource("json/TestSpecification.json").getPath()); try { return new ConnectorSpecification() diff --git a/airbyte-server/src/test/java/io/airbyte/server/helpers/DestinationDefinitionHelpers.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/DestinationDefinitionHelpers.java similarity index 92% rename from airbyte-server/src/test/java/io/airbyte/server/helpers/DestinationDefinitionHelpers.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/DestinationDefinitionHelpers.java index 24ee7a0d452c1..b1c776a17d7e1 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/helpers/DestinationDefinitionHelpers.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/DestinationDefinitionHelpers.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.helpers; +package io.airbyte.commons.server.helpers; import io.airbyte.config.StandardDestinationDefinition; import java.util.UUID; diff --git a/airbyte-server/src/test/java/io/airbyte/server/helpers/DestinationHelpers.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/DestinationHelpers.java similarity index 92% rename from airbyte-server/src/test/java/io/airbyte/server/helpers/DestinationHelpers.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/DestinationHelpers.java index a3eb07edee60d..74bb05dca4f23 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/helpers/DestinationHelpers.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/DestinationHelpers.java @@ -2,14 +2,14 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.helpers; +package io.airbyte.commons.server.helpers; import com.fasterxml.jackson.databind.JsonNode; import io.airbyte.api.model.generated.DestinationRead; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.handlers.DestinationDefinitionsHandler; import io.airbyte.config.DestinationConnection; import io.airbyte.config.StandardDestinationDefinition; -import io.airbyte.server.handlers.DestinationDefinitionsHandler; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -20,7 +20,7 @@ public class DestinationHelpers { public static JsonNode getTestDestinationJson() throws IOException { final Path path = - Paths.get("../airbyte-server/src/test/resources/json/TestImplementation.json"); + Paths.get(DestinationHelpers.class.getClassLoader().getResource("json/TestImplementation.json").getPath()); return Jsons.deserialize(Files.readString(path)); } diff --git a/airbyte-server/src/test/java/io/airbyte/server/helpers/SourceDefinitionHelpers.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/SourceDefinitionHelpers.java similarity index 92% rename from airbyte-server/src/test/java/io/airbyte/server/helpers/SourceDefinitionHelpers.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/SourceDefinitionHelpers.java index 1c592baa42950..fd5a0bb8d26c1 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/helpers/SourceDefinitionHelpers.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/SourceDefinitionHelpers.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.helpers; +package io.airbyte.commons.server.helpers; import io.airbyte.config.StandardSourceDefinition; import java.util.UUID; diff --git a/airbyte-server/src/test/java/io/airbyte/server/helpers/SourceHelpers.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/SourceHelpers.java similarity index 90% rename from airbyte-server/src/test/java/io/airbyte/server/helpers/SourceHelpers.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/SourceHelpers.java index 975256c751a7f..1b1604973bdb7 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/helpers/SourceHelpers.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/helpers/SourceHelpers.java @@ -2,14 +2,14 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.helpers; +package io.airbyte.commons.server.helpers; import com.fasterxml.jackson.databind.JsonNode; import io.airbyte.api.model.generated.SourceRead; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.handlers.SourceDefinitionsHandler; import io.airbyte.config.SourceConnection; import io.airbyte.config.StandardSourceDefinition; -import io.airbyte.server.handlers.SourceDefinitionsHandler; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -46,7 +46,7 @@ public static SourceConnection generateSource(final UUID sourceDefinitionId, fin } public static JsonNode getTestImplementationJson() throws IOException { - final Path path = Paths.get("../airbyte-server/src/test/resources/json/TestImplementation.json"); + final Path path = Paths.get(SourceHelpers.class.getClassLoader().getResource("json/TestImplementation.json").getPath()); return Jsons.deserialize(Files.readString(path)); } diff --git a/airbyte-server/src/test/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClientTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/scheduler/DefaultSynchronousSchedulerClientTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClientTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/scheduler/DefaultSynchronousSchedulerClientTest.java index 9cc3761c224cf..bd9bbdc927649 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/scheduler/DefaultSynchronousSchedulerClientTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/scheduler/DefaultSynchronousSchedulerClientTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.scheduler; +package io.airbyte.commons.server.scheduler; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; diff --git a/airbyte-server/src/test/java/io/airbyte/server/services/AirbyteGithubStoreTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/services/AirbyteGithubStoreTest.java similarity index 99% rename from airbyte-server/src/test/java/io/airbyte/server/services/AirbyteGithubStoreTest.java rename to airbyte-commons-server/src/test/java/io/airbyte/commons/server/services/AirbyteGithubStoreTest.java index 6f483ffdbdfe0..80dfff70b7014 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/services/AirbyteGithubStoreTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/services/AirbyteGithubStoreTest.java @@ -2,7 +2,7 @@ * Copyright (c) 2022 Airbyte, Inc., all rights reserved. */ -package io.airbyte.server.services; +package io.airbyte.commons.server.services; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/airbyte-server/src/test/resources/icons/test-destination.svg b/airbyte-commons-server/src/test/resources/icons/test-destination.svg similarity index 100% rename from airbyte-server/src/test/resources/icons/test-destination.svg rename to airbyte-commons-server/src/test/resources/icons/test-destination.svg diff --git a/airbyte-server/src/test/resources/icons/test-source.svg b/airbyte-commons-server/src/test/resources/icons/test-source.svg similarity index 100% rename from airbyte-server/src/test/resources/icons/test-source.svg rename to airbyte-commons-server/src/test/resources/icons/test-source.svg diff --git a/airbyte-server/src/test/resources/json/TestImplementation.json b/airbyte-commons-server/src/test/resources/json/TestImplementation.json similarity index 100% rename from airbyte-server/src/test/resources/json/TestImplementation.json rename to airbyte-commons-server/src/test/resources/json/TestImplementation.json diff --git a/airbyte-server/src/test/resources/json/TestSpecification.json b/airbyte-commons-server/src/test/resources/json/TestSpecification.json similarity index 100% rename from airbyte-server/src/test/resources/json/TestSpecification.json rename to airbyte-commons-server/src/test/resources/json/TestSpecification.json diff --git a/airbyte-server/src/test/resources/migration/03a4c904-c91d-447f-ab59-27a43b52c2fd.gz b/airbyte-commons-server/src/test/resources/migration/03a4c904-c91d-447f-ab59-27a43b52c2fd.gz similarity index 100% rename from airbyte-server/src/test/resources/migration/03a4c904-c91d-447f-ab59-27a43b52c2fd.gz rename to airbyte-commons-server/src/test/resources/migration/03a4c904-c91d-447f-ab59-27a43b52c2fd.gz diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/4e00862d-5484-4f50-9860-f3bbb4317397.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/4e00862d-5484-4f50-9860-f3bbb4317397.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/4e00862d-5484-4f50-9860-f3bbb4317397.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/4e00862d-5484-4f50-9860-f3bbb4317397.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/5434615d-a3b7-4351-bc6b-a9a695555a30.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/5434615d-a3b7-4351-bc6b-a9a695555a30.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/5434615d-a3b7-4351-bc6b-a9a695555a30.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/DESTINATION_CONNECTION/5434615d-a3b7-4351-bc6b-a9a695555a30.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/28ffee2b-372a-4f72-9b95-8ed56a8b99c5.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/28ffee2b-372a-4f72-9b95-8ed56a8b99c5.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/28ffee2b-372a-4f72-9b95-8ed56a8b99c5.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/28ffee2b-372a-4f72-9b95-8ed56a8b99c5.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/e48cae1a-1f5c-42cc-9ec1-a44ff7fb4969.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/e48cae1a-1f5c-42cc-9ec1-a44ff7fb4969.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/e48cae1a-1f5c-42cc-9ec1-a44ff7fb4969.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/SOURCE_CONNECTION/e48cae1a-1f5c-42cc-9ec1-a44ff7fb4969.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/22f6c74f-5699-40ff-833c-4a879ea40133.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/22f6c74f-5699-40ff-833c-4a879ea40133.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/22f6c74f-5699-40ff-833c-4a879ea40133.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/22f6c74f-5699-40ff-833c-4a879ea40133.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/25c5221d-dce2-4163-ade9-739ef790f503.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/25c5221d-dce2-4163-ade9-739ef790f503.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/25c5221d-dce2-4163-ade9-739ef790f503.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/25c5221d-dce2-4163-ade9-739ef790f503.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/424892c4-daac-4491-b35d-c6688ba547ba.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/424892c4-daac-4491-b35d-c6688ba547ba.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/424892c4-daac-4491-b35d-c6688ba547ba.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/424892c4-daac-4491-b35d-c6688ba547ba.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/8be1cf83-fde1-477f-a4ad-318d23c9f3c6.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/8be1cf83-fde1-477f-a4ad-318d23c9f3c6.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/8be1cf83-fde1-477f-a4ad-318d23c9f3c6.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/8be1cf83-fde1-477f-a4ad-318d23c9f3c6.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/a625d593-bba5-4a1c-a53d-2d246268a816.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/a625d593-bba5-4a1c-a53d-2d246268a816.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/a625d593-bba5-4a1c-a53d-2d246268a816.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/a625d593-bba5-4a1c-a53d-2d246268a816.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/af7c921e-5892-4ff2-b6c1-4a5ab258fb7e.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/af7c921e-5892-4ff2-b6c1-4a5ab258fb7e.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/af7c921e-5892-4ff2-b6c1-4a5ab258fb7e.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/af7c921e-5892-4ff2-b6c1-4a5ab258fb7e.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/f7a7d195-377f-cf5b-70a5-be6b819019dc.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/f7a7d195-377f-cf5b-70a5-be6b819019dc.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/f7a7d195-377f-cf5b-70a5-be6b819019dc.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_DESTINATION_DEFINITION/f7a7d195-377f-cf5b-70a5-be6b819019dc.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/00405b19-9768-4e0c-b1ae-9fc2ee2b2a8c.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/00405b19-9768-4e0c-b1ae-9fc2ee2b2a8c.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/00405b19-9768-4e0c-b1ae-9fc2ee2b2a8c.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/00405b19-9768-4e0c-b1ae-9fc2ee2b2a8c.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2470e835-feaf-4db6-96f3-70fd645acc77.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2470e835-feaf-4db6-96f3-70fd645acc77.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2470e835-feaf-4db6-96f3-70fd645acc77.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2470e835-feaf-4db6-96f3-70fd645acc77.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2af123bf-0aaf-4e0d-9784-cb497f23741a.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2af123bf-0aaf-4e0d-9784-cb497f23741a.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2af123bf-0aaf-4e0d-9784-cb497f23741a.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/2af123bf-0aaf-4e0d-9784-cb497f23741a.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/396e4ca3-8a97-4b85-aa4e-c9d8c2d5f992.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/396e4ca3-8a97-4b85-aa4e-c9d8c2d5f992.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/396e4ca3-8a97-4b85-aa4e-c9d8c2d5f992.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/396e4ca3-8a97-4b85-aa4e-c9d8c2d5f992.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/41375467-61ae-4204-8e38-e2b8b7365f23.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/41375467-61ae-4204-8e38-e2b8b7365f23.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/41375467-61ae-4204-8e38-e2b8b7365f23.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/41375467-61ae-4204-8e38-e2b8b7365f23.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/435bb9a5-7887-4809-aa58-28c27df0d7ad.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/435bb9a5-7887-4809-aa58-28c27df0d7ad.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/435bb9a5-7887-4809-aa58-28c27df0d7ad.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/435bb9a5-7887-4809-aa58-28c27df0d7ad.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/445831eb-78db-4b1f-8f1f-0d96ad8739e2.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/445831eb-78db-4b1f-8f1f-0d96ad8739e2.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/445831eb-78db-4b1f-8f1f-0d96ad8739e2.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/445831eb-78db-4b1f-8f1f-0d96ad8739e2.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/4eb22946-2a79-4d20-a3e6-effd234613c3.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/4eb22946-2a79-4d20-a3e6-effd234613c3.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/4eb22946-2a79-4d20-a3e6-effd234613c3.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/4eb22946-2a79-4d20-a3e6-effd234613c3.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/57eb1576-8f52-463d-beb6-2e107cdf571d.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/57eb1576-8f52-463d-beb6-2e107cdf571d.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/57eb1576-8f52-463d-beb6-2e107cdf571d.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/57eb1576-8f52-463d-beb6-2e107cdf571d.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/59f1e50a-331f-4f09-b3e8-2e8d4d355f44.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/59f1e50a-331f-4f09-b3e8-2e8d4d355f44.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/59f1e50a-331f-4f09-b3e8-2e8d4d355f44.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/59f1e50a-331f-4f09-b3e8-2e8d4d355f44.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/68e63de2-bb83-4c7e-93fa-a8a9051e3993.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/68e63de2-bb83-4c7e-93fa-a8a9051e3993.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/68e63de2-bb83-4c7e-93fa-a8a9051e3993.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/68e63de2-bb83-4c7e-93fa-a8a9051e3993.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/71607ba1-c0ac-4799-8049-7f4b90dd50f7.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/71607ba1-c0ac-4799-8049-7f4b90dd50f7.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/71607ba1-c0ac-4799-8049-7f4b90dd50f7.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/71607ba1-c0ac-4799-8049-7f4b90dd50f7.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/778daa7c-feaf-4db6-96f3-70fd645acc77.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/778daa7c-feaf-4db6-96f3-70fd645acc77.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/778daa7c-feaf-4db6-96f3-70fd645acc77.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/778daa7c-feaf-4db6-96f3-70fd645acc77.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/859e501d-2b67-471f-91bb-1c801414d28f.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/859e501d-2b67-471f-91bb-1c801414d28f.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/859e501d-2b67-471f-91bb-1c801414d28f.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/859e501d-2b67-471f-91bb-1c801414d28f.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9e0556f4-69df-4522-a3fb-03264d36b348.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9e0556f4-69df-4522-a3fb-03264d36b348.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9e0556f4-69df-4522-a3fb-03264d36b348.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9e0556f4-69df-4522-a3fb-03264d36b348.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9fed261d-d107-47fd-8c8b-323023db6e20.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9fed261d-d107-47fd-8c8b-323023db6e20.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9fed261d-d107-47fd-8c8b-323023db6e20.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/9fed261d-d107-47fd-8c8b-323023db6e20.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/aea2fd0d-377d-465e-86c0-4fdc4f688e51.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/aea2fd0d-377d-465e-86c0-4fdc4f688e51.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/aea2fd0d-377d-465e-86c0-4fdc4f688e51.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/aea2fd0d-377d-465e-86c0-4fdc4f688e51.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b03a9f3e-22a5-11eb-adc1-0242ac120002.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b03a9f3e-22a5-11eb-adc1-0242ac120002.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b03a9f3e-22a5-11eb-adc1-0242ac120002.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b03a9f3e-22a5-11eb-adc1-0242ac120002.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b1892b11-788d-44bd-b9ec-3a436f7b54ce.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b1892b11-788d-44bd-b9ec-3a436f7b54ce.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b1892b11-788d-44bd-b9ec-3a436f7b54ce.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b1892b11-788d-44bd-b9ec-3a436f7b54ce.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b5ea17b1-f170-46dc-bc31-cc744ca984c1.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b5ea17b1-f170-46dc-bc31-cc744ca984c1.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b5ea17b1-f170-46dc-bc31-cc744ca984c1.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/b5ea17b1-f170-46dc-bc31-cc744ca984c1.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/cd42861b-01fc-4658-a8ab-5d11d0510f01.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/cd42861b-01fc-4658-a8ab-5d11d0510f01.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/cd42861b-01fc-4658-a8ab-5d11d0510f01.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/cd42861b-01fc-4658-a8ab-5d11d0510f01.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d2147be5-fa36-4936-977e-f031affa5895.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d2147be5-fa36-4936-977e-f031affa5895.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d2147be5-fa36-4936-977e-f031affa5895.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d2147be5-fa36-4936-977e-f031affa5895.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d29764f8-80d7-4dd7-acbe-1a42005ee5aa.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d29764f8-80d7-4dd7-acbe-1a42005ee5aa.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d29764f8-80d7-4dd7-acbe-1a42005ee5aa.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d29764f8-80d7-4dd7-acbe-1a42005ee5aa.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d8313939-3782-41b0-be29-b3ca20d8dd3a.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d8313939-3782-41b0-be29-b3ca20d8dd3a.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d8313939-3782-41b0-be29-b3ca20d8dd3a.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/d8313939-3782-41b0-be29-b3ca20d8dd3a.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/decd338e-5647-4c0b-adf4-da0e75f5a750.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/decd338e-5647-4c0b-adf4-da0e75f5a750.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/decd338e-5647-4c0b-adf4-da0e75f5a750.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/decd338e-5647-4c0b-adf4-da0e75f5a750.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e094cb9a-26de-4645-8761-65c0c425d1de.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e094cb9a-26de-4645-8761-65c0c425d1de.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e094cb9a-26de-4645-8761-65c0c425d1de.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e094cb9a-26de-4645-8761-65c0c425d1de.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e7778cfc-e97c-4458-9ecb-b4f2bba8946c.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e7778cfc-e97c-4458-9ecb-b4f2bba8946c.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e7778cfc-e97c-4458-9ecb-b4f2bba8946c.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e7778cfc-e97c-4458-9ecb-b4f2bba8946c.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e87ffa8e-a3b5-f69c-9076-6011339de1f6.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e87ffa8e-a3b5-f69c-9076-6011339de1f6.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e87ffa8e-a3b5-f69c-9076-6011339de1f6.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/e87ffa8e-a3b5-f69c-9076-6011339de1f6.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/eaf50f04-21dd-4620-913b-2a83f5635227.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/eaf50f04-21dd-4620-913b-2a83f5635227.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/eaf50f04-21dd-4620-913b-2a83f5635227.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/eaf50f04-21dd-4620-913b-2a83f5635227.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ec4b9503-13cb-48ab-a4ab-6ade4be46567.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ec4b9503-13cb-48ab-a4ab-6ade4be46567.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ec4b9503-13cb-48ab-a4ab-6ade4be46567.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ec4b9503-13cb-48ab-a4ab-6ade4be46567.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ed799e2b-2158-4c66-8da4-b40fe63bc72a.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ed799e2b-2158-4c66-8da4-b40fe63bc72a.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ed799e2b-2158-4c66-8da4-b40fe63bc72a.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ed799e2b-2158-4c66-8da4-b40fe63bc72a.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ef69ef6e-aa7f-4af1-a01d-ef775033524e.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ef69ef6e-aa7f-4af1-a01d-ef775033524e.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ef69ef6e-aa7f-4af1-a01d-ef775033524e.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/ef69ef6e-aa7f-4af1-a01d-ef775033524e.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/fbb5fbe2-16ad-4cf4-af7d-ff9d9c316c87.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/fbb5fbe2-16ad-4cf4-af7d-ff9d9c316c87.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/fbb5fbe2-16ad-4cf4-af7d-ff9d9c316c87.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SOURCE_DEFINITION/fbb5fbe2-16ad-4cf4-af7d-ff9d9c316c87.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/a294256f-1abe-4837-925f-91602c7207b4.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/a294256f-1abe-4837-925f-91602c7207b4.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/a294256f-1abe-4837-925f-91602c7207b4.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC/a294256f-1abe-4837-925f-91602c7207b4.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/49dae3f0-158b-4737-b6e4-0eed77d4b74e.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/a294256f-1abe-4837-925f-91602c7207b4.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/a294256f-1abe-4837-925f-91602c7207b4.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/a294256f-1abe-4837-925f-91602c7207b4.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_SYNC_SCHEDULE/a294256f-1abe-4837-925f-91602c7207b4.json diff --git a/airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_WORKSPACE/5ae6b09b-fdec-41af-aaf7-7d94cfc33ef6.json b/airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_WORKSPACE/5ae6b09b-fdec-41af-aaf7-7d94cfc33ef6.json similarity index 100% rename from airbyte-server/src/test/resources/migration/dummy_data/config/STANDARD_WORKSPACE/5ae6b09b-fdec-41af-aaf7-7d94cfc33ef6.json rename to airbyte-commons-server/src/test/resources/migration/dummy_data/config/STANDARD_WORKSPACE/5ae6b09b-fdec-41af-aaf7-7d94cfc33ef6.json diff --git a/airbyte-server/src/test/resources/migration/schema.sql b/airbyte-commons-server/src/test/resources/migration/schema.sql similarity index 100% rename from airbyte-server/src/test/resources/migration/schema.sql rename to airbyte-commons-server/src/test/resources/migration/schema.sql diff --git a/airbyte-server/build.gradle b/airbyte-server/build.gradle index 19d391456bcd3..c75ccaf1add05 100644 --- a/airbyte-server/build.gradle +++ b/airbyte-server/build.gradle @@ -35,6 +35,7 @@ dependencies { implementation project(':airbyte-api') implementation project(':airbyte-commons-docker') implementation project(':airbyte-commons-temporal') + implementation project(':airbyte-commons-server') implementation project(':airbyte-commons-worker') implementation project(':airbyte-config:init') implementation project(':airbyte-config:config-models') diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java index 16f3405d07e53..30e11d97c09c5 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java +++ b/airbyte-server/src/main/java/io/airbyte/server/ServerApp.java @@ -10,6 +10,13 @@ import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.commons.features.FeatureFlags; import io.airbyte.commons.resources.MoreResources; +import io.airbyte.commons.server.RequestLogger; +import io.airbyte.commons.server.errors.*; +import io.airbyte.commons.server.handlers.*; +import io.airbyte.commons.server.scheduler.DefaultSynchronousSchedulerClient; +import io.airbyte.commons.server.scheduler.EventRunner; +import io.airbyte.commons.server.scheduler.TemporalEventRunner; +import io.airbyte.commons.server.services.AirbyteGithubStore; import io.airbyte.commons.temporal.ConnectionManagerUtils; import io.airbyte.commons.temporal.StreamResetRecordsHelper; import io.airbyte.commons.temporal.TemporalClient; @@ -38,12 +45,6 @@ import io.airbyte.persistence.job.errorreporter.JobErrorReportingClientFactory; import io.airbyte.persistence.job.factory.OAuthConfigSupplier; import io.airbyte.persistence.job.tracker.JobTracker; -import io.airbyte.server.errors.*; -import io.airbyte.server.handlers.*; -import io.airbyte.server.scheduler.DefaultSynchronousSchedulerClient; -import io.airbyte.server.scheduler.EventRunner; -import io.airbyte.server.scheduler.TemporalEventRunner; -import io.airbyte.server.services.AirbyteGithubStore; import io.airbyte.validation.json.JsonSchemaValidator; import io.airbyte.workers.helper.ConnectionHelper; import io.temporal.serviceclient.WorkflowServiceStubs; diff --git a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java index 4fb8307719065..2ceb52bd9e4d2 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java +++ b/airbyte-server/src/main/java/io/airbyte/server/ServerFactory.java @@ -5,6 +5,9 @@ package io.airbyte.server; import io.airbyte.analytics.TrackingClient; +import io.airbyte.commons.server.handlers.*; +import io.airbyte.commons.server.scheduler.EventRunner; +import io.airbyte.commons.server.scheduler.SynchronousSchedulerClient; import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs.WorkerEnvironment; import io.airbyte.config.helpers.LogConfigs; @@ -13,9 +16,6 @@ import io.airbyte.config.persistence.SecretsRepositoryWriter; import io.airbyte.db.Database; import io.airbyte.persistence.job.JobPersistence; -import io.airbyte.server.handlers.*; -import io.airbyte.server.scheduler.EventRunner; -import io.airbyte.server.scheduler.SynchronousSchedulerClient; import java.net.http.HttpClient; import java.nio.file.Path; import java.util.HashSet; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ApiHelper.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ApiHelper.java index b24eda21e7541..63541a77b34ce 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ApiHelper.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ApiHelper.java @@ -4,9 +4,9 @@ package io.airbyte.server.apis; +import io.airbyte.commons.server.errors.BadObjectSchemaKnownException; +import io.airbyte.commons.server.errors.IdNotFoundKnownException; import io.airbyte.config.persistence.ConfigNotFoundException; -import io.airbyte.server.errors.BadObjectSchemaKnownException; -import io.airbyte.server.errors.IdNotFoundKnownException; import io.airbyte.validation.json.JsonValidationException; import java.io.IOException; import org.slf4j.LoggerFactory; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/AttemptApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/AttemptApiController.java index c7c112405b44c..64e8c4730d8fa 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/AttemptApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/AttemptApiController.java @@ -10,7 +10,7 @@ import io.airbyte.api.model.generated.InternalOperationResult; import io.airbyte.api.model.generated.SaveStatsRequestBody; import io.airbyte.api.model.generated.SetWorkflowInAttemptRequestBody; -import io.airbyte.server.handlers.AttemptHandler; +import io.airbyte.commons.server.handlers.AttemptHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Body; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java index aca38ca5ccec7..094acc9416e30 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java @@ -16,9 +16,9 @@ import io.airbyte.api.model.generated.ConnectionUpdate; import io.airbyte.api.model.generated.JobInfoRead; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; -import io.airbyte.server.handlers.ConnectionsHandler; -import io.airbyte.server.handlers.OperationsHandler; -import io.airbyte.server.handlers.SchedulerHandler; +import io.airbyte.commons.server.handlers.ConnectionsHandler; +import io.airbyte.commons.server.handlers.OperationsHandler; +import io.airbyte.commons.server.handlers.SchedulerHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpStatus; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java index 0c1d5f074faa1..0b3c16ea84246 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java @@ -17,8 +17,8 @@ import io.airbyte.api.model.generated.DestinationSearch; import io.airbyte.api.model.generated.DestinationUpdate; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; -import io.airbyte.server.handlers.DestinationHandler; -import io.airbyte.server.handlers.SchedulerHandler; +import io.airbyte.commons.server.handlers.DestinationHandler; +import io.airbyte.commons.server.handlers.SchedulerHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Body; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java index e3796c033c320..6fe120b689f63 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java @@ -19,7 +19,7 @@ import io.airbyte.api.model.generated.PrivateDestinationDefinitionRead; import io.airbyte.api.model.generated.PrivateDestinationDefinitionReadList; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; -import io.airbyte.server.handlers.DestinationDefinitionsHandler; +import io.airbyte.commons.server.handlers.DestinationDefinitionsHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpStatus; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionSpecificationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionSpecificationApiController.java index d93bc6dcbe999..a6c013df95421 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionSpecificationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionSpecificationApiController.java @@ -9,7 +9,7 @@ import io.airbyte.api.generated.DestinationDefinitionSpecificationApi; import io.airbyte.api.model.generated.DestinationDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.DestinationDefinitionSpecificationRead; -import io.airbyte.server.handlers.SchedulerHandler; +import io.airbyte.commons.server.handlers.SchedulerHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java index 58286dfacd483..3d508935a4bd0 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java @@ -12,7 +12,7 @@ import io.airbyte.api.model.generated.DestinationOauthConsentRequest; import io.airbyte.api.model.generated.OAuthConsentRead; import io.airbyte.api.model.generated.SetInstancewideDestinationOauthParamsRequestBody; -import io.airbyte.server.handlers.OAuthHandler; +import io.airbyte.commons.server.handlers.OAuthHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/HealthApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/HealthApiController.java index 3ffb6851cbc55..de386a5367754 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/HealthApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/HealthApiController.java @@ -6,7 +6,7 @@ import io.airbyte.api.generated.HealthApi; import io.airbyte.api.model.generated.HealthCheckRead; -import io.airbyte.server.handlers.HealthCheckHandler; +import io.airbyte.commons.server.handlers.HealthCheckHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java index b930472e5d230..8ca1195c92f49 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java @@ -18,8 +18,8 @@ import io.airbyte.api.model.generated.JobListRequestBody; import io.airbyte.api.model.generated.JobOptionalRead; import io.airbyte.api.model.generated.JobReadList; -import io.airbyte.server.handlers.JobHistoryHandler; -import io.airbyte.server.handlers.SchedulerHandler; +import io.airbyte.commons.server.handlers.JobHistoryHandler; +import io.airbyte.commons.server.handlers.SchedulerHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/LogsApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/LogsApiController.java index 13257412cf043..e98749577545b 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/LogsApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/LogsApiController.java @@ -8,7 +8,7 @@ import io.airbyte.api.generated.LogsApi; import io.airbyte.api.model.generated.LogsRequestBody; -import io.airbyte.server.handlers.LogsHandler; +import io.airbyte.commons.server.handlers.LogsHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/NotificationsApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/NotificationsApiController.java index c81799b9ac924..e2cf648e33985 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/NotificationsApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/NotificationsApiController.java @@ -9,7 +9,7 @@ import io.airbyte.api.generated.NotificationsApi; import io.airbyte.api.model.generated.Notification; import io.airbyte.api.model.generated.NotificationRead; -import io.airbyte.server.handlers.WorkspacesHandler; +import io.airbyte.commons.server.handlers.WorkspacesHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/OpenapiApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/OpenapiApiController.java index 5e574a23deb9d..0f1754d014921 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/OpenapiApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/OpenapiApiController.java @@ -7,7 +7,7 @@ import static io.airbyte.commons.auth.AuthRoleConstants.AUTHENTICATED_USER; import io.airbyte.api.generated.OpenapiApi; -import io.airbyte.server.handlers.OpenApiConfigHandler; +import io.airbyte.commons.server.handlers.OpenApiConfigHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java index 64ac3c337f51a..73e19c1848052 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java @@ -17,7 +17,7 @@ import io.airbyte.api.model.generated.OperationReadList; import io.airbyte.api.model.generated.OperationUpdate; import io.airbyte.api.model.generated.OperatorConfiguration; -import io.airbyte.server.handlers.OperationsHandler; +import io.airbyte.commons.server.handlers.OperationsHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Body; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java index 365dc04afc465..4799406c8a42a 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java @@ -12,7 +12,7 @@ import io.airbyte.api.model.generated.DestinationCoreConfig; import io.airbyte.api.model.generated.SourceCoreConfig; import io.airbyte.api.model.generated.SourceDiscoverSchemaRead; -import io.airbyte.server.handlers.SchedulerHandler; +import io.airbyte.commons.server.handlers.SchedulerHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java index d7946484d8ee4..12efa77023167 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceApiController.java @@ -22,8 +22,8 @@ import io.airbyte.api.model.generated.SourceSearch; import io.airbyte.api.model.generated.SourceUpdate; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; -import io.airbyte.server.handlers.SchedulerHandler; -import io.airbyte.server.handlers.SourceHandler; +import io.airbyte.commons.server.handlers.SchedulerHandler; +import io.airbyte.commons.server.handlers.SourceHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Controller; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java index 1dac7ca5b7089..ef7004105e5b0 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionApiController.java @@ -19,7 +19,7 @@ import io.airbyte.api.model.generated.SourceDefinitionReadList; import io.airbyte.api.model.generated.SourceDefinitionUpdate; import io.airbyte.api.model.generated.WorkspaceIdRequestBody; -import io.airbyte.server.handlers.SourceDefinitionsHandler; +import io.airbyte.commons.server.handlers.SourceDefinitionsHandler; import io.micronaut.context.annotation.Context; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpStatus; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionSpecificationApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionSpecificationApiController.java index e87b5c28bddc2..2e094bc3f7058 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionSpecificationApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceDefinitionSpecificationApiController.java @@ -9,7 +9,7 @@ import io.airbyte.api.generated.SourceDefinitionSpecificationApi; import io.airbyte.api.model.generated.SourceDefinitionIdWithWorkspaceId; import io.airbyte.api.model.generated.SourceDefinitionSpecificationRead; -import io.airbyte.server.handlers.SchedulerHandler; +import io.airbyte.commons.server.handlers.SchedulerHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java index 52cbc82beb97f..785c41519bf50 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/SourceOauthApiController.java @@ -12,7 +12,7 @@ import io.airbyte.api.model.generated.OAuthConsentRead; import io.airbyte.api.model.generated.SetInstancewideSourceOauthParamsRequestBody; import io.airbyte.api.model.generated.SourceOauthConsentRequest; -import io.airbyte.server.handlers.OAuthHandler; +import io.airbyte.commons.server.handlers.OAuthHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Body; import io.micronaut.http.annotation.Controller; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/StateApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/StateApiController.java index 870a499d5999d..02b1941e5bd8e 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/StateApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/StateApiController.java @@ -11,7 +11,7 @@ import io.airbyte.api.model.generated.ConnectionIdRequestBody; import io.airbyte.api.model.generated.ConnectionState; import io.airbyte.api.model.generated.ConnectionStateCreateOrUpdate; -import io.airbyte.server.handlers.StateHandler; +import io.airbyte.commons.server.handlers.StateHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/WebBackendApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/WebBackendApiController.java index af8c5a3ad3167..b5c515e37f93d 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/WebBackendApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/WebBackendApiController.java @@ -21,9 +21,9 @@ import io.airbyte.api.model.generated.WebBackendGeographiesListResult; import io.airbyte.api.model.generated.WebBackendWorkspaceState; import io.airbyte.api.model.generated.WebBackendWorkspaceStateResult; -import io.airbyte.server.handlers.WebBackendCheckUpdatesHandler; -import io.airbyte.server.handlers.WebBackendConnectionsHandler; -import io.airbyte.server.handlers.WebBackendGeographiesHandler; +import io.airbyte.commons.server.handlers.WebBackendCheckUpdatesHandler; +import io.airbyte.commons.server.handlers.WebBackendConnectionsHandler; +import io.airbyte.commons.server.handlers.WebBackendGeographiesHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Post; diff --git a/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java b/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java index c270ce286ccf9..5bc66adb7ffd0 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java +++ b/airbyte-server/src/main/java/io/airbyte/server/apis/WorkspaceApiController.java @@ -17,7 +17,7 @@ import io.airbyte.api.model.generated.WorkspaceReadList; import io.airbyte.api.model.generated.WorkspaceUpdate; import io.airbyte.api.model.generated.WorkspaceUpdateName; -import io.airbyte.server.handlers.WorkspacesHandler; +import io.airbyte.commons.server.handlers.WorkspacesHandler; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Body; diff --git a/airbyte-server/src/main/java/io/airbyte/server/config/ApplicationBeanFactory.java b/airbyte-server/src/main/java/io/airbyte/server/config/ApplicationBeanFactory.java index 13111f657156b..e21046c46c687 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/config/ApplicationBeanFactory.java +++ b/airbyte-server/src/main/java/io/airbyte/server/config/ApplicationBeanFactory.java @@ -7,6 +7,9 @@ import io.airbyte.analytics.TrackingClient; import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.commons.features.FeatureFlags; +import io.airbyte.commons.server.scheduler.EventRunner; +import io.airbyte.commons.server.scheduler.TemporalEventRunner; +import io.airbyte.commons.server.services.AirbyteGithubStore; import io.airbyte.commons.temporal.TemporalClient; import io.airbyte.commons.version.AirbyteProtocolVersionRange; import io.airbyte.commons.version.AirbyteVersion; @@ -18,9 +21,6 @@ import io.airbyte.persistence.job.JobPersistence; import io.airbyte.persistence.job.WebUrlHelper; import io.airbyte.persistence.job.tracker.JobTracker; -import io.airbyte.server.scheduler.EventRunner; -import io.airbyte.server.scheduler.TemporalEventRunner; -import io.airbyte.server.services.AirbyteGithubStore; import io.airbyte.validation.json.JsonSchemaValidator; import io.micronaut.context.annotation.Factory; import io.micronaut.context.annotation.Value; diff --git a/airbyte-server/src/main/java/io/airbyte/server/config/TemporalBeanFactory.java b/airbyte-server/src/main/java/io/airbyte/server/config/TemporalBeanFactory.java index 069a3853193f7..f3dd40c530af8 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/config/TemporalBeanFactory.java +++ b/airbyte-server/src/main/java/io/airbyte/server/config/TemporalBeanFactory.java @@ -7,6 +7,8 @@ import io.airbyte.analytics.Deployment; import io.airbyte.analytics.TrackingClient; import io.airbyte.analytics.TrackingClientSingleton; +import io.airbyte.commons.server.scheduler.DefaultSynchronousSchedulerClient; +import io.airbyte.commons.server.scheduler.SynchronousSchedulerClient; import io.airbyte.commons.temporal.TemporalClient; import io.airbyte.commons.version.AirbyteVersion; import io.airbyte.config.Configs.DeploymentMode; @@ -17,8 +19,6 @@ import io.airbyte.persistence.job.errorreporter.JobErrorReporter; import io.airbyte.persistence.job.factory.OAuthConfigSupplier; import io.airbyte.persistence.job.tracker.JobTracker; -import io.airbyte.server.scheduler.DefaultSynchronousSchedulerClient; -import io.airbyte.server.scheduler.SynchronousSchedulerClient; import io.micronaut.context.annotation.Factory; import io.micronaut.context.annotation.Value; import jakarta.inject.Singleton; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidInputExceptionHandler.java b/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidInputExceptionHandler.java index 6cdc923e3ebfc..77d11239d1d58 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidInputExceptionHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidInputExceptionHandler.java @@ -4,9 +4,8 @@ package io.airbyte.server.errors; -import io.airbyte.api.model.generated.InvalidInputExceptionInfo; -import io.airbyte.api.model.generated.InvalidInputProperty; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.errors.InvalidInputExceptionMapper; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; @@ -15,11 +14,7 @@ import io.micronaut.http.annotation.Produces; import io.micronaut.http.server.exceptions.ExceptionHandler; import jakarta.inject.Singleton; -import java.util.ArrayList; -import java.util.List; -import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; -import org.apache.logging.log4j.core.util.Throwables; // https://www.baeldung.com/jersey-bean-validation#custom-exception-handler // handles exceptions related to the request body not matching the openapi config. @@ -28,27 +23,10 @@ @Requires(classes = ConstraintViolationException.class) public class InvalidInputExceptionHandler implements ExceptionHandler { - public static InvalidInputExceptionInfo infoFromConstraints(final ConstraintViolationException cve) { - final InvalidInputExceptionInfo exceptionInfo = new InvalidInputExceptionInfo() - .exceptionClassName(cve.getClass().getName()) - .message("Some properties contained invalid input.") - .exceptionStack(Throwables.toStringList(cve)); - - final List props = new ArrayList(); - for (final ConstraintViolation cv : cve.getConstraintViolations()) { - props.add(new InvalidInputProperty() - .propertyPath(cv.getPropertyPath().toString()) - .message(cv.getMessage()) - .invalidValue(cv.getInvalidValue() != null ? cv.getInvalidValue().toString() : "null")); - } - exceptionInfo.validationErrors(props); - return exceptionInfo; - } - @Override public HttpResponse handle(final HttpRequest request, final ConstraintViolationException exception) { return HttpResponse.status(HttpStatus.BAD_REQUEST) - .body(Jsons.serialize(InvalidInputExceptionHandler.infoFromConstraints(exception))) + .body(Jsons.serialize(InvalidInputExceptionMapper.infoFromConstraints(exception))) .contentType(MediaType.APPLICATION_JSON_TYPE); } diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidInputExceptionMapper.java b/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidInputExceptionMapper.java deleted file mode 100644 index 4fe9b202265cb..0000000000000 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidInputExceptionMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2022 Airbyte, Inc., all rights reserved. - */ - -package io.airbyte.server.errors; - -import io.airbyte.commons.json.Jsons; -import javax.validation.ConstraintViolationException; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; - -@Provider -public class InvalidInputExceptionMapper implements ExceptionMapper { - - @Override - public Response toResponse(final ConstraintViolationException e) { - return Response.status(Response.Status.BAD_REQUEST) - .entity(Jsons.serialize(InvalidInputExceptionHandler.infoFromConstraints(e))) - .type("application/json") - .build(); - } - -} diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonExceptionHandler.java b/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonExceptionHandler.java index ee7a3e57a2e97..e8aa3ceefb984 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonExceptionHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonExceptionHandler.java @@ -5,6 +5,7 @@ package io.airbyte.server.errors; import com.fasterxml.jackson.core.JsonParseException; +import io.airbyte.commons.server.errors.KnownException; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonInputExceptionHandler.java b/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonInputExceptionHandler.java index fe5f7abaa4b89..ebb9a5158667b 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonInputExceptionHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/errors/InvalidJsonInputExceptionHandler.java @@ -5,6 +5,7 @@ package io.airbyte.server.errors; import com.fasterxml.jackson.databind.JsonMappingException; +import io.airbyte.commons.server.errors.KnownException; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/KnownExceptionHandler.java b/airbyte-server/src/main/java/io/airbyte/server/errors/KnownExceptionHandler.java index 4b928ded59266..1d4b932fe00ab 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/KnownExceptionHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/errors/KnownExceptionHandler.java @@ -5,6 +5,7 @@ package io.airbyte.server.errors; import io.airbyte.commons.json.Jsons; +import io.airbyte.commons.server.errors.KnownException; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/NotFoundExceptionHandler.java b/airbyte-server/src/main/java/io/airbyte/server/errors/NotFoundExceptionHandler.java index 86d83a33bdb18..e522fea2c78bf 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/NotFoundExceptionHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/errors/NotFoundExceptionHandler.java @@ -4,6 +4,8 @@ package io.airbyte.server.errors; +import io.airbyte.commons.server.errors.IdNotFoundKnownException; +import io.airbyte.commons.server.errors.KnownException; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/airbyte-server/src/main/java/io/airbyte/server/errors/UncaughtExceptionHandler.java b/airbyte-server/src/main/java/io/airbyte/server/errors/UncaughtExceptionHandler.java index afaf26bd4842b..00b032d524ec0 100644 --- a/airbyte-server/src/main/java/io/airbyte/server/errors/UncaughtExceptionHandler.java +++ b/airbyte-server/src/main/java/io/airbyte/server/errors/UncaughtExceptionHandler.java @@ -4,6 +4,7 @@ package io.airbyte.server.errors; +import io.airbyte.commons.server.errors.KnownException; import io.micronaut.context.annotation.Requires; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; diff --git a/airbyte-server/src/test/java/io/airbyte/server/apis/HealthCheckApiTest.java b/airbyte-server/src/test/java/io/airbyte/server/apis/HealthCheckApiTest.java index cc4f5d814e35e..eb9f258eb1782 100644 --- a/airbyte-server/src/test/java/io/airbyte/server/apis/HealthCheckApiTest.java +++ b/airbyte-server/src/test/java/io/airbyte/server/apis/HealthCheckApiTest.java @@ -9,7 +9,7 @@ import static org.mockito.Mockito.when; import io.airbyte.api.model.generated.HealthCheckRead; -import io.airbyte.server.handlers.HealthCheckHandler; +import io.airbyte.commons.server.handlers.HealthCheckHandler; import org.junit.jupiter.api.Test; class HealthCheckApiTest { diff --git a/gradle.properties b/gradle.properties index f688779de9056..bd7bbf32d0a87 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.parallel=true -org.gradle.jvmargs=-Xmx4g -Xss4m +org.gradle.jvmargs=-Xmx8g -Xss4m org.gradle.caching=true # Note, this might have issues on the normal Github runner. diff --git a/settings.gradle b/settings.gradle index 4b698a1bafef0..4b79182b6b812 100644 --- a/settings.gradle +++ b/settings.gradle @@ -106,6 +106,7 @@ include ':airbyte-worker-models' // platform if (!System.getenv().containsKey("SUB_BUILD") || System.getenv().get("SUB_BUILD") == "PLATFORM") { include ':airbyte-bootloader' + include ':airbyte-commons-server' include ':airbyte-config:specs' include ':airbyte-connector-builder-server' include ':airbyte-container-orchestrator' @@ -172,3 +173,5 @@ if (!System.getenv().containsKey("SUB_BUILD") || System.getenv().get("SUB_BUILD" } } } + + From 04a77ad3aa9983390738b2899edda0de9a0a8559 Mon Sep 17 00:00:00 2001 From: "Roman Yermilov [GL]" <86300758+roman-yermilov-gl@users.noreply.github.com> Date: Tue, 24 Jan 2023 20:00:51 +0400 Subject: [PATCH 064/195] Source S3: keep processing but warn if OSError happen (#21604) * Source S3: keep processing but warn if OSError happen * Source S3: bump version and update changelog * auto-bump connector version Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-s3/Dockerfile | 2 +- .../integration_tests/config_minio.json | 2 +- .../connectors/source-s3/source_s3/s3file.py | 13 +++++-- .../source_s3/source_files_abstract/stream.py | 36 +++++++++++-------- docs/integrations/sources/s3.md | 1 + 7 files changed, 37 insertions(+), 21 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 867c293e56fef..0a3e2c9216536 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1504,7 +1504,7 @@ - name: S3 sourceDefinitionId: 69589781-7828-43c5-9f63-8925b1c1ccc2 dockerRepository: airbyte/source-s3 - dockerImageTag: 0.1.28 + dockerImageTag: 0.1.29 documentationUrl: https://docs.airbyte.com/integrations/sources/s3 icon: s3.svg sourceType: file diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 4a7a7cb364afc..f5e812e5e4a90 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -12646,7 +12646,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-s3:0.1.28" +- dockerImage: "airbyte/source-s3:0.1.29" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/s3" changelogUrl: "https://docs.airbyte.com/integrations/sources/s3" diff --git a/airbyte-integrations/connectors/source-s3/Dockerfile b/airbyte-integrations/connectors/source-s3/Dockerfile index 5483d35fd9f47..718d25530ed4a 100644 --- a/airbyte-integrations/connectors/source-s3/Dockerfile +++ b/airbyte-integrations/connectors/source-s3/Dockerfile @@ -17,5 +17,5 @@ COPY source_s3 ./source_s3 ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.28 +LABEL io.airbyte.version=0.1.29 LABEL io.airbyte.name=airbyte/source-s3 diff --git a/airbyte-integrations/connectors/source-s3/integration_tests/config_minio.json b/airbyte-integrations/connectors/source-s3/integration_tests/config_minio.json index c51152a102b0a..e085938750845 100644 --- a/airbyte-integrations/connectors/source-s3/integration_tests/config_minio.json +++ b/airbyte-integrations/connectors/source-s3/integration_tests/config_minio.json @@ -6,7 +6,7 @@ "aws_access_key_id": "123456", "aws_secret_access_key": "123456key", "path_prefix": "", - "endpoint": "http://10.0.231.175:9000" + "endpoint": "http://10.0.40.43:9000" }, "format": { "filetype": "csv", diff --git a/airbyte-integrations/connectors/source-s3/source_s3/s3file.py b/airbyte-integrations/connectors/source-s3/source_s3/s3file.py index b49bac2fef8f8..99b30fecc56f4 100644 --- a/airbyte-integrations/connectors/source-s3/source_s3/s3file.py +++ b/airbyte-integrations/connectors/source-s3/source_s3/s3file.py @@ -59,8 +59,17 @@ def open(self, binary: bool) -> Iterator[Union[TextIO, BinaryIO]]: config = ClientConfig(signature_version=UNSIGNED) params = {"client": make_s3_client(self._provider, config=config)} self.logger.debug(f"try to open {self.file_info}") - result = smart_open.open(f"s3://{bucket}/{self.url}", transport_params=params, mode=mode) - + # There are rare cases when some keys become unreachable during sync + # and we don't know about it, because catalog has been initially formed only once at the beginning + # This is happen for example if a file was deleted/moved (or anything else) while we proceed with another file + try: + result = smart_open.open(f"s3://{bucket}/{self.url}", transport_params=params, mode=mode) + except OSError as e: + self.logger.warn( + f"We don't have access to {self.url}. " + f"Check whether key {self.url} exists in `{bucket}` bucket and/or has proper ACL permissions" + ) + raise e # see https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager for why we do this try: yield result diff --git a/airbyte-integrations/connectors/source-s3/source_s3/source_files_abstract/stream.py b/airbyte-integrations/connectors/source-s3/source_s3/source_files_abstract/stream.py index bf20111ab53a5..939c1b6dd7dd1 100644 --- a/airbyte-integrations/connectors/source-s3/source_s3/source_files_abstract/stream.py +++ b/airbyte-integrations/connectors/source-s3/source_s3/source_files_abstract/stream.py @@ -230,9 +230,12 @@ def _get_master_schema(self, min_datetime: datetime = None) -> Dict[str, Any]: continue storagefile = self.storagefile_class(file_info, self._provider) - with storagefile.open(file_reader.is_binary) as f: - this_schema = file_reader.get_inferred_schema(f, file_info) - processed_files.append(file_info) + try: + with storagefile.open(file_reader.is_binary) as f: + this_schema = file_reader.get_inferred_schema(f, file_info) + processed_files.append(file_info) + except OSError: + continue if this_schema == master_schema: continue # exact schema match so go to next file @@ -348,18 +351,21 @@ def _read_from_slice( """ for file_item in stream_slice["files"]: storage_file: StorageFile = file_item["storage_file"] - with storage_file.open(file_reader.is_binary) as f: - # TODO: make this more efficient than mutating every record one-by-one as they stream - for record in file_reader.stream_records(f, storage_file.file_info): - schema_matched_record = self._match_target_schema(record, list(self._get_schema_map().keys())) - complete_record = self._add_extra_fields_from_map( - schema_matched_record, - { - self.ab_last_mod_col: datetime.strftime(storage_file.last_modified, self.datetime_format_string), - self.ab_file_name_col: storage_file.url, - }, - ) - yield complete_record + try: + with storage_file.open(file_reader.is_binary) as f: + # TODO: make this more efficient than mutating every record one-by-one as they stream + for record in file_reader.stream_records(f, storage_file.file_info): + schema_matched_record = self._match_target_schema(record, list(self._get_schema_map().keys())) + complete_record = self._add_extra_fields_from_map( + schema_matched_record, + { + self.ab_last_mod_col: datetime.strftime(storage_file.last_modified, self.datetime_format_string), + self.ab_file_name_col: storage_file.url, + }, + ) + yield complete_record + except OSError: + continue LOGGER.info("finished reading a stream slice") def read_records( diff --git a/docs/integrations/sources/s3.md b/docs/integrations/sources/s3.md index efdf8c1b2feed..b24070c84c757 100644 --- a/docs/integrations/sources/s3.md +++ b/docs/integrations/sources/s3.md @@ -209,6 +209,7 @@ The Jsonl parser uses pyarrow hence,only the line-delimited JSON format is suppo | Version | Date | Pull Request | Subject | |:--------|:-----------|:----------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------| +| 0.1.29 | 2023-01-19 | [21604](https://github.com/airbytehq/airbyte/pull/21604) | Handle OSError: skip unreachable keys and keep working on accessible ones. Warn a customer | | 0.1.28 | 2023-01-10 | [21210](https://github.com/airbytehq/airbyte/pull/21210) | Update block size for json file format | | 0.1.27 | 2022-12-08 | [20262](https://github.com/airbytehq/airbyte/pull/20262) | Check config settings for CSV file format | | 0.1.26 | 2022-11-08 | [19006](https://github.com/airbytehq/airbyte/pull/19006) | Add virtual-hosted-style option | From e4a77368025c3d6443b2761b68f6c7daa5a061cc Mon Sep 17 00:00:00 2001 From: Joey Marshment-Howell Date: Tue, 24 Jan 2023 17:54:14 +0100 Subject: [PATCH 065/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=90=9B=20Fix=20tes?= =?UTF-8?q?t=20with=20potentially=20mismatching=20time=20values=20(#21795)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connection/JobProgress/utils.test.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/airbyte-webapp/src/components/connection/JobProgress/utils.test.ts b/airbyte-webapp/src/components/connection/JobProgress/utils.test.ts index 17b9d08611159..58765983570ee 100644 --- a/airbyte-webapp/src/components/connection/JobProgress/utils.test.ts +++ b/airbyte-webapp/src/components/connection/JobProgress/utils.test.ts @@ -47,15 +47,13 @@ describe("#progressBarCalculations", () => { }); }); -const makeAttempt = ( - totalStats: AttemptStats = {}, - streamStats: AttemptStreamStats[] = [], +const makeAttempt = (totalStats: AttemptStats = {}, streamStats: AttemptStreamStats[] = []) => { + const now = Date.now(); // API returns time in seconds - createdAt = Date.now() / 1000 - 10, - updatedAt = Date.now() / 1000, - id = 123, - status: AttemptStatus = "running" -) => { + const createdAt = now / 1000 - 10; + const updatedAt = now / 1000; + const id = 123; + const status: AttemptStatus = "running"; const attempt: AttemptRead = { id, status, createdAt, updatedAt, totalStats, streamStats }; return attempt; }; From 869dd07b2c0ba69676a0beacb6677eaf56da421f Mon Sep 17 00:00:00 2001 From: Kyryl Skobylko Date: Tue, 24 Jan 2023 19:17:51 +0200 Subject: [PATCH 066/195] Update helm charts with replica count value (#21796) --- charts/airbyte-cron/templates/deployment.yaml | 2 +- charts/airbyte-pod-sweeper/templates/deployment.yaml | 2 +- charts/airbyte-pod-sweeper/values.yaml | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/charts/airbyte-cron/templates/deployment.yaml b/charts/airbyte-cron/templates/deployment.yaml index 0d146d1dd07af..e7ef3b0a9403a 100644 --- a/charts/airbyte-cron/templates/deployment.yaml +++ b/charts/airbyte-cron/templates/deployment.yaml @@ -8,7 +8,7 @@ metadata: {{ toYaml (mergeOverwrite .Values.extraLabels .Values.global.extraLabels) | nindent 4 }} {{- end }} spec: - replicas: 1 + replicas: {{ .Values.replicaCount }} selector: matchLabels: {{- include "airbyte.selectorLabels" . | nindent 6 }} diff --git a/charts/airbyte-pod-sweeper/templates/deployment.yaml b/charts/airbyte-pod-sweeper/templates/deployment.yaml index a81869993d940..cd6d2e4d946bf 100644 --- a/charts/airbyte-pod-sweeper/templates/deployment.yaml +++ b/charts/airbyte-pod-sweeper/templates/deployment.yaml @@ -6,7 +6,7 @@ metadata: labels: {{- include "airbyte.labels" . | nindent 4 }} spec: - replicas: 1 + replicas: {{ .Values.replicaCount }} selector: matchLabels: {{- include "airbyte.selectorLabels" . | nindent 6 }} diff --git a/charts/airbyte-pod-sweeper/values.yaml b/charts/airbyte-pod-sweeper/values.yaml index 4a4d599e8c563..153b5739ad460 100644 --- a/charts/airbyte-pod-sweeper/values.yaml +++ b/charts/airbyte-pod-sweeper/values.yaml @@ -222,4 +222,6 @@ extraVolumes: [] ## podSweeper.timeToDeletePods.error Time to remove pods on error status (minutes). timeToDeletePods: completed: 120 - error: 1440 \ No newline at end of file + error: 1440 + +replicaCount: 1 \ No newline at end of file From cede30a83204e05d0ac9b65a2496c3b075632ee8 Mon Sep 17 00:00:00 2001 From: Julian Rommel <63144867+JulianRommel@users.noreply.github.com> Date: Tue, 24 Jan 2023 18:32:47 +0100 Subject: [PATCH 067/195] Docs: added nginx reverse proxy example config (#21340) * Added nginx reverse proxy example config I added a nginx example config if people want to put their local installation of Airbyte behind a reverse proxy. * Fixed a typo Changed "ssl" to upper case --- docs/operator-guides/security.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/operator-guides/security.md b/docs/operator-guides/security.md index f095d1de91740..3a50e59dc1e8d 100644 --- a/docs/operator-guides/security.md +++ b/docs/operator-guides/security.md @@ -37,7 +37,23 @@ Deploy Airbyte Open Source in a private network or use a firewall to filter whic You can secure access to Airbyte using the following methods: - Deploy Airbyte in a private network or use a firewall to filter which IP is allowed to access your host. -- Deploy Airbyte behind a reverse proxy and handle the access control on the reverse proxy side. +- Deploy Airbyte behind a reverse proxy and handle the access control and SSL encryption on the reverse proxy side. + ``` + # Example nginx reverse proxy config + server { + listen 443 ssl; + server_name airbyte..com; + client_max_body_size 200M; # required for Airbyte API + ssl_certificate .crt.pem; + ssl_certificate_key .key.pem; + + location / { + proxy_pass http://127.0.0.1:8000; + proxy_set_header Cookie $http_ccokie; # if you use Airbytes basic auth + proxy_read_timeout 3600; # set a number in seconds suitable for you + } + } + ``` - Change the default username and password in your environment's `.env` file: ``` # Proxy Configuration From e2139d92d3c560a4a9fc737db790f42ed86ad122 Mon Sep 17 00:00:00 2001 From: Alex Birdsall Date: Tue, 24 Jan 2023 10:30:21 -0800 Subject: [PATCH 068/195] Update FCP email notification phrasing (#21809) --- airbyte-webapp/src/packages/cloud/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airbyte-webapp/src/packages/cloud/locales/en.json b/airbyte-webapp/src/packages/cloud/locales/en.json index d86f8b13e677c..735212e95f262 100644 --- a/airbyte-webapp/src/packages/cloud/locales/en.json +++ b/airbyte-webapp/src/packages/cloud/locales/en.json @@ -186,7 +186,7 @@ "freeConnectorProgram.enroll.success": "Successfully enrolled in the Free Connector Program", "freeConnectorProgram.enrollmentModal.title": "Free connector program", "freeConnectorProgram.enrollmentModal.free": "Alpha and Beta Connectors are free while you're in the program.The whole Connection is free until both Connectors have moved into General Availability (GA)", - "freeConnectorProgram.enrollmentModal.emailNotification": "We will email you before both connectors in a connection move to GA.", + "freeConnectorProgram.enrollmentModal.emailNotification": "We will email you before your connection will start being charged.", "freeConnectorProgram.enrollmentModal.cardOnFile": "When both Connectors are in GA, the Connection will no longer be free. You'll need to have a credit card on file to enroll so Airbyte can handle a Connection's transition to paid service.", "freeConnectorProgram.enrollmentModal.unvalidatedEmailWarning": "You need to verify your email address before you can enroll in the Free Connector Program. Re-send verification email.", "freeConnectorProgram.enrollmentModal.validationEmailConfirmation": "Verification email sent", From e4f47181905f0d58a8ea13996cd4d558ba287419 Mon Sep 17 00:00:00 2001 From: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> Date: Tue, 24 Jan 2023 14:03:34 -0500 Subject: [PATCH 069/195] Fix streams table from not flushing (#21675) --- .../ConnectionForm/ConnectionFormFields.module.scss | 5 ----- .../connection/ConnectionForm/ConnectionFormFields.tsx | 2 +- .../components/connection/ConnectionForm/Section.module.scss | 5 +++++ .../src/components/connection/ConnectionForm/Section.tsx | 5 +++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/airbyte-webapp/src/components/connection/ConnectionForm/ConnectionFormFields.module.scss b/airbyte-webapp/src/components/connection/ConnectionForm/ConnectionFormFields.module.scss index f9786ddd597ad..43b6fa9fc14f9 100644 --- a/airbyte-webapp/src/components/connection/ConnectionForm/ConnectionFormFields.module.scss +++ b/airbyte-webapp/src/components/connection/ConnectionForm/ConnectionFormFields.module.scss @@ -35,8 +35,3 @@ // used to control svg size font-size: 14px; } - -.flush { - padding: 0; - gap: 0; -} diff --git a/airbyte-webapp/src/components/connection/ConnectionForm/ConnectionFormFields.tsx b/airbyte-webapp/src/components/connection/ConnectionForm/ConnectionFormFields.tsx index a203ced39949d..2e36be9d248e6 100644 --- a/airbyte-webapp/src/components/connection/ConnectionForm/ConnectionFormFields.tsx +++ b/airbyte-webapp/src/components/connection/ConnectionForm/ConnectionFormFields.tsx @@ -127,7 +127,7 @@ export const ConnectionFormFields: React.FC = ({ valu )} -
    +
    > = ({ title, children, className }) => { +export const Section: React.FC> = ({ title, flush, children, className }) => { return ( -
    +
    {title && ( {title} From b7be7aa73a75f365b197bb24419e7c3186b0ab24 Mon Sep 17 00:00:00 2001 From: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> Date: Tue, 24 Jan 2023 14:08:38 -0500 Subject: [PATCH 070/195] =?UTF-8?q?=F0=9F=AA=9F=20=E2=9C=8D=F0=9F=8F=BC=20?= =?UTF-8?q?Fix=20namespace=20modal=20description=20(#21679)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix typos and wording in namespace modal text * Fix namespace description and ad support for customformat description * Add more clarity to the source namespace description --- .../DestinationNamespaceModal.tsx | 14 +++++++------- airbyte-webapp/src/locales/en.json | 9 +++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.tsx b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.tsx index 366a16bbf2b4d..40ed8273d8dc2 100644 --- a/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.tsx +++ b/airbyte-webapp/src/components/connection/DestinationNamespaceModal/DestinationNamespaceModal.tsx @@ -133,13 +133,13 @@ export const DestinationNamespaceModal: React.FC
    - {values.namespaceDefinition === NamespaceDefinitionType.source && ( - - )} - {(values.namespaceDefinition === NamespaceDefinitionType.destination || - values.namespaceDefinition === NamespaceDefinitionType.customformat) && ( - - )} + diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 32d224d27f1db..aca562d81eb8d 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -164,12 +164,13 @@ "connectionForm.modal.destinationNamespace.option.destination": "Destination default", "connectionForm.modal.destinationNamespace.option.customFormat": "Custom format", "connectionForm.modal.destinationNamespace.input.placeholder": "My namespace", - "connectionForm.modal.destinationNamespace.option.source.description": "Replicate to the default namespace in the destination, which will differ based on your destination.", - "connectionForm.modal.destinationNamespace.option.destination.description": "All stream will be replicated and store in the default namespace defined on the destination settings page.", - "connectionForm.modal.destinationNamespace.description": "The following table summarises how this works. We assume an example of replication configurations between a Postgres Source and Snowflake Destination (with settings of schema = \"my_schema\"):", + "connectionForm.modal.destinationNamespace.option.source.description": "Replicate the stream's source namespace in the destination.", + "connectionForm.modal.destinationNamespace.option.destination.description": "Replicate and store in the default namespace defined in the destination settings.", + "connectionForm.modal.destinationNamespace.option.customFormat.description": "Create a \"custom format\" to rename the namespace that your data will be replicated into.", + "connectionForm.modal.destinationNamespace.description": "Below is an example of how your data will be replicated with this namespace setting. This example assumes a Postgres Source and a Snowflake Destination with the schema set to \"my_schema\".", "connectionForm.modal.destinationNamespace.table.header.sourceNamespace": "Source namespace", "connectionForm.modal.destinationNamespace.table.header.destinationNamespace": "Destination namespace", - "connectionForm.modal.destinationNamespace.table.header.customFormat": "Custom format=", + "connectionForm.modal.destinationNamespace.table.header.customFormat": "Custom format", "connectionForm.modal.destinationNamespace.table.data.public": "public", "connectionForm.modal.destinationNamespace.table.data.mySchema": "my_schema", "connectionForm.modal.destinationNamespace.table.data.myPublicSchema": "my_public_schema", From e39ee94b8c639a0a2fcbaad548608b7de8df7577 Mon Sep 17 00:00:00 2001 From: Evan Tahler Date: Tue, 24 Jan 2023 16:55:51 -0800 Subject: [PATCH 071/195] Pass allowedHosts to container runners (#21676) * Pass allowed hosts to Process Factories and log * fix loading method * github allowed hosts * StringSubstitutor * lint * ConfigReplacerTest class + tests * tests are private --- .../general/DbtTransformationRunner.java | 1 + .../workers/helper/EntrypointEnvChecker.java | 1 + .../DefaultNormalizationRunner.java | 1 + .../process/AirbyteIntegrationLauncher.java | 9 +++ .../workers/process/DockerProcessFactory.java | 4 +- .../workers/process/KubeProcessFactory.java | 5 +- .../workers/process/ProcessFactory.java | 2 + .../DefaultNormalizationRunnerTest.java | 1 + .../AirbyteIntegrationLauncherTest.java | 8 ++- .../process/DockerProcessFactoryTest.java | 4 +- .../config/persistence/DbConverter.java | 11 +++- .../resources/seed/source_definitions.yaml | 6 ++ .../ReplicationJobOrchestrator.java | 2 + .../DestinationAcceptanceTest.java | 8 +-- .../source/AbstractSourceConnectorTest.java | 14 ++-- airbyte-worker-models/build.gradle | 4 ++ .../IntegrationLauncherConfig.yaml | 3 + .../CheckConnectionActivityImpl.java | 1 + .../catalog/DiscoverCatalogActivityImpl.java | 3 +- .../activities/GenerateInputActivityImpl.java | 13 +++- .../temporal/spec/SpecActivityImpl.java | 1 + .../sync/ReplicationActivityImpl.java | 2 + .../airbyte/workers/utils/ConfigReplacer.java | 63 ++++++++++++++++++ .../KubePodProcessIntegrationTest.java | 2 +- .../workers/utils/ConfigReplacerTest.java | 64 +++++++++++++++++++ 25 files changed, 211 insertions(+), 22 deletions(-) create mode 100644 airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java create mode 100644 airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DbtTransformationRunner.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DbtTransformationRunner.java index 7abd7bc7b6728..1a42902b86a11 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DbtTransformationRunner.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DbtTransformationRunner.java @@ -107,6 +107,7 @@ public boolean transform(final String jobId, files, "/bin/bash", resourceRequirements, + null, Map.of(JOB_TYPE_KEY, SYNC_JOB, SYNC_STEP_KEY, CUSTOM_STEP), Collections.emptyMap(), Collections.emptyMap(), diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/helper/EntrypointEnvChecker.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/helper/EntrypointEnvChecker.java index a88ae8a62f51c..09a0cd58d0682 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/helper/EntrypointEnvChecker.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/helper/EntrypointEnvChecker.java @@ -45,6 +45,7 @@ public static String getEntrypointEnvVariable(final ProcessFactory processFactor Collections.emptyMap(), "printenv", null, + null, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap()); diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/DefaultNormalizationRunner.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/DefaultNormalizationRunner.java index 8c2813804069a..ce6177f34b34f 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/DefaultNormalizationRunner.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/normalization/DefaultNormalizationRunner.java @@ -134,6 +134,7 @@ private boolean runProcess(final String jobId, false, files, null, resourceRequirements, + null, Map.of(JOB_TYPE_KEY, SYNC_JOB, SYNC_STEP_KEY, NORMALIZE_STEP), Collections.emptyMap(), Collections.emptyMap(), diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/AirbyteIntegrationLauncher.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/AirbyteIntegrationLauncher.java index 6b8c9ac347cd9..17a7853f51f5a 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/AirbyteIntegrationLauncher.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/AirbyteIntegrationLauncher.java @@ -23,6 +23,7 @@ import datadog.trace.api.Trace; import io.airbyte.commons.features.EnvVariableFeatureFlags; import io.airbyte.commons.features.FeatureFlags; +import io.airbyte.config.AllowedHosts; import io.airbyte.config.ResourceRequirements; import io.airbyte.config.WorkerEnvConstants; import io.airbyte.metrics.lib.ApmTraceUtils; @@ -50,12 +51,14 @@ public class AirbyteIntegrationLauncher implements IntegrationLauncher { * At this moment, we put custom connector jobs into an isolated pool. */ private final boolean useIsolatedPool; + private final AllowedHosts allowedHosts; public AirbyteIntegrationLauncher(final String jobId, final int attempt, final String imageName, final ProcessFactory processFactory, final ResourceRequirements resourceRequirement, + final AllowedHosts allowedHosts, final boolean useIsolatedPool, final FeatureFlags featureFlags) { this.jobId = jobId; @@ -63,6 +66,7 @@ public AirbyteIntegrationLauncher(final String jobId, this.imageName = imageName; this.processFactory = processFactory; this.resourceRequirement = resourceRequirement; + this.allowedHosts = allowedHosts; this.featureFlags = featureFlags; this.useIsolatedPool = useIsolatedPool; } @@ -82,6 +86,7 @@ public Process spec(final Path jobRoot) throws WorkerException { Collections.emptyMap(), null, resourceRequirement, + allowedHosts, Map.of(JOB_TYPE_KEY, SPEC_JOB), getWorkerMetadata(), Collections.emptyMap(), @@ -103,6 +108,7 @@ public Process check(final Path jobRoot, final String configFilename, final Stri ImmutableMap.of(configFilename, configContents), null, resourceRequirement, + allowedHosts, Map.of(JOB_TYPE_KEY, CHECK_JOB), getWorkerMetadata(), Collections.emptyMap(), @@ -125,6 +131,7 @@ public Process discover(final Path jobRoot, final String configFilename, final S ImmutableMap.of(configFilename, configContents), null, resourceRequirement, + allowedHosts, Map.of(JOB_TYPE_KEY, DISCOVER_JOB), getWorkerMetadata(), Collections.emptyMap(), @@ -171,6 +178,7 @@ public Process read(final Path jobRoot, files, null, resourceRequirement, + allowedHosts, Map.of(JOB_TYPE_KEY, SYNC_JOB, SYNC_STEP_KEY, READ_STEP), getWorkerMetadata(), Collections.emptyMap(), @@ -201,6 +209,7 @@ public Process write(final Path jobRoot, files, null, resourceRequirement, + allowedHosts, Map.of(JOB_TYPE_KEY, SYNC_JOB, SYNC_STEP_KEY, WRITE_STEP), getWorkerMetadata(), Collections.emptyMap(), diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java index ea4092d87f524..7d11394a875cf 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/DockerProcessFactory.java @@ -12,6 +12,7 @@ import io.airbyte.commons.io.LineGobbler; import io.airbyte.commons.map.MoreMaps; import io.airbyte.commons.resources.MoreResources; +import io.airbyte.config.AllowedHosts; import io.airbyte.config.ResourceRequirements; import io.airbyte.workers.WorkerConfigs; import io.airbyte.workers.WorkerUtils; @@ -91,6 +92,7 @@ public Process create(final String jobType, final Map files, final String entrypoint, final ResourceRequirements resourceRequirements, + final AllowedHosts allowedHosts, final Map labels, final Map jobMetadata, final Map internalToExternalPorts, @@ -120,7 +122,7 @@ public Process create(final String jobType, "--log-driver", "none"); final String containerName = ProcessFactory.createProcessName(imageName, jobType, jobId, attempt, DOCKER_NAME_LEN_LIMIT); - LOGGER.info("Creating docker container = {} with resources {}", containerName, resourceRequirements); + LOGGER.info("Creating docker container = {} with resources {} and allowed hosts {}", containerName, resourceRequirements, allowedHosts); cmd.add("--name"); cmd.add(containerName); cmd.addAll(localDebuggingOptions(containerName)); diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubeProcessFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubeProcessFactory.java index 8643ba99219e3..a8d7cc5e411d3 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubeProcessFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/KubeProcessFactory.java @@ -7,6 +7,7 @@ import com.google.common.annotations.VisibleForTesting; import io.airbyte.commons.lang.Exceptions; import io.airbyte.commons.map.MoreMaps; +import io.airbyte.config.AllowedHosts; import io.airbyte.config.ResourceRequirements; import io.airbyte.workers.WorkerConfigs; import io.airbyte.workers.exception.WorkerException; @@ -85,6 +86,7 @@ public Process create( final Map files, final String entrypoint, final ResourceRequirements resourceRequirements, + final AllowedHosts allowedHosts, final Map customLabels, final Map jobMetadata, final Map internalToExternalPorts, @@ -93,7 +95,8 @@ public Process create( try { // used to differentiate source and destination processes with the same id and attempt final String podName = ProcessFactory.createProcessName(imageName, jobType, jobId, attempt, KUBE_NAME_LEN_LIMIT); - LOGGER.info("Attempting to start pod = {} for {} with resources {}", podName, imageName, resourceRequirements); + LOGGER.info("Attempting to start pod = {} for {} with resources {} and allowed hosts {}", podName, imageName, resourceRequirements, + allowedHosts); final int stdoutLocalPort = KubePortManagerSingleton.getInstance().take(); LOGGER.info("{} stdoutLocalPort = {}", podName, stdoutLocalPort); diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java index e57ebf6fbf28e..c174aa49c7d93 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/process/ProcessFactory.java @@ -4,6 +4,7 @@ package io.airbyte.workers.process; +import io.airbyte.config.AllowedHosts; import io.airbyte.config.ResourceRequirements; import io.airbyte.workers.exception.WorkerException; import java.nio.file.Path; @@ -49,6 +50,7 @@ Process create(String jobType, final Map files, final String entrypoint, final ResourceRequirements resourceRequirements, + final AllowedHosts allowedHosts, final Map labels, final Map jobMetadata, final Map portMapping, diff --git a/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/DefaultNormalizationRunnerTest.java b/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/DefaultNormalizationRunnerTest.java index db3bbc57671e6..7fb14d19948b0 100644 --- a/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/DefaultNormalizationRunnerTest.java +++ b/airbyte-commons-worker/src/test/java/io/airbyte/workers/normalization/DefaultNormalizationRunnerTest.java @@ -91,6 +91,7 @@ void setup() throws IOException, WorkerException { when(processFactory.create(NORMALIZE_STEP, JOB_ID, JOB_ATTEMPT, jobRoot, DockerUtils.getTaggedImageName(NORMALIZATION_IMAGE, NORMALIZATION_TAG), false, false, files, null, workerConfigs.getResourceRequirements(), + null, Map.of(JOB_TYPE_KEY, SYNC_JOB, SYNC_STEP_KEY, NORMALIZE_STEP), Map.of(), Map.of(), diff --git a/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/AirbyteIntegrationLauncherTest.java b/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/AirbyteIntegrationLauncherTest.java index 458885c0d9409..c6ec9ed2f49cd 100644 --- a/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/AirbyteIntegrationLauncherTest.java +++ b/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/AirbyteIntegrationLauncherTest.java @@ -69,7 +69,7 @@ class AirbyteIntegrationLauncherTest { @BeforeEach void setUp() { workerConfigs = new WorkerConfigs(new EnvConfigs()); - launcher = new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, FAKE_IMAGE, processFactory, workerConfigs.getResourceRequirements(), false, + launcher = new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, FAKE_IMAGE, processFactory, workerConfigs.getResourceRequirements(), null, false, featureFlags); } @@ -78,7 +78,7 @@ void spec() throws WorkerException { launcher.spec(JOB_ROOT); Mockito.verify(processFactory).create(SPEC_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, false, Collections.emptyMap(), null, - workerConfigs.getResourceRequirements(), Map.of(JOB_TYPE_KEY, SPEC_JOB), JOB_METADATA, + workerConfigs.getResourceRequirements(), null, Map.of(JOB_TYPE_KEY, SPEC_JOB), JOB_METADATA, Map.of(), "spec"); } @@ -89,6 +89,7 @@ void check() throws WorkerException { Mockito.verify(processFactory).create(CHECK_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, false, CONFIG_FILES, null, workerConfigs.getResourceRequirements(), + null, Map.of(JOB_TYPE_KEY, CHECK_JOB), JOB_METADATA, Map.of(), @@ -102,6 +103,7 @@ void discover() throws WorkerException { Mockito.verify(processFactory).create(DISCOVER_JOB, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, false, CONFIG_FILES, null, workerConfigs.getResourceRequirements(), + null, Map.of(JOB_TYPE_KEY, DISCOVER_JOB), JOB_METADATA, Map.of(), @@ -115,6 +117,7 @@ void read() throws WorkerException { Mockito.verify(processFactory).create(READ_STEP, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, false, CONFIG_CATALOG_STATE_FILES, null, workerConfigs.getResourceRequirements(), + null, Map.of(JOB_TYPE_KEY, SYNC_JOB, SYNC_STEP_KEY, READ_STEP), JOB_METADATA, Map.of(), @@ -131,6 +134,7 @@ void write() throws WorkerException { Mockito.verify(processFactory).create(WRITE_STEP, JOB_ID, JOB_ATTEMPT, JOB_ROOT, FAKE_IMAGE, false, true, CONFIG_CATALOG_FILES, null, workerConfigs.getResourceRequirements(), + null, Map.of(JOB_TYPE_KEY, SYNC_JOB, SYNC_STEP_KEY, WRITE_STEP), JOB_METADATA, Map.of(), diff --git a/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/DockerProcessFactoryTest.java b/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/DockerProcessFactoryTest.java index 215fb0bb20153..a4983c384227b 100644 --- a/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/DockerProcessFactoryTest.java +++ b/airbyte-commons-worker/src/test/java/io/airbyte/workers/process/DockerProcessFactoryTest.java @@ -86,7 +86,7 @@ void testFileWriting() throws IOException, WorkerException { final DockerProcessFactory processFactory = new DockerProcessFactory(new WorkerConfigs(new EnvConfigs()), workspaceRoot, null, null, null); processFactory.create("tester", "job_id", 0, jobRoot, BUSYBOX, false, false, ImmutableMap.of("config.json", "{\"data\": 2}"), "echo hi", - new WorkerConfigs(new EnvConfigs()).getResourceRequirements(), Map.of(), Map.of(), Map.of()); + new WorkerConfigs(new EnvConfigs()).getResourceRequirements(), null, Map.of(), Map.of(), Map.of()); assertEquals( Jsons.jsonNode(ImmutableMap.of("data", 2)), @@ -125,6 +125,7 @@ void testEnvMapSet() throws IOException, WorkerException, InterruptedException { Map.of(), "/bin/sh", workerConfigs.getResourceRequirements(), + null, Map.of(), Map.of(), Map.of(), @@ -158,6 +159,7 @@ private void waitForDockerToInitialize(final ProcessFactory processFactory, fina Map.of(), "/bin/sh", workerConfigs.getResourceRequirements(), + null, Map.of(), Map.of(), Map.of(), diff --git a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/DbConverter.java b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/DbConverter.java index 41f1822bbd457..58f4b32496d24 100644 --- a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/DbConverter.java +++ b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/DbConverter.java @@ -19,6 +19,7 @@ import io.airbyte.config.ActorCatalogFetchEvent; import io.airbyte.config.ActorCatalogWithUpdatedAt; import io.airbyte.config.ActorDefinitionResourceRequirements; +import io.airbyte.config.AllowedHosts; import io.airbyte.config.DestinationConnection; import io.airbyte.config.DestinationOAuthParameter; import io.airbyte.config.FieldSelectionData; @@ -160,7 +161,10 @@ public static StandardSourceDefinition buildStandardSourceDefinition(final Recor : record.get(ACTOR_DEFINITION.RELEASE_DATE).toString()) .withResourceRequirements(record.get(ACTOR_DEFINITION.RESOURCE_REQUIREMENTS) == null ? null - : Jsons.deserialize(record.get(ACTOR_DEFINITION.RESOURCE_REQUIREMENTS).data(), ActorDefinitionResourceRequirements.class)); + : Jsons.deserialize(record.get(ACTOR_DEFINITION.RESOURCE_REQUIREMENTS).data(), ActorDefinitionResourceRequirements.class)) + .withAllowedHosts(record.get(ACTOR_DEFINITION.ALLOWED_HOSTS) == null + ? null + : Jsons.deserialize(record.get(ACTOR_DEFINITION.ALLOWED_HOSTS).data(), AllowedHosts.class)); } public static StandardDestinationDefinition buildStandardDestinationDefinition(final Record record) { @@ -193,7 +197,10 @@ public static StandardDestinationDefinition buildStandardDestinationDefinition(f : null) .withResourceRequirements(record.get(ACTOR_DEFINITION.RESOURCE_REQUIREMENTS) == null ? null - : Jsons.deserialize(record.get(ACTOR_DEFINITION.RESOURCE_REQUIREMENTS).data(), ActorDefinitionResourceRequirements.class)); + : Jsons.deserialize(record.get(ACTOR_DEFINITION.RESOURCE_REQUIREMENTS).data(), ActorDefinitionResourceRequirements.class)) + .withAllowedHosts(record.get(ACTOR_DEFINITION.ALLOWED_HOSTS) == null + ? null + : Jsons.deserialize(record.get(ACTOR_DEFINITION.ALLOWED_HOSTS).data(), AllowedHosts.class)); } public static DestinationOAuthParameter buildDestinationOAuthParameter(final Record record) { diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 0a3e2c9216536..6ea9b0f2be5a0 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -602,6 +602,9 @@ icon: github.svg sourceType: api releaseStage: generally_available + allowedHosts: + hosts: + - api.github.com - name: Gitlab sourceDefinitionId: 5e6175e5-68e1-4c17-bff9-56103bbb0d80 dockerRepository: airbyte/source-gitlab @@ -1343,6 +1346,9 @@ icon: postgresql.svg sourceType: database releaseStage: generally_available + allowedHosts: + hosts: + - "${host}" - name: Postmark App sourceDefinitionId: cde75ca1-1e28-4a0f-85bb-90c546de9f1f dockerRepository: airbyte/source-postmarkapp diff --git a/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/ReplicationJobOrchestrator.java b/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/ReplicationJobOrchestrator.java index 4e2496f3735eb..c73f06f4e0cbf 100644 --- a/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/ReplicationJobOrchestrator.java +++ b/airbyte-container-orchestrator/src/main/java/io/airbyte/container_orchestrator/orchestrator/ReplicationJobOrchestrator.java @@ -123,6 +123,7 @@ public Optional runJob() throws Exception { sourceLauncherConfig.getDockerImage(), processFactory, syncInput.getSourceResourceRequirements(), + sourceLauncherConfig.getAllowedHosts(), useIsolatedPool, featureFlags); @@ -133,6 +134,7 @@ public Optional runJob() throws Exception { destinationLauncherConfig.getDockerImage(), processFactory, syncInput.getDestinationResourceRequirements(), + destinationLauncherConfig.getAllowedHosts(), useIsolatedPool, featureFlags); diff --git a/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/DestinationAcceptanceTest.java b/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/DestinationAcceptanceTest.java index cff00930528af..1fce78c5bd17e 100644 --- a/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/DestinationAcceptanceTest.java +++ b/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/DestinationAcceptanceTest.java @@ -1250,14 +1250,14 @@ protected void assertNamespaceNormalization(final String testCaseId, private ConnectorSpecification runSpec() throws WorkerException { return convertProtocolObject( new DefaultGetSpecWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, false, new EnvVariableFeatureFlags())) + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, null, false, new EnvVariableFeatureFlags())) .run(new JobGetSpecConfig().withDockerImage(getImageName()), jobRoot).getSpec(), ConnectorSpecification.class); } protected StandardCheckConnectionOutput runCheck(final JsonNode config) throws WorkerException { return new DefaultCheckConnectionWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, false, new EnvVariableFeatureFlags()), + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, null, false, new EnvVariableFeatureFlags()), mConnectorConfigUpdater) .run(new StandardCheckConnectionInput().withConnectionConfiguration(config), jobRoot) .getCheckConnection(); @@ -1267,7 +1267,7 @@ protected StandardCheckConnectionOutput.Status runCheckWithCatchedException( final JsonNode config) { try { final StandardCheckConnectionOutput standardCheckConnectionOutput = new DefaultCheckConnectionWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, false, new EnvVariableFeatureFlags()), + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, null, false, new EnvVariableFeatureFlags()), mConnectorConfigUpdater) .run(new StandardCheckConnectionInput().withConnectionConfiguration(config), jobRoot) .getCheckConnection(); @@ -1280,7 +1280,7 @@ protected StandardCheckConnectionOutput.Status runCheckWithCatchedException( protected AirbyteDestination getDestination() { return new DefaultAirbyteDestination( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, false, new EnvVariableFeatureFlags())); + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, null, null, false, new EnvVariableFeatureFlags())); } protected void runSyncAndVerifyStateOutput(final JsonNode config, diff --git a/airbyte-integrations/bases/standard-source-test/src/main/java/io/airbyte/integrations/standardtest/source/AbstractSourceConnectorTest.java b/airbyte-integrations/bases/standard-source-test/src/main/java/io/airbyte/integrations/standardtest/source/AbstractSourceConnectorTest.java index f3d1ae3598bc5..58b3f2b3baf0a 100644 --- a/airbyte-integrations/bases/standard-source-test/src/main/java/io/airbyte/integrations/standardtest/source/AbstractSourceConnectorTest.java +++ b/airbyte-integrations/bases/standard-source-test/src/main/java/io/airbyte/integrations/standardtest/source/AbstractSourceConnectorTest.java @@ -158,7 +158,7 @@ public void tearDownInternal() throws Exception { protected ConnectorSpecification runSpec() throws WorkerException { final io.airbyte.protocol.models.ConnectorSpecification spec = new DefaultGetSpecWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false, + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), null, false, new EnvVariableFeatureFlags())) .run(new JobGetSpecConfig().withDockerImage(getImageName()), jobRoot).getSpec(); return convertProtocolObject(spec, ConnectorSpecification.class); @@ -166,7 +166,7 @@ protected ConnectorSpecification runSpec() throws WorkerException { protected StandardCheckConnectionOutput runCheck() throws Exception { return new DefaultCheckConnectionWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false, + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), null, false, new EnvVariableFeatureFlags()), mConnectorConfigUpdater) .run(new StandardCheckConnectionInput().withConnectionConfiguration(getConfig()), jobRoot).getCheckConnection(); @@ -174,7 +174,7 @@ protected StandardCheckConnectionOutput runCheck() throws Exception { protected String runCheckAndGetStatusAsString(final JsonNode config) throws Exception { return new DefaultCheckConnectionWorker( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false, + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), null, false, new EnvVariableFeatureFlags()), mConnectorConfigUpdater) .run(new StandardCheckConnectionInput().withConnectionConfiguration(config), jobRoot).getCheckConnection().getStatus().toString(); @@ -183,7 +183,7 @@ protected String runCheckAndGetStatusAsString(final JsonNode config) throws Exce protected UUID runDiscover() throws Exception { final UUID toReturn = new DefaultDiscoverCatalogWorker( mConfigRepository, - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false, + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), null, false, new EnvVariableFeatureFlags()), mConnectorConfigUpdater) .run(new StandardDiscoverCatalogInput().withSourceId(SOURCE_ID.toString()).withConnectionConfiguration(getConfig()), jobRoot) @@ -218,7 +218,7 @@ protected List runRead(final ConfiguredAirbyteCatalog catalog, f final var featureFlags = new EnvVariableFeatureFlags(); final AirbyteSource source = new DefaultAirbyteSource( - new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false, + new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), null, false, featureFlags), featureFlags); final List messages = new ArrayList<>(); @@ -271,9 +271,9 @@ private AirbyteSource prepareAirbyteSource(final ResourceRequirements resourceRe final var workerConfigs = new WorkerConfigs(new EnvConfigs()); final var featureFlags = new EnvVariableFeatureFlags(); final var integrationLauncher = resourceRequirements == null - ? new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), false, + ? new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, workerConfigs.getResourceRequirements(), null, false, featureFlags) - : new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, resourceRequirements, false, featureFlags); + : new AirbyteIntegrationLauncher(JOB_ID, JOB_ATTEMPT, getImageName(), processFactory, resourceRequirements, null, false, featureFlags); return new DefaultAirbyteSource(integrationLauncher, featureFlags); } diff --git a/airbyte-worker-models/build.gradle b/airbyte-worker-models/build.gradle index 57796fd0246fb..d6aee586fe390 100644 --- a/airbyte-worker-models/build.gradle +++ b/airbyte-worker-models/build.gradle @@ -5,6 +5,10 @@ plugins { id 'com.github.eirnym.js2p' version '1.0' } +dependencies { + implementation project(path: ':airbyte-config:config-models') +} + jsonSchema2Pojo { sourceType = SourceType.YAMLSCHEMA source = files("${sourceSets.main.output.resourcesDir}/workers_models") diff --git a/airbyte-worker-models/src/main/resources/workers_models/IntegrationLauncherConfig.yaml b/airbyte-worker-models/src/main/resources/workers_models/IntegrationLauncherConfig.yaml index e8035d05b6ab0..59582b993e369 100644 --- a/airbyte-worker-models/src/main/resources/workers_models/IntegrationLauncherConfig.yaml +++ b/airbyte-worker-models/src/main/resources/workers_models/IntegrationLauncherConfig.yaml @@ -28,3 +28,6 @@ properties: existingJavaType: io.airbyte.commons.version.Version isCustomConnector: type: boolean + allowedHosts: + type: object + existingJavaType: io.airbyte.config.AllowedHosts diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/check/connection/CheckConnectionActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/check/connection/CheckConnectionActivityImpl.java index 0d752d189b831..f95af4a371d8a 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/check/connection/CheckConnectionActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/check/connection/CheckConnectionActivityImpl.java @@ -140,6 +140,7 @@ private CheckedSupplier launcherConfig.getDockerImage(), processFactory, workerConfigs.getResourceRequirements(), + launcherConfig.getAllowedHosts(), launcherConfig.getIsCustomConnector(), featureFlags); diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/discover/catalog/DiscoverCatalogActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/discover/catalog/DiscoverCatalogActivityImpl.java index 5d5e5837acff4..d21cc2cfe4fb2 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/discover/catalog/DiscoverCatalogActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/discover/catalog/DiscoverCatalogActivityImpl.java @@ -130,7 +130,8 @@ private CheckedSupplier return () -> { final IntegrationLauncher integrationLauncher = new AirbyteIntegrationLauncher(launcherConfig.getJobId(), launcherConfig.getAttemptId().intValue(), launcherConfig.getDockerImage(), - processFactory, workerConfigs.getResourceRequirements(), launcherConfig.getIsCustomConnector(), featureFlags); + processFactory, workerConfigs.getResourceRequirements(), launcherConfig.getAllowedHosts(), launcherConfig.getIsCustomConnector(), + featureFlags); final AirbyteStreamFactory streamFactory = new VersionedAirbyteStreamFactory<>(serDeProvider, migratorFactory, launcherConfig.getProtocolVersion(), Optional.empty()); final ConnectorConfigUpdater connectorConfigUpdater = diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/GenerateInputActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/GenerateInputActivityImpl.java index 91ad3cd162eb6..80f0c489242a6 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/GenerateInputActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/GenerateInputActivityImpl.java @@ -19,6 +19,7 @@ import io.airbyte.config.JobSyncConfig; import io.airbyte.config.ResetSourceConfiguration; import io.airbyte.config.StandardDestinationDefinition; +import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.StandardSync; import io.airbyte.config.StandardSyncInput; import io.airbyte.config.persistence.ConfigRepository; @@ -28,6 +29,7 @@ import io.airbyte.persistence.job.models.Job; import io.airbyte.persistence.job.models.JobRunConfig; import io.airbyte.workers.WorkerConstants; +import io.airbyte.workers.utils.ConfigReplacer; import io.micronaut.context.annotation.Requires; import jakarta.inject.Singleton; import java.util.List; @@ -50,6 +52,8 @@ public GenerateInputActivityImpl(final JobPersistence jobPersistence, @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) @Override public GeneratedJobInput getSyncWorkflowInput(final SyncInput input) { + final ConfigReplacer configReplacer = new ConfigReplacer(); + try { ApmTraceUtils.addTagsToTrace(Map.of(ATTEMPT_NUMBER_KEY, input.getAttemptId(), JOB_ID_KEY, input.getJobId())); final long jobId = input.getJobId(); @@ -94,6 +98,9 @@ public GeneratedJobInput getSyncWorkflowInput(final SyncInput input) { final UUID connectionId = UUID.fromString(job.getScope()); final StandardSync standardSync = configRepository.getStandardSync(connectionId); + final StandardSourceDefinition sourceDefinition = + configRepository.getSourceDefinitionFromSource(standardSync.getSourceId()); + final StandardDestinationDefinition destinationDefinition = configRepository.getDestinationDefinitionFromDestination(standardSync.getDestinationId()); final String destinationNormalizationDockerImage = destinationDefinition.getNormalizationConfig() != null @@ -109,7 +116,8 @@ public GeneratedJobInput getSyncWorkflowInput(final SyncInput input) { .withAttemptId((long) attempt) .withDockerImage(config.getSourceDockerImage()) .withProtocolVersion(config.getSourceProtocolVersion()) - .withIsCustomConnector(config.getIsSourceCustomConnector()); + .withIsCustomConnector(config.getIsSourceCustomConnector()) + .withAllowedHosts(configReplacer.getAllowedHosts(sourceDefinition.getAllowedHosts(), config.getSourceConfiguration())); final IntegrationLauncherConfig destinationLauncherConfig = new IntegrationLauncherConfig() .withJobId(String.valueOf(jobId)) @@ -119,7 +127,8 @@ public GeneratedJobInput getSyncWorkflowInput(final SyncInput input) { .withIsCustomConnector(config.getIsDestinationCustomConnector()) .withNormalizationDockerImage(destinationNormalizationDockerImage) .withSupportsDbt(destinationDefinition.getSupportsDbt()) - .withNormalizationIntegrationType(normalizationIntegrationType); + .withNormalizationIntegrationType(normalizationIntegrationType) + .withAllowedHosts(configReplacer.getAllowedHosts(destinationDefinition.getAllowedHosts(), config.getDestinationConfiguration())); final StandardSyncInput syncInput = new StandardSyncInput() .withNamespaceDefinition(config.getNamespaceDefinition()) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/spec/SpecActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/spec/SpecActivityImpl.java index a57fa6fa28339..c078e5672ad4a 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/spec/SpecActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/spec/SpecActivityImpl.java @@ -118,6 +118,7 @@ private CheckedSupplier, Exception> launcherConfig.getDockerImage(), processFactory, workerConfigs.getResourceRequirements(), + launcherConfig.getAllowedHosts(), launcherConfig.getIsCustomConnector(), featureFlags); diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/ReplicationActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/ReplicationActivityImpl.java index ffd8c744e7023..e3eeec37dea69 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/ReplicationActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/ReplicationActivityImpl.java @@ -279,6 +279,7 @@ private CheckedSupplier, Exception> sourceLauncherConfig.getDockerImage(), processFactory, syncInput.getSourceResourceRequirements(), + sourceLauncherConfig.getAllowedHosts(), sourceLauncherConfig.getIsCustomConnector(), featureFlags); final IntegrationLauncher destinationLauncher = new AirbyteIntegrationLauncher( @@ -287,6 +288,7 @@ private CheckedSupplier, Exception> destinationLauncherConfig.getDockerImage(), processFactory, syncInput.getDestinationResourceRequirements(), + destinationLauncherConfig.getAllowedHosts(), destinationLauncherConfig.getIsCustomConnector(), featureFlags); diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java b/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java new file mode 100644 index 0000000000000..356ad5fadec8c --- /dev/null +++ b/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.workers.utils; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.JsonNode; +import io.airbyte.config.AllowedHosts; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.commons.text.StringSubstitutor; + +/** + * This class takes values from a connector's configuration and uses it to fill in template-string + * values. It substitutes strings with ${} access, e.g. "The ${animal} jumped over the ${target}" + * with {animal: fox, target: fence} + */ +public class ConfigReplacer { + + /** + * Note: This method does not interact with the secret manager. It is currently expected that all + * replacement values are not secret (e.g. host vs password). This also assumed that the JSON config + * for a connector has a single depth. + */ + public AllowedHosts getAllowedHosts(AllowedHosts allowedHosts, JsonNode config) throws IOException { + if (allowedHosts == null || allowedHosts.getHosts() == null) { + return null; + } + + final List resolvedHosts = new ArrayList<>(); + final Map valuesMap = new HashMap<>(); + final JsonParser jsonParser = config.traverse(); + while (!jsonParser.isClosed()) { + if (jsonParser.nextToken() == JsonToken.FIELD_NAME) { + final String key = jsonParser.getCurrentName(); + if (config.get(key) != null) { + valuesMap.put(key, config.get(key).textValue()); + } + } + } + + final StringSubstitutor sub = new StringSubstitutor(valuesMap); + final List hosts = allowedHosts.getHosts(); + for (String host : hosts) { + final String replacedString = sub.replace(host); + if (replacedString.contains("${")) { + throw new IOException( + "The allowed host value, '" + host + "', is expecting an interpolation value from the connector's configuration, but none is present"); + } + resolvedHosts.add(replacedString); + } + + final AllowedHosts resolvedAllowedHosts = new AllowedHosts(); + resolvedAllowedHosts.setHosts(resolvedHosts); + return resolvedAllowedHosts; + } + +} diff --git a/airbyte-workers/src/test-integration/java/io/airbyte/workers/process/KubePodProcessIntegrationTest.java b/airbyte-workers/src/test-integration/java/io/airbyte/workers/process/KubePodProcessIntegrationTest.java index 582004aef2279..10a9be316f343 100644 --- a/airbyte-workers/src/test-integration/java/io/airbyte/workers/process/KubePodProcessIntegrationTest.java +++ b/airbyte-workers/src/test-integration/java/io/airbyte/workers/process/KubePodProcessIntegrationTest.java @@ -431,7 +431,7 @@ private Process getProcess(final String entrypoint, final Map fi private Process getProcess(final Map customLabels, final String entrypoint, final Map files) throws WorkerException { return processFactory.create("tester", "some-id", 0, Path.of("/tmp/job-root"), "busybox:latest", false, false, files, entrypoint, - DEFAULT_RESOURCE_REQUIREMENTS, customLabels, Collections.emptyMap(), Collections.emptyMap()); + DEFAULT_RESOURCE_REQUIREMENTS, null, customLabels, Collections.emptyMap(), Collections.emptyMap()); } private static Set getOpenPorts(final int count) { diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java new file mode 100644 index 0000000000000..4ef50ebb48a33 --- /dev/null +++ b/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.workers.utils; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.airbyte.config.AllowedHosts; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +class ConfigReplacerTest { + + final ConfigReplacer replacer = new ConfigReplacer(); + final ObjectMapper mapper = new ObjectMapper(); + + @Test + void getAllowedHostsGeneralTest() throws IOException { + final AllowedHosts allowedHosts = new AllowedHosts(); + final List hosts = new ArrayList(); + hosts.add("localhost"); + hosts.add("static-site.com"); + hosts.add("${host}"); + hosts.add("${subdomain}.vendor.com"); + allowedHosts.setHosts(hosts); + + final List expected = new ArrayList<>(); + expected.add("localhost"); + expected.add("static-site.com"); + expected.add("foo.com"); + expected.add("account.vendor.com"); + + final String configJson = "{\"host\": \"foo.com\", \"subdomain\": \"account\", \"password\": \"abc123\"}"; + final JsonNode config = mapper.readValue(configJson, JsonNode.class); + final AllowedHosts response = replacer.getAllowedHosts(allowedHosts, config); + + assertThat(response.getHosts()).isEqualTo(expected); + } + + @Test() + void getAllowedHostsMissingValue() throws IOException { + final AllowedHosts allowedHosts = new AllowedHosts(); + final List hosts = new ArrayList(); + hosts.add("${subdomain}.vendor.com"); + allowedHosts.setHosts(hosts); + + final String configJson = "{\"password\": \"abc123\"}"; + final JsonNode config = mapper.readValue(configJson, JsonNode.class); + + try { + replacer.getAllowedHosts(allowedHosts, config); + throw new RuntimeException("should not get here"); + } catch (Exception e) { + assertThat(e).hasMessage( + "The allowed host value, '${subdomain}.vendor.com', is expecting an interpolation value from the connector's configuration, but none is present"); + } + } + +} From 053ea74b28429702fdfed56e6247922c50b36730 Mon Sep 17 00:00:00 2001 From: Davin Chia Date: Wed, 25 Jan 2023 09:54:36 +0800 Subject: [PATCH 072/195] Use the right label. (#21829) Part of 54c0ef1 switched the job labels from worker-pod to job-pod. This PR also updates the pod-sweeper to use these labels. With the wrong label, the pod sweeper was not sweeping the right pods. --- charts/airbyte-pod-sweeper/templates/configmap.yaml | 5 +++-- kube/resources/pod-sweeper.yaml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/charts/airbyte-pod-sweeper/templates/configmap.yaml b/charts/airbyte-pod-sweeper/templates/configmap.yaml index 627fe89b51977..084c12024ce5d 100644 --- a/charts/airbyte-pod-sweeper/templates/configmap.yaml +++ b/charts/airbyte-pod-sweeper/templates/configmap.yaml @@ -1,4 +1,5 @@ --- + apiVersion: v1 kind: ConfigMap metadata: @@ -10,7 +11,7 @@ data: sweep-pod.sh: | #!/bin/bash get_worker_pods () { - kubectl -n ${KUBE_NAMESPACE} -L airbyte -l airbyte=worker-pod \ + kubectl -n ${KUBE_NAMESPACE} -L airbyte -l airbyte=job-pod \ --field-selector status.phase!=Running get pods \ -o=jsonpath='{range .items[*]} {.metadata.name} {.status.phase} {.status.conditions[0].lastTransitionTime} {.status.startTime}{"\n"}{end}' } @@ -47,4 +48,4 @@ data: done ) sleep 60 - done \ No newline at end of file + done diff --git a/kube/resources/pod-sweeper.yaml b/kube/resources/pod-sweeper.yaml index b2a35b3bc4619..3f20cc23a7a7c 100644 --- a/kube/resources/pod-sweeper.yaml +++ b/kube/resources/pod-sweeper.yaml @@ -7,7 +7,7 @@ data: #!/bin/bash get_worker_pods () { - kubectl -n ${KUBE_NAMESPACE} -L airbyte -l airbyte=worker-pod \ + kubectl -n ${KUBE_NAMESPACE} -L airbyte -l airbyte=job-pod \ --field-selector status.phase!=Running get pods \ -o=jsonpath='{range .items[*]} {.metadata.name} {.status.phase} {.status.conditions[0].lastTransitionTime} {.status.startTime}{"\n"}{end}' } From 6d0177ae9f1bdc97d54ab2e1101da2a98dd56ea5 Mon Sep 17 00:00:00 2001 From: Rodi Reich Zilberman <867491+rodireich@users.noreply.github.com> Date: Tue, 24 Jan 2023 18:01:14 -0800 Subject: [PATCH 073/195] Revert back to erroring out on a null cursor value (#21825) * revert back to erroring out on a null cursor value * Update dockerfiles and release notes * auto-bump connector version Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 16 +- .../source-alloydb-strict-encrypt/Dockerfile | 2 +- .../connectors/source-alloydb/Dockerfile | 2 +- .../source-postgres-strict-encrypt/Dockerfile | 2 +- .../connectors/source-postgres/Dockerfile | 2 +- .../source/postgres/PostgresSourceTest.java | 9 +- .../source/relationaldb/AbstractDbSource.java | 7 +- docs/integrations/sources/alloydb.md | 17 +- docs/integrations/sources/postgres.md | 243 +++++++++--------- 10 files changed, 155 insertions(+), 147 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 6ea9b0f2be5a0..67cb1b65ad8a2 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -41,7 +41,7 @@ - name: AlloyDB for PostgreSQL sourceDefinitionId: 1fa90628-2b9e-11ed-a261-0242ac120002 dockerRepository: airbyte/source-alloydb - dockerImageTag: 1.0.35 + dockerImageTag: 1.0.36 documentationUrl: https://docs.airbyte.com/integrations/sources/alloydb icon: alloydb.svg sourceType: database diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index f5e812e5e4a90..d9ac4a58f00e2 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -280,7 +280,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-alloydb:1.0.35" +- dockerImage: "airbyte/source-alloydb:1.0.36" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/postgres" connectionSpecification: @@ -508,6 +508,7 @@ - "method" - "replication_slot" - "publication" + additionalProperties: true properties: method: type: "string" @@ -552,6 +553,19 @@ order: 5 min: 120 max: 1200 + lsn_commit_behaviour: + type: "string" + title: "LSN commit behaviour" + description: "Determines when Airbtye should flush the LSN of processed\ + \ WAL logs in the source database. `After loading Data in the destination`\ + \ is default. If `While reading Data` is selected, in case of a\ + \ downstream failure (while loading data into the destination),\ + \ next sync would result in a full sync." + enum: + - "While reading Data" + - "After loading Data in the destination" + default: "After loading Data in the destination" + order: 6 tunnel_method: type: "object" title: "SSH Tunnel Method" diff --git a/airbyte-integrations/connectors/source-alloydb-strict-encrypt/Dockerfile b/airbyte-integrations/connectors/source-alloydb-strict-encrypt/Dockerfile index 9e6ce4500d97d..e02b1482975ad 100644 --- a/airbyte-integrations/connectors/source-alloydb-strict-encrypt/Dockerfile +++ b/airbyte-integrations/connectors/source-alloydb-strict-encrypt/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-alloydb-strict-encrypt COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.35 +LABEL io.airbyte.version=1.0.36 LABEL io.airbyte.name=airbyte/source-alloydb-strict-encrypt diff --git a/airbyte-integrations/connectors/source-alloydb/Dockerfile b/airbyte-integrations/connectors/source-alloydb/Dockerfile index 6a1441b16c7f4..c18c20b855713 100644 --- a/airbyte-integrations/connectors/source-alloydb/Dockerfile +++ b/airbyte-integrations/connectors/source-alloydb/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-alloydb COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.35 +LABEL io.airbyte.version=1.0.36 LABEL io.airbyte.name=airbyte/source-alloydb diff --git a/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile b/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile index 75240c9b2918d..54bcea7d1c8ee 100644 --- a/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile +++ b/airbyte-integrations/connectors/source-postgres-strict-encrypt/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-postgres-strict-encrypt COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.39 +LABEL io.airbyte.version=1.0.40 LABEL io.airbyte.name=airbyte/source-postgres-strict-encrypt diff --git a/airbyte-integrations/connectors/source-postgres/Dockerfile b/airbyte-integrations/connectors/source-postgres/Dockerfile index 2d826c4e83760..67e724fe78d13 100644 --- a/airbyte-integrations/connectors/source-postgres/Dockerfile +++ b/airbyte-integrations/connectors/source-postgres/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION source-postgres COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.39 +LABEL io.airbyte.version=1.0.40 LABEL io.airbyte.name=airbyte/source-postgres diff --git a/airbyte-integrations/connectors/source-postgres/src/test/java/io/airbyte/integrations/source/postgres/PostgresSourceTest.java b/airbyte-integrations/connectors/source-postgres/src/test/java/io/airbyte/integrations/source/postgres/PostgresSourceTest.java index 77359c4396fc9..7b8b928347f2d 100644 --- a/airbyte-integrations/connectors/source-postgres/src/test/java/io/airbyte/integrations/source/postgres/PostgresSourceTest.java +++ b/airbyte-integrations/connectors/source-postgres/src/test/java/io/airbyte/integrations/source/postgres/PostgresSourceTest.java @@ -54,7 +54,6 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.utility.MountableFile; @@ -554,7 +553,7 @@ private ConfiguredAirbyteStream createTableWithInvalidCursorType(final Database .withSyncMode(SyncMode.INCREMENTAL) .withStream(CatalogHelpers.createAirbyteStream( "test_table", - "public", + SCHEMA_NAME, Field.of("id", JsonSchemaType.STRING)) .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) .withSourceDefinedPrimaryKey(List.of(List.of("id")))); @@ -579,7 +578,6 @@ private JsonNode buildConfigEscapingNeeded() { } @Test - @Disabled("See https://github.com/airbytehq/airbyte/issues/17150#issuecomment-1342898439, enable once communication is out") public void tableWithNullValueCursorShouldThrowException() throws SQLException { try (final PostgreSQLContainer db = new PostgreSQLContainer<>("postgres:13-alpine")) { db.start(); @@ -613,7 +611,7 @@ private ConfiguredAirbyteStream createTableWithNullValueCursor(final Database da .withSyncMode(SyncMode.INCREMENTAL) .withStream(CatalogHelpers.createAirbyteStream( "test_table_null_cursor", - "12345public", + SCHEMA_NAME, Field.of("id", JsonSchemaType.STRING)) .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) .withSourceDefinedPrimaryKey(List.of(List.of("id")))); @@ -621,7 +619,6 @@ private ConfiguredAirbyteStream createTableWithNullValueCursor(final Database da } @Test - @Disabled("See https://github.com/airbytehq/airbyte/issues/17150#issuecomment-1342898439, enable once communication is out") public void viewWithNullValueCursorShouldThrowException() throws SQLException { try (final PostgreSQLContainer db = new PostgreSQLContainer<>("postgres:13-alpine")) { db.start(); @@ -660,7 +657,7 @@ CREATE VIEW test_view_null_cursor(id) as .withSyncMode(SyncMode.INCREMENTAL) .withStream(CatalogHelpers.createAirbyteStream( "test_view_null_cursor", - "public", + SCHEMA_NAME, Field.of("id", JsonSchemaType.STRING)) .withSupportedSyncModes(Lists.newArrayList(SyncMode.FULL_REFRESH, SyncMode.INCREMENTAL)) .withSourceDefinedPrimaryKey(List.of(List.of("id")))); diff --git a/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/AbstractDbSource.java b/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/AbstractDbSource.java index 8e2fbfa55f251..dd724538d47fc 100644 --- a/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/AbstractDbSource.java +++ b/airbyte-integrations/connectors/source-relational-db/src/main/java/io/airbyte/integrations/source/relationaldb/AbstractDbSource.java @@ -186,7 +186,6 @@ private void validateCursorFieldForIncrementalTables( final Database database) throws SQLException { final List tablesWithInvalidCursor = new ArrayList<>(); - final List tablesWithInvalidCursorToWarnAbout = new ArrayList<>(); for (final ConfiguredAirbyteStream airbyteStream : catalog.getStreams()) { final AirbyteStream stream = airbyteStream.getStream(); final String fullyQualifiedTableName = getFullyQualifiedTableName(stream.getNamespace(), @@ -219,16 +218,12 @@ private void validateCursorFieldForIncrementalTables( } if (!verifyCursorColumnValues(database, stream.getNamespace(), stream.getName(), cursorField.get())) { - tablesWithInvalidCursorToWarnAbout.add( + tablesWithInvalidCursor.add( new InvalidCursorInfo(fullyQualifiedTableName, cursorField.get(), cursorType.toString(), "Cursor column contains NULL value")); } } - if (!tablesWithInvalidCursorToWarnAbout.isEmpty()) { - LOGGER.warn("source-postgres detected null cursor value " + InvalidCursorInfoUtil.getInvalidCursorConfigMessage(tablesWithInvalidCursor)); - } - if (!tablesWithInvalidCursor.isEmpty()) { throw new ConfigErrorException( InvalidCursorInfoUtil.getInvalidCursorConfigMessage(tablesWithInvalidCursor)); diff --git a/docs/integrations/sources/alloydb.md b/docs/integrations/sources/alloydb.md index b9093eaa17406..be51e0187a219 100644 --- a/docs/integrations/sources/alloydb.md +++ b/docs/integrations/sources/alloydb.md @@ -327,11 +327,12 @@ According to Postgres [documentation](https://www.postgresql.org/docs/14/datatyp | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:-------------------------------------------------| -| 1.0.35 | 2022-12-14 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | -| 1.0.34 | 2022-12-13 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | -| 1.0.17 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | -| 1.0.16 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | -| | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | -| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Align with Postgres source v.1.0.15 | -| 1.0.0 | 2022-09-15 | [16776](https://github.com/airbytehq/airbyte/pull/16776) | Align with strict-encrypt version | -| 0.1.0 | 2022-09-05 | [16323](https://github.com/airbytehq/airbyte/pull/16323) | Initial commit. Based on source-postgres v.1.0.7 | +| 1.0.36 | 2023-01-24 | [21825](https://github.com/airbytehq/airbyte/pull/21825) | Put back the original change that will cause an incremental sync to error if table contains a NULL value in cursor column.| +| 1.0.35 | 2022-12-14 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | +| 1.0.34 | 2022-12-13 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | +| 1.0.17 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | +| 1.0.16 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | +| | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | +| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Align with Postgres source v.1.0.15 | +| 1.0.0 | 2022-09-15 | [16776](https://github.com/airbytehq/airbyte/pull/16776) | Align with strict-encrypt version | +| 0.1.0 | 2022-09-05 | [16323](https://github.com/airbytehq/airbyte/pull/16323) | Initial commit. Based on source-postgres v.1.0.7 | diff --git a/docs/integrations/sources/postgres.md b/docs/integrations/sources/postgres.md index af0157806d1ad..40f589c1c0364 100644 --- a/docs/integrations/sources/postgres.md +++ b/docs/integrations/sources/postgres.md @@ -409,124 +409,125 @@ The root causes is that the WALs needed for the incremental sync has been remove ## Changelog -| Version | Date | Pull Request | Subject | -|:--------|:-------------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 1.0.39 | 2022-01-20 | [21683](https://github.com/airbytehq/airbyte/pull/21683) | Speed up esmtimates for trace messages in non-CDC mode. | -| 1.0.38 | 2022-01-17 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | -| 1.0.37 | 2023-01-17 | [20783](https://github.com/airbytehq/airbyte/pull/20783) | Emit estimate trace messages for non-CDC mode. | -| 1.0.36 | 2023-01-11 | [21003](https://github.com/airbytehq/airbyte/pull/21003) | Handle null values for array data types in CDC mode gracefully. | -| 1.0.35 | 2023-01-04 | [20469](https://github.com/airbytehq/airbyte/pull/20469) | Introduce feature to make LSN commit behaviour configurable. | -| 1.0.34 | 2022-12-13 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | -| 1.0.33 | 2022-12-12 | [18959](https://github.com/airbytehq/airbyte/pull/18959) | CDC : Don't timeout if snapshot is not complete. | -| 1.0.32 | 2022-12-12 | [20192](https://github.com/airbytehq/airbyte/pull/20192) | Only throw a warning if cursor column contains null values. | -| 1.0.31 | 2022-12-02 | [19889](https://github.com/airbytehq/airbyte/pull/19889) | Check before each sync and stop if an incremental sync cursor column contains a null value. | -| | 2022-12-02 | [19985](https://github.com/airbytehq/airbyte/pull/19985) | Reenable incorrectly-disabled `wal2json` CDC plugin | -| 1.0.30 | 2022-11-29 | [19024](https://github.com/airbytehq/airbyte/pull/19024) | Skip tables from schema where user do not have Usage permission during discovery. | -| 1.0.29 | 2022-11-29 | [19623](https://github.com/airbytehq/airbyte/pull/19623) | Mark PSQLException related to using replica that is configured as a hot standby server as config error. | -| 1.0.28 | 2022-11-28 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | -| 1.0.27 | 2022-11-28 | [16990](https://github.com/airbytehq/airbyte/pull/16990) | Handle arrays data types | -| 1.0.26 | 2022-11-18 | [19551](https://github.com/airbytehq/airbyte/pull/19551) | Fixes bug with ssl modes | -| 1.0.25 | 2022-11-16 | [19004](https://github.com/airbytehq/airbyte/pull/19004) | Use Debezium heartbeats to improve CDC replication of large databases. | -| 1.0.24 | 2022-11-07 | [19291](https://github.com/airbytehq/airbyte/pull/19291) | Default timeout is reduced from 1 min to 10sec | -| 1.0.23 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | -| 1.0.22 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | -| 1.0.21 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | -| 1.0.20 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | -| 1.0.19 | 2022-10-21 | [18263](https://github.com/airbytehq/airbyte/pull/18263) | Fixes bug introduced in [15833](https://github.com/airbytehq/airbyte/pull/15833) and adds better error messaging for SSH tunnel in Destinations | -| 1.0.18 | 2022-10-19 | [18087](https://github.com/airbytehq/airbyte/pull/18087) | Better error messaging for configuration errors (SSH configs, choosing an invalid cursor) | -| 1.0.17 | 2022-10-17 | [18041](https://github.com/airbytehq/airbyte/pull/18041) | Fixes bug introduced 2022-09-12 with SshTunnel, handles iterator exception properly | -| 1.0.16 | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | -| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Handle 24:00:00 value for Time column | -| 1.0.14 | 2022-10-03 | [17515](https://github.com/airbytehq/airbyte/pull/17515) | Fix an issue preventing connection using client certificate | -| 1.0.13 | 2022-10-01 | [17459](https://github.com/airbytehq/airbyte/pull/17459) | Upgrade debezium version to 1.9.6 from 1.9.2 | -| 1.0.12 | 2022-09-27 | [17299](https://github.com/airbytehq/airbyte/pull/17299) | Improve error handling for strict-encrypt postgres source | -| 1.0.11 | 2022-09-26 | [17131](https://github.com/airbytehq/airbyte/pull/17131) | Allow nullable columns to be used as cursor | -| 1.0.10 | 2022-09-14 | [15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | -| 1.0.9 | 2022-09-13 | [16657](https://github.com/airbytehq/airbyte/pull/16657) | Improve CDC record queueing performance | -| 1.0.8 | 2022-09-08 | [16202](https://github.com/airbytehq/airbyte/pull/16202) | Adds error messaging factory to UI | -| 1.0.7 | 2022-08-30 | [16114](https://github.com/airbytehq/airbyte/pull/16114) | Prevent traffic going on an unsecured channel in strict-encryption version of source postgres | -| 1.0.6 | 2022-08-30 | [16138](https://github.com/airbytehq/airbyte/pull/16138) | Remove unnecessary logging | -| 1.0.5 | 2022-08-25 | [15993](https://github.com/airbytehq/airbyte/pull/15993) | Add support for connection over SSL in CDC mode | -| 1.0.4 | 2022-08-23 | [15877](https://github.com/airbytehq/airbyte/pull/15877) | Fix temporal data type bug which was causing failure in CDC mode | -| 1.0.3 | 2022-08-18 | [14356](https://github.com/airbytehq/airbyte/pull/14356) | DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field | -| 1.0.2 | 2022-08-11 | [15538](https://github.com/airbytehq/airbyte/pull/15538) | Allow additional properties in db stream state | -| 1.0.1 | 2022-08-10 | [15496](https://github.com/airbytehq/airbyte/pull/15496) | Fix state emission in incremental sync | -| | 2022-08-10 | [15481](https://github.com/airbytehq/airbyte/pull/15481) | Fix data handling from WAL logs in CDC mode | -| 1.0.0 | 2022-08-05 | [15380](https://github.com/airbytehq/airbyte/pull/15380) | Change connector label to generally_available (requires [upgrading](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to `v0.40.0-alpha`) | -| 0.4.44 | 2022-08-05 | [15342](https://github.com/airbytehq/airbyte/pull/15342) | Adjust titles and descriptions in spec.json | -| 0.4.43 | 2022-08-03 | [15226](https://github.com/airbytehq/airbyte/pull/15226) | Make connectionTimeoutMs configurable through JDBC url parameters | -| 0.4.42 | 2022-08-03 | [15273](https://github.com/airbytehq/airbyte/pull/15273) | Fix a bug in `0.4.36` and correctly parse the CDC initial record waiting time | -| 0.4.41 | 2022-08-03 | [15077](https://github.com/airbytehq/airbyte/pull/15077) | Sync data from beginning if the LSN is no longer valid in CDC | -| | 2022-08-03 | [14903](https://github.com/airbytehq/airbyte/pull/14903) | Emit state messages more frequently (⛔ this version has a bug; use `1.0.1` instead) | -| 0.4.40 | 2022-08-03 | [15187](https://github.com/airbytehq/airbyte/pull/15187) | Add support for BCE dates/timestamps | -| | 2022-08-03 | [14534](https://github.com/airbytehq/airbyte/pull/14534) | Align regular and CDC integration tests and data mappers | -| 0.4.39 | 2022-08-02 | [14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | -| 0.4.38 | 2022-07-26 | [14362](https://github.com/airbytehq/airbyte/pull/14362) | Integral columns are now discovered as int64 fields. | -| 0.4.37 | 2022-07-22 | [14714](https://github.com/airbytehq/airbyte/pull/14714) | Clarified error message when invalid cursor column selected | -| 0.4.36 | 2022-07-21 | [14451](https://github.com/airbytehq/airbyte/pull/14451) | Make initial CDC waiting time configurable (⛔ this version has a bug and will not work; use `0.4.42` instead) | -| 0.4.35 | 2022-07-14 | [14574](https://github.com/airbytehq/airbyte/pull/14574) | Removed additionalProperties:false from JDBC source connectors | -| 0.4.34 | 2022-07-17 | [13840](https://github.com/airbytehq/airbyte/pull/13840) | Added the ability to connect using different SSL modes and SSL certificates. | -| 0.4.33 | 2022-07-14 | [14586](https://github.com/airbytehq/airbyte/pull/14586) | Validate source JDBC url parameters | -| 0.4.32 | 2022-07-07 | [14694](https://github.com/airbytehq/airbyte/pull/14694) | Force to produce LEGACY state if the use stream capable feature flag is set to false | -| 0.4.31 | 2022-07-07 | [14447](https://github.com/airbytehq/airbyte/pull/14447) | Under CDC mode, retrieve only those tables included in the publications | -| 0.4.30 | 2022-06-30 | [14251](https://github.com/airbytehq/airbyte/pull/14251) | Use more simple and comprehensive query to get selectable tables | -| 0.4.29 | 2022-06-29 | [14265](https://github.com/airbytehq/airbyte/pull/14265) | Upgrade postgresql JDBC version to 42.3.5 | -| 0.4.28 | 2022-06-23 | [14077](https://github.com/airbytehq/airbyte/pull/14077) | Use the new state management | -| 0.4.26 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | -| 0.4.25 | 2022-06-15 | [13823](https://github.com/airbytehq/airbyte/pull/13823) | Publish adaptive postgres source that enforces ssl on cloud + Debezium version upgrade to 1.9.2 from 1.4.2 | -| 0.4.24 | 2022-06-14 | [13549](https://github.com/airbytehq/airbyte/pull/13549) | Fixed truncated precision if the value of microseconds or seconds is 0 | -| 0.4.23 | 2022-06-13 | [13655](https://github.com/airbytehq/airbyte/pull/13745) | Fixed handling datetime cursors when upgrading from older versions of the connector | -| 0.4.22 | 2022-06-09 | [13655](https://github.com/airbytehq/airbyte/pull/13655) | Fixed bug with unsupported date-time datatypes during incremental sync | -| 0.4.21 | 2022-06-06 | [13435](https://github.com/airbytehq/airbyte/pull/13435) | Adjust JDBC fetch size based on max memory and max row size | -| 0.4.20 | 2022-06-02 | [13367](https://github.com/airbytehq/airbyte/pull/13367) | Added convertion hstore to json format | -| 0.4.19 | 2022-05-25 | [13166](https://github.com/airbytehq/airbyte/pull/13166) | Added timezone awareness and handle BC dates | -| 0.4.18 | 2022-05-25 | [13083](https://github.com/airbytehq/airbyte/pull/13083) | Add support for tsquey type | -| 0.4.17 | 2022-05-19 | [13016](https://github.com/airbytehq/airbyte/pull/13016) | CDC modify schema to allow null values | -| 0.4.16 | 2022-05-14 | [12840](https://github.com/airbytehq/airbyte/pull/12840) | Added custom JDBC parameters field | -| 0.4.15 | 2022-05-13 | [12834](https://github.com/airbytehq/airbyte/pull/12834) | Fix the bug that the connector returns empty catalog for Azure Postgres database | -| 0.4.14 | 2022-05-08 | [12689](https://github.com/airbytehq/airbyte/pull/12689) | Add table retrieval according to role-based `SELECT` privilege | -| 0.4.13 | 2022-05-05 | [10230](https://github.com/airbytehq/airbyte/pull/10230) | Explicitly set null value for field in json | -| 0.4.12 | 2022-04-29 | [12480](https://github.com/airbytehq/airbyte/pull/12480) | Query tables with adaptive fetch size to optimize JDBC memory consumption | -| 0.4.11 | 2022-04-11 | [11729](https://github.com/airbytehq/airbyte/pull/11729) | Bump mina-sshd from 2.7.0 to 2.8.0 | -| 0.4.10 | 2022-04-08 | [11798](https://github.com/airbytehq/airbyte/pull/11798) | Fixed roles for fetching materialized view processing | -| 0.4.8 | 2022-02-21 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats | -| 0.4.7 | 2022-02-18 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Updated timestamp transformation with microseconds | -| 0.4.6 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | (unpublished) Add `-XX:+ExitOnOutOfMemoryError` JVM option | -| 0.4.5 | 2022-02-08 | [10173](https://github.com/airbytehq/airbyte/pull/10173) | Improved discovering tables in case if user does not have permissions to any table | -| 0.4.4 | 2022-01-26 | [9807](https://github.com/airbytehq/airbyte/pull/9807) | Update connector fields title/description | -| 0.4.3 | 2022-01-24 | [9554](https://github.com/airbytehq/airbyte/pull/9554) | Allow handling of java sql date in CDC | -| 0.4.2 | 2022-01-13 | [9360](https://github.com/airbytehq/airbyte/pull/9360) | Added schema selection | -| 0.4.1 | 2022-01-05 | [9116](https://github.com/airbytehq/airbyte/pull/9116) | Added materialized views processing | -| 0.4.0 | 2021-12-13 | [8726](https://github.com/airbytehq/airbyte/pull/8726) | Support all Postgres types | -| 0.3.17 | 2021-12-01 | [8371](https://github.com/airbytehq/airbyte/pull/8371) | Fixed incorrect handling "\n" in ssh key | -| 0.3.16 | 2021-11-28 | [7995](https://github.com/airbytehq/airbyte/pull/7995) | Fixed money type with amount > 1000 | -| 0.3.15 | 2021-11-26 | [8066](https://github.com/airbytehq/airbyte/pull/8266) | Fixed the case, when Views are not listed during schema discovery | -| 0.3.14 | 2021-11-17 | [8010](https://github.com/airbytehq/airbyte/pull/8010) | Added checking of privileges before table internal discovery | -| 0.3.13 | 2021-10-26 | [7339](https://github.com/airbytehq/airbyte/pull/7339) | Support or improve support for Interval, Money, Date, various geometric data types, inventory_items, and others | -| 0.3.12 | 2021-09-30 | [6585](https://github.com/airbytehq/airbyte/pull/6585) | Improved SSH Tunnel key generation steps | -| 0.3.11 | 2021-09-02 | [5742](https://github.com/airbytehq/airbyte/pull/5742) | Add SSH Tunnel support | -| 0.3.9 | 2021-08-17 | [5304](https://github.com/airbytehq/airbyte/pull/5304) | Fix CDC OOM issue | -| 0.3.8 | 2021-08-13 | [4699](https://github.com/airbytehq/airbyte/pull/4699) | Added json config validator | -| 0.3.4 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support | -| 0.3.3 | 2021-06-08 | [3960](https://github.com/airbytehq/airbyte/pull/3960) | Add method field in specification parameters | -| 0.3.2 | 2021-05-26 | [3179](https://github.com/airbytehq/airbyte/pull/3179) | Remove `isCDC` logging | -| 0.3.1 | 2021-04-21 | [2878](https://github.com/airbytehq/airbyte/pull/2878) | Set defined cursor for CDC | -| 0.3.0 | 2021-04-21 | [2990](https://github.com/airbytehq/airbyte/pull/2990) | Support namespaces | -| 0.2.7 | 2021-04-16 | [2923](https://github.com/airbytehq/airbyte/pull/2923) | SSL spec as optional | -| 0.2.6 | 2021-04-16 | [2757](https://github.com/airbytehq/airbyte/pull/2757) | Support SSL connection | -| 0.2.5 | 2021-04-12 | [2859](https://github.com/airbytehq/airbyte/pull/2859) | CDC bugfix | -| 0.2.4 | 2021-04-09 | [2548](https://github.com/airbytehq/airbyte/pull/2548) | Support CDC | -| 0.2.3 | 2021-03-28 | [2600](https://github.com/airbytehq/airbyte/pull/2600) | Add NCHAR and NVCHAR support to DB and cursor type casting | -| 0.2.2 | 2021-03-26 | [2460](https://github.com/airbytehq/airbyte/pull/2460) | Destination supports destination sync mode | -| 0.2.1 | 2021-03-18 | [2488](https://github.com/airbytehq/airbyte/pull/2488) | Sources support primary keys | -| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | -| 0.1.13 | 2021-02-02 | [1887](https://github.com/airbytehq/airbyte/pull/1887) | Migrate AbstractJdbcSource to use iterators | -| 0.1.12 | 2021-01-25 | [1746](https://github.com/airbytehq/airbyte/pull/1746) | Fix NPE in State Decorator | -| 0.1.11 | 2021-01-25 | [1765](https://github.com/airbytehq/airbyte/pull/1765) | Add field titles to specification | -| 0.1.10 | 2021-01-19 | [1724](https://github.com/airbytehq/airbyte/pull/1724) | Fix JdbcSource handling of tables with same names in different schemas | -| 0.1.9 | 2021-01-14 | [1655](https://github.com/airbytehq/airbyte/pull/1655) | Fix JdbcSource OOM | -| 0.1.8 | 2021-01-13 | [1588](https://github.com/airbytehq/airbyte/pull/1588) | Handle invalid numeric values in JDBC source | -| 0.1.7 | 2021-01-08 | [1307](https://github.com/airbytehq/airbyte/pull/1307) | Migrate Postgres and MySql to use new JdbcSource | -| 0.1.6 | 2020-12-09 | [1172](https://github.com/airbytehq/airbyte/pull/1172) | Support incremental sync | -| 0.1.5 | 2020-11-30 | [1038](https://github.com/airbytehq/airbyte/pull/1038) | Change JDBC sources to discover more than standard schemas | -| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | +| Version | Date | Pull Request | Subject | +|:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.40 | 2023-01-24 | [21825](https://github.com/airbytehq/airbyte/pull/21825) | Put back the original change that will cause an incremental sync to error if table contains a NULL value in cursor column. | +| 1.0.39 | 2023-01-20 | [21683](https://github.com/airbytehq/airbyte/pull/21683) | Speed up esmtimates for trace messages in non-CDC mode. | +| 1.0.38 | 2023-01-17 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | +| 1.0.37 | 2023-01-17 | [20783](https://github.com/airbytehq/airbyte/pull/20783) | Emit estimate trace messages for non-CDC mode. | +| 1.0.36 | 2023-01-11 | [21003](https://github.com/airbytehq/airbyte/pull/21003) | Handle null values for array data types in CDC mode gracefully. | +| 1.0.35 | 2023-01-04 | [20469](https://github.com/airbytehq/airbyte/pull/20469) | Introduce feature to make LSN commit behaviour configurable. | +| 1.0.34 | 2022-12-13 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | +| 1.0.33 | 2022-12-12 | [18959](https://github.com/airbytehq/airbyte/pull/18959) | CDC : Don't timeout if snapshot is not complete. | +| 1.0.32 | 2022-12-12 | [20192](https://github.com/airbytehq/airbyte/pull/20192) | Only throw a warning if cursor column contains null values. | +| 1.0.31 | 2022-12-02 | [19889](https://github.com/airbytehq/airbyte/pull/19889) | Check before each sync and stop if an incremental sync cursor column contains a null value. | +| | 2022-12-02 | [19985](https://github.com/airbytehq/airbyte/pull/19985) | Reenable incorrectly-disabled `wal2json` CDC plugin | +| 1.0.30 | 2022-11-29 | [19024](https://github.com/airbytehq/airbyte/pull/19024) | Skip tables from schema where user do not have Usage permission during discovery. | +| 1.0.29 | 2022-11-29 | [19623](https://github.com/airbytehq/airbyte/pull/19623) | Mark PSQLException related to using replica that is configured as a hot standby server as config error. | +| 1.0.28 | 2022-11-28 | [19514](https://github.com/airbytehq/airbyte/pull/19514) | Adjust batch selection memory limits databases. | +| 1.0.27 | 2022-11-28 | [16990](https://github.com/airbytehq/airbyte/pull/16990) | Handle arrays data types | +| 1.0.26 | 2022-11-18 | [19551](https://github.com/airbytehq/airbyte/pull/19551) | Fixes bug with ssl modes | +| 1.0.25 | 2022-11-16 | [19004](https://github.com/airbytehq/airbyte/pull/19004) | Use Debezium heartbeats to improve CDC replication of large databases. | +| 1.0.24 | 2022-11-07 | [19291](https://github.com/airbytehq/airbyte/pull/19291) | Default timeout is reduced from 1 min to 10sec | +| 1.0.23 | 2022-11-07 | [19025](https://github.com/airbytehq/airbyte/pull/19025) | Stop enforce SSL if ssl mode is disabled | +| 1.0.22 | 2022-10-31 | [18538](https://github.com/airbytehq/airbyte/pull/18538) | Encode database name | +| 1.0.21 | 2022-10-25 | [18256](https://github.com/airbytehq/airbyte/pull/18256) | Disable allow and prefer ssl modes in CDC mode | +| 1.0.20 | 2022-10-25 | [18383](https://github.com/airbytehq/airbyte/pull/18383) | Better SSH error handling + messages | +| 1.0.19 | 2022-10-21 | [18263](https://github.com/airbytehq/airbyte/pull/18263) | Fixes bug introduced in [15833](https://github.com/airbytehq/airbyte/pull/15833) and adds better error messaging for SSH tunnel in Destinations | +| 1.0.18 | 2022-10-19 | [18087](https://github.com/airbytehq/airbyte/pull/18087) | Better error messaging for configuration errors (SSH configs, choosing an invalid cursor) | +| 1.0.17 | 2022-10-17 | [18041](https://github.com/airbytehq/airbyte/pull/18041) | Fixes bug introduced 2022-09-12 with SshTunnel, handles iterator exception properly | +| 1.0.16 | 2022-10-13 | [15535](https://github.com/airbytehq/airbyte/pull/16238) | Update incremental query to avoid data missing when new data is inserted at the same time as a sync starts under non-CDC incremental mode | +| 1.0.15 | 2022-10-11 | [17782](https://github.com/airbytehq/airbyte/pull/17782) | Handle 24:00:00 value for Time column | +| 1.0.14 | 2022-10-03 | [17515](https://github.com/airbytehq/airbyte/pull/17515) | Fix an issue preventing connection using client certificate | +| 1.0.13 | 2022-10-01 | [17459](https://github.com/airbytehq/airbyte/pull/17459) | Upgrade debezium version to 1.9.6 from 1.9.2 | +| 1.0.12 | 2022-09-27 | [17299](https://github.com/airbytehq/airbyte/pull/17299) | Improve error handling for strict-encrypt postgres source | +| 1.0.11 | 2022-09-26 | [17131](https://github.com/airbytehq/airbyte/pull/17131) | Allow nullable columns to be used as cursor | +| 1.0.10 | 2022-09-14 | [15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | +| 1.0.9 | 2022-09-13 | [16657](https://github.com/airbytehq/airbyte/pull/16657) | Improve CDC record queueing performance | +| 1.0.8 | 2022-09-08 | [16202](https://github.com/airbytehq/airbyte/pull/16202) | Adds error messaging factory to UI | +| 1.0.7 | 2022-08-30 | [16114](https://github.com/airbytehq/airbyte/pull/16114) | Prevent traffic going on an unsecured channel in strict-encryption version of source postgres | +| 1.0.6 | 2022-08-30 | [16138](https://github.com/airbytehq/airbyte/pull/16138) | Remove unnecessary logging | +| 1.0.5 | 2022-08-25 | [15993](https://github.com/airbytehq/airbyte/pull/15993) | Add support for connection over SSL in CDC mode | +| 1.0.4 | 2022-08-23 | [15877](https://github.com/airbytehq/airbyte/pull/15877) | Fix temporal data type bug which was causing failure in CDC mode | +| 1.0.3 | 2022-08-18 | [14356](https://github.com/airbytehq/airbyte/pull/14356) | DB Sources: only show a table can sync incrementally if at least one column can be used as a cursor field | +| 1.0.2 | 2022-08-11 | [15538](https://github.com/airbytehq/airbyte/pull/15538) | Allow additional properties in db stream state | +| 1.0.1 | 2022-08-10 | [15496](https://github.com/airbytehq/airbyte/pull/15496) | Fix state emission in incremental sync | +| | 2022-08-10 | [15481](https://github.com/airbytehq/airbyte/pull/15481) | Fix data handling from WAL logs in CDC mode | +| 1.0.0 | 2022-08-05 | [15380](https://github.com/airbytehq/airbyte/pull/15380) | Change connector label to generally_available (requires [upgrading](https://docs.airbyte.com/operator-guides/upgrading-airbyte/) your Airbyte platform to `v0.40.0-alpha`) | +| 0.4.44 | 2022-08-05 | [15342](https://github.com/airbytehq/airbyte/pull/15342) | Adjust titles and descriptions in spec.json | +| 0.4.43 | 2022-08-03 | [15226](https://github.com/airbytehq/airbyte/pull/15226) | Make connectionTimeoutMs configurable through JDBC url parameters | +| 0.4.42 | 2022-08-03 | [15273](https://github.com/airbytehq/airbyte/pull/15273) | Fix a bug in `0.4.36` and correctly parse the CDC initial record waiting time | +| 0.4.41 | 2022-08-03 | [15077](https://github.com/airbytehq/airbyte/pull/15077) | Sync data from beginning if the LSN is no longer valid in CDC | +| | 2022-08-03 | [14903](https://github.com/airbytehq/airbyte/pull/14903) | Emit state messages more frequently (⛔ this version has a bug; use `1.0.1` instead) | +| 0.4.40 | 2022-08-03 | [15187](https://github.com/airbytehq/airbyte/pull/15187) | Add support for BCE dates/timestamps | +| | 2022-08-03 | [14534](https://github.com/airbytehq/airbyte/pull/14534) | Align regular and CDC integration tests and data mappers | +| 0.4.39 | 2022-08-02 | [14801](https://github.com/airbytehq/airbyte/pull/14801) | Fix multiple log bindings | +| 0.4.38 | 2022-07-26 | [14362](https://github.com/airbytehq/airbyte/pull/14362) | Integral columns are now discovered as int64 fields. | +| 0.4.37 | 2022-07-22 | [14714](https://github.com/airbytehq/airbyte/pull/14714) | Clarified error message when invalid cursor column selected | +| 0.4.36 | 2022-07-21 | [14451](https://github.com/airbytehq/airbyte/pull/14451) | Make initial CDC waiting time configurable (⛔ this version has a bug and will not work; use `0.4.42` instead) | +| 0.4.35 | 2022-07-14 | [14574](https://github.com/airbytehq/airbyte/pull/14574) | Removed additionalProperties:false from JDBC source connectors | +| 0.4.34 | 2022-07-17 | [13840](https://github.com/airbytehq/airbyte/pull/13840) | Added the ability to connect using different SSL modes and SSL certificates. | +| 0.4.33 | 2022-07-14 | [14586](https://github.com/airbytehq/airbyte/pull/14586) | Validate source JDBC url parameters | +| 0.4.32 | 2022-07-07 | [14694](https://github.com/airbytehq/airbyte/pull/14694) | Force to produce LEGACY state if the use stream capable feature flag is set to false | +| 0.4.31 | 2022-07-07 | [14447](https://github.com/airbytehq/airbyte/pull/14447) | Under CDC mode, retrieve only those tables included in the publications | +| 0.4.30 | 2022-06-30 | [14251](https://github.com/airbytehq/airbyte/pull/14251) | Use more simple and comprehensive query to get selectable tables | +| 0.4.29 | 2022-06-29 | [14265](https://github.com/airbytehq/airbyte/pull/14265) | Upgrade postgresql JDBC version to 42.3.5 | +| 0.4.28 | 2022-06-23 | [14077](https://github.com/airbytehq/airbyte/pull/14077) | Use the new state management | +| 0.4.26 | 2022-06-17 | [13864](https://github.com/airbytehq/airbyte/pull/13864) | Updated stacktrace format for any trace message errors | +| 0.4.25 | 2022-06-15 | [13823](https://github.com/airbytehq/airbyte/pull/13823) | Publish adaptive postgres source that enforces ssl on cloud + Debezium version upgrade to 1.9.2 from 1.4.2 | +| 0.4.24 | 2022-06-14 | [13549](https://github.com/airbytehq/airbyte/pull/13549) | Fixed truncated precision if the value of microseconds or seconds is 0 | +| 0.4.23 | 2022-06-13 | [13655](https://github.com/airbytehq/airbyte/pull/13745) | Fixed handling datetime cursors when upgrading from older versions of the connector | +| 0.4.22 | 2022-06-09 | [13655](https://github.com/airbytehq/airbyte/pull/13655) | Fixed bug with unsupported date-time datatypes during incremental sync | +| 0.4.21 | 2022-06-06 | [13435](https://github.com/airbytehq/airbyte/pull/13435) | Adjust JDBC fetch size based on max memory and max row size | +| 0.4.20 | 2022-06-02 | [13367](https://github.com/airbytehq/airbyte/pull/13367) | Added convertion hstore to json format | +| 0.4.19 | 2022-05-25 | [13166](https://github.com/airbytehq/airbyte/pull/13166) | Added timezone awareness and handle BC dates | +| 0.4.18 | 2022-05-25 | [13083](https://github.com/airbytehq/airbyte/pull/13083) | Add support for tsquey type | +| 0.4.17 | 2022-05-19 | [13016](https://github.com/airbytehq/airbyte/pull/13016) | CDC modify schema to allow null values | +| 0.4.16 | 2022-05-14 | [12840](https://github.com/airbytehq/airbyte/pull/12840) | Added custom JDBC parameters field | +| 0.4.15 | 2022-05-13 | [12834](https://github.com/airbytehq/airbyte/pull/12834) | Fix the bug that the connector returns empty catalog for Azure Postgres database | +| 0.4.14 | 2022-05-08 | [12689](https://github.com/airbytehq/airbyte/pull/12689) | Add table retrieval according to role-based `SELECT` privilege | +| 0.4.13 | 2022-05-05 | [10230](https://github.com/airbytehq/airbyte/pull/10230) | Explicitly set null value for field in json | +| 0.4.12 | 2022-04-29 | [12480](https://github.com/airbytehq/airbyte/pull/12480) | Query tables with adaptive fetch size to optimize JDBC memory consumption | +| 0.4.11 | 2022-04-11 | [11729](https://github.com/airbytehq/airbyte/pull/11729) | Bump mina-sshd from 2.7.0 to 2.8.0 | +| 0.4.10 | 2022-04-08 | [11798](https://github.com/airbytehq/airbyte/pull/11798) | Fixed roles for fetching materialized view processing | +| 0.4.8 | 2022-02-21 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Fixed cursor for old connectors that use non-microsecond format. Now connectors work with both formats | +| 0.4.7 | 2022-02-18 | [10242](https://github.com/airbytehq/airbyte/pull/10242) | Updated timestamp transformation with microseconds | +| 0.4.6 | 2022-02-14 | [10256](https://github.com/airbytehq/airbyte/pull/10256) | (unpublished) Add `-XX:+ExitOnOutOfMemoryError` JVM option | +| 0.4.5 | 2022-02-08 | [10173](https://github.com/airbytehq/airbyte/pull/10173) | Improved discovering tables in case if user does not have permissions to any table | +| 0.4.4 | 2022-01-26 | [9807](https://github.com/airbytehq/airbyte/pull/9807) | Update connector fields title/description | +| 0.4.3 | 2022-01-24 | [9554](https://github.com/airbytehq/airbyte/pull/9554) | Allow handling of java sql date in CDC | +| 0.4.2 | 2022-01-13 | [9360](https://github.com/airbytehq/airbyte/pull/9360) | Added schema selection | +| 0.4.1 | 2022-01-05 | [9116](https://github.com/airbytehq/airbyte/pull/9116) | Added materialized views processing | +| 0.4.0 | 2021-12-13 | [8726](https://github.com/airbytehq/airbyte/pull/8726) | Support all Postgres types | +| 0.3.17 | 2021-12-01 | [8371](https://github.com/airbytehq/airbyte/pull/8371) | Fixed incorrect handling "\n" in ssh key | +| 0.3.16 | 2021-11-28 | [7995](https://github.com/airbytehq/airbyte/pull/7995) | Fixed money type with amount > 1000 | +| 0.3.15 | 2021-11-26 | [8066](https://github.com/airbytehq/airbyte/pull/8266) | Fixed the case, when Views are not listed during schema discovery | +| 0.3.14 | 2021-11-17 | [8010](https://github.com/airbytehq/airbyte/pull/8010) | Added checking of privileges before table internal discovery | +| 0.3.13 | 2021-10-26 | [7339](https://github.com/airbytehq/airbyte/pull/7339) | Support or improve support for Interval, Money, Date, various geometric data types, inventory_items, and others | +| 0.3.12 | 2021-09-30 | [6585](https://github.com/airbytehq/airbyte/pull/6585) | Improved SSH Tunnel key generation steps | +| 0.3.11 | 2021-09-02 | [5742](https://github.com/airbytehq/airbyte/pull/5742) | Add SSH Tunnel support | +| 0.3.9 | 2021-08-17 | [5304](https://github.com/airbytehq/airbyte/pull/5304) | Fix CDC OOM issue | +| 0.3.8 | 2021-08-13 | [4699](https://github.com/airbytehq/airbyte/pull/4699) | Added json config validator | +| 0.3.4 | 2021-06-09 | [3973](https://github.com/airbytehq/airbyte/pull/3973) | Add `AIRBYTE_ENTRYPOINT` for Kubernetes support | +| 0.3.3 | 2021-06-08 | [3960](https://github.com/airbytehq/airbyte/pull/3960) | Add method field in specification parameters | +| 0.3.2 | 2021-05-26 | [3179](https://github.com/airbytehq/airbyte/pull/3179) | Remove `isCDC` logging | +| 0.3.1 | 2021-04-21 | [2878](https://github.com/airbytehq/airbyte/pull/2878) | Set defined cursor for CDC | +| 0.3.0 | 2021-04-21 | [2990](https://github.com/airbytehq/airbyte/pull/2990) | Support namespaces | +| 0.2.7 | 2021-04-16 | [2923](https://github.com/airbytehq/airbyte/pull/2923) | SSL spec as optional | +| 0.2.6 | 2021-04-16 | [2757](https://github.com/airbytehq/airbyte/pull/2757) | Support SSL connection | +| 0.2.5 | 2021-04-12 | [2859](https://github.com/airbytehq/airbyte/pull/2859) | CDC bugfix | +| 0.2.4 | 2021-04-09 | [2548](https://github.com/airbytehq/airbyte/pull/2548) | Support CDC | +| 0.2.3 | 2021-03-28 | [2600](https://github.com/airbytehq/airbyte/pull/2600) | Add NCHAR and NVCHAR support to DB and cursor type casting | +| 0.2.2 | 2021-03-26 | [2460](https://github.com/airbytehq/airbyte/pull/2460) | Destination supports destination sync mode | +| 0.2.1 | 2021-03-18 | [2488](https://github.com/airbytehq/airbyte/pull/2488) | Sources support primary keys | +| 0.2.0 | 2021-03-09 | [2238](https://github.com/airbytehq/airbyte/pull/2238) | Protocol allows future/unknown properties | +| 0.1.13 | 2021-02-02 | [1887](https://github.com/airbytehq/airbyte/pull/1887) | Migrate AbstractJdbcSource to use iterators | +| 0.1.12 | 2021-01-25 | [1746](https://github.com/airbytehq/airbyte/pull/1746) | Fix NPE in State Decorator | +| 0.1.11 | 2021-01-25 | [1765](https://github.com/airbytehq/airbyte/pull/1765) | Add field titles to specification | +| 0.1.10 | 2021-01-19 | [1724](https://github.com/airbytehq/airbyte/pull/1724) | Fix JdbcSource handling of tables with same names in different schemas | +| 0.1.9 | 2021-01-14 | [1655](https://github.com/airbytehq/airbyte/pull/1655) | Fix JdbcSource OOM | +| 0.1.8 | 2021-01-13 | [1588](https://github.com/airbytehq/airbyte/pull/1588) | Handle invalid numeric values in JDBC source | +| 0.1.7 | 2021-01-08 | [1307](https://github.com/airbytehq/airbyte/pull/1307) | Migrate Postgres and MySql to use new JdbcSource | +| 0.1.6 | 2020-12-09 | [1172](https://github.com/airbytehq/airbyte/pull/1172) | Support incremental sync | +| 0.1.5 | 2020-11-30 | [1038](https://github.com/airbytehq/airbyte/pull/1038) | Change JDBC sources to discover more than standard schemas | +| 0.1.4 | 2020-11-30 | [1046](https://github.com/airbytehq/airbyte/pull/1046) | Add connectors using an index YAML file | From 502e1b938b2e07fef36887bc0d25bf12d9f74921 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Jan 2023 11:32:08 +0200 Subject: [PATCH 074/195] Bump helm chart version reference to 0.43.22 (#21833) Co-authored-by: davinchia --- charts/airbyte-bootloader/Chart.yaml | 2 +- .../Chart.yaml | 2 +- charts/airbyte-metrics/Chart.yaml | 2 +- charts/airbyte-pod-sweeper/Chart.yaml | 2 +- charts/airbyte-server/Chart.yaml | 2 +- charts/airbyte-temporal/Chart.yaml | 2 +- charts/airbyte-webapp/Chart.yaml | 2 +- charts/airbyte-worker/Chart.yaml | 2 +- charts/airbyte/Chart.lock | 22 +++++++++---------- charts/airbyte/Chart.yaml | 20 ++++++++--------- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/charts/airbyte-bootloader/Chart.yaml b/charts/airbyte-bootloader/Chart.yaml index f98430992f741..67e61b2c97f14 100644 --- a/charts/airbyte-bootloader/Chart.yaml +++ b/charts/airbyte-bootloader/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.43.13" +version: "0.43.22" # This is the version number of the application being deployed. This version number should be diff --git a/charts/airbyte-connector-builder-server/Chart.yaml b/charts/airbyte-connector-builder-server/Chart.yaml index 3c833b660a13d..19a92c39c15dd 100644 --- a/charts/airbyte-connector-builder-server/Chart.yaml +++ b/charts/airbyte-connector-builder-server/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.43.13" +version: "0.43.22" # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/charts/airbyte-metrics/Chart.yaml b/charts/airbyte-metrics/Chart.yaml index cca429adc397f..166f115af9a01 100644 --- a/charts/airbyte-metrics/Chart.yaml +++ b/charts/airbyte-metrics/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.43.13" +version: "0.43.22" # This is the version number of the application being deployed. This version number should be diff --git a/charts/airbyte-pod-sweeper/Chart.yaml b/charts/airbyte-pod-sweeper/Chart.yaml index c892d27e47997..723b0d978d8dc 100644 --- a/charts/airbyte-pod-sweeper/Chart.yaml +++ b/charts/airbyte-pod-sweeper/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.43.13" +version: "0.43.22" # This is the version number of the application being deployed. This version number should be diff --git a/charts/airbyte-server/Chart.yaml b/charts/airbyte-server/Chart.yaml index ec23d0ea5fa75..cbdb3d02757cf 100644 --- a/charts/airbyte-server/Chart.yaml +++ b/charts/airbyte-server/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.43.13" +version: "0.43.22" # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/charts/airbyte-temporal/Chart.yaml b/charts/airbyte-temporal/Chart.yaml index ceb61b02e66af..867970f84cc55 100644 --- a/charts/airbyte-temporal/Chart.yaml +++ b/charts/airbyte-temporal/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.43.13" +version: "0.43.22" # This is the version number of the application being deployed. This version number should be diff --git a/charts/airbyte-webapp/Chart.yaml b/charts/airbyte-webapp/Chart.yaml index 2cfae3fa259af..89a11c3e6ce49 100644 --- a/charts/airbyte-webapp/Chart.yaml +++ b/charts/airbyte-webapp/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.43.13" +version: "0.43.22" # This is the version number of the application being deployed. This version number should be diff --git a/charts/airbyte-worker/Chart.yaml b/charts/airbyte-worker/Chart.yaml index 5d74b74e0bb57..11788d5eea793 100644 --- a/charts/airbyte-worker/Chart.yaml +++ b/charts/airbyte-worker/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.43.13" +version: "0.43.22" # This is the version number of the application being deployed. This version number should be diff --git a/charts/airbyte/Chart.lock b/charts/airbyte/Chart.lock index 8aadf2a4dd31c..1503266b2ff67 100644 --- a/charts/airbyte/Chart.lock +++ b/charts/airbyte/Chart.lock @@ -4,30 +4,30 @@ dependencies: version: 1.17.1 - name: airbyte-bootloader repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 + version: 0.43.22 - name: temporal repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 + version: 0.43.22 - name: webapp repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 + version: 0.43.22 - name: server repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 + version: 0.43.22 - name: worker repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 + version: 0.43.22 - name: pod-sweeper repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 + version: 0.43.22 - name: metrics repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 + version: 0.43.22 - name: cron repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 + version: 0.43.22 - name: connector-builder-server repository: https://airbytehq.github.io/helm-charts/ - version: 0.43.13 -digest: sha256:3cf7a11261e215744444f4063f4c82d81e88280d09f96010d1f31d47b67ed275 -generated: "2022-12-29T15:50:19.814114279Z" + version: 0.43.22 +digest: sha256:3f86ccd42c1eb353dd2d45237b21706c6d8a1d564dc8babb26c0fd961c56ed9d +generated: "2023-01-25T02:03:57.511452543Z" diff --git a/charts/airbyte/Chart.yaml b/charts/airbyte/Chart.yaml index 15f97925abe8f..0e0cab4ce4905 100644 --- a/charts/airbyte/Chart.yaml +++ b/charts/airbyte/Chart.yaml @@ -15,7 +15,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.43.13 +version: 0.43.22 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to @@ -32,36 +32,36 @@ dependencies: - condition: airbyte-bootloader.enabled name: airbyte-bootloader repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 - condition: temporal.enabled name: temporal repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 - condition: webapp.enabled name: webapp repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 - condition: server.enabled name: server repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 - condition: worker.enabled name: worker repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 - condition: pod-sweeper.enabled name: pod-sweeper repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 - condition: metrics.enabled name: metrics repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 - condition: cron.enabled name: cron repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 - condition: connector-builder-server.enabled name: connector-builder-server repository: "https://airbytehq.github.io/helm-charts/" - version: 0.43.13 + version: 0.43.22 From 8956c2cb626365425d557910cc14a28e84674912 Mon Sep 17 00:00:00 2001 From: darynaishchenko <80129833+darynaishchenko@users.noreply.github.com> Date: Wed, 25 Jan 2023 11:59:59 +0200 Subject: [PATCH 075/195] fixed expected records for stream charges (#21728) --- .../integration_tests/expected_records.jsonl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/airbyte-integrations/connectors/source-recharge/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-recharge/integration_tests/expected_records.jsonl index 2397d6abaa40f..9af49757a3b77 100644 --- a/airbyte-integrations/connectors/source-recharge/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-recharge/integration_tests/expected_records.jsonl @@ -1,12 +1,12 @@ {"stream": "addresses", "data": {"address1": "6 Liberty Square", "address2": "12", "cart_attributes": null, "cart_note": null, "city": "Boston", "company": null, "country": "United States", "created_at": "2021-05-13T07:32:59", "customer_id": 64965464, "discount_id": null, "first_name": "Kevin", "id": 69286278, "last_name": "Bacon", "note_attributes": null, "original_shipping_lines": null, "phone": "+16175550124", "presentment_currency": "USD", "province": "Massachusetts", "shipping_lines_override": null, "updated_at": "2022-02-23T12:56:33", "zip": "02109"}, "emitted_at": 1673893320161} {"stream": "addresses", "data": {"address1": "1921 W Wilson St", "address2": "", "cart_attributes": null, "cart_note": null, "city": "Batavia", "company": null, "country": "United States", "created_at": "2021-05-13T05:46:46", "customer_id": 64962974, "discount_id": null, "first_name": "Kelly", "id": 69282975, "last_name": "Kozakevich", "note_attributes": null, "original_shipping_lines": null, "phone": "+16145550188", "presentment_currency": "USD", "province": "Illinois", "shipping_lines_override": null, "updated_at": "2022-05-13T00:07:39", "zip": "60510"}, "emitted_at": 1673893320163} {"stream": "addresses", "data": {"address1": "1 9th Ave", "address2": "1", "cart_attributes": null, "cart_note": null, "city": "San Francisco", "company": null, "country": "United States", "created_at": "2021-05-12T08:04:06", "customer_id": 64817252, "discount_id": null, "first_name": "Jane", "id": 69105381, "last_name": "Doe", "note_attributes": null, "original_shipping_lines": null, "phone": "1234567890", "presentment_currency": "USD", "province": "California", "shipping_lines_override": null, "updated_at": "2023-01-16T04:59:09", "zip": "94118"}, "emitted_at": 1673893320163} -{"stream": "charges", "data": {"address_id": 69105381, "billing_address": {"address1": "1 9th Ave", "address2": "1", "city": "San Francisco", "company": "", "country": "United States", "first_name": "Karina", "last_name": "Kuznetsova", "phone": null, "province": "California", "zip": "94118"}, "client_details": {"browser_ip": "188.163.104.29", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}, "created_at": "2021-05-12T08:04:10", "currency": "USD", "customer_hash": "23dee52d73734a81", "customer_id": 64817252, "discount_codes": null, "email": "nikolaevaka@yahoo.com", "first_name": "Karina", "has_uncommited_changes": false, "id": 386976096, "last_name": "Kuznetsova", "line_items": [{"images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.3", "properties": [], "quantity": 1, "shopify_product_id": 6642695864491, "shopify_variant_id": 39684722131115, "sku": null, "subscription_id": 153224593, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "S / Black"}], "note": null, "note_attributes": null, "processed_at": "2021-05-12T12:03:59", "processor_name": "shopify_payments", "scheduled_at": "2021-05-12T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1 9th Ave", "address2": "1", "city": "San Francisco", "company": "", "country": "United States", "first_name": "Karina", "last_name": "Kuznetsova", "phone": null, "province": "California", "zip": "94118"}, "shipping_lines": [{"code": "Economy", "description": "", "price": 4.9, "source": "", "tax_lines": [], "title": "Economy"}], "shopify_order_id": "3785952133291", "status": "SUCCESS", "sub_total": null, "subtotal_price": "24.3", "tags": null, "tax_lines": "0", "total_discounts": "0", "total_duties": null, "total_line_items_price": "24.3", "total_price": "29.20", "total_refunds": null, "total_tax": "0", "total_weight": 0, "transaction_id": "Shopify Checkout", "type": "CHECKOUT", "updated_at": "2022-03-18T19:55:18"}, "emitted_at": 1673893320501} -{"stream": "charges", "data": {"address_id": 69286278, "billing_address": {"address1": "6 Liberty Square", "address2": "12", "city": "Boston", "company": "", "country": "United States", "first_name": "Kevin", "last_name": "Bacon", "phone": "+16175550124", "province": "Massachusetts", "zip": "02109"}, "client_details": {"browser_ip": "188.163.104.29", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}, "created_at": "2021-05-13T07:33:04", "currency": "USD", "customer_hash": "bdfac1e99b8dc2b0", "customer_id": 64965464, "discount_codes": null, "email": "bacon_kev@example.com", "first_name": "Kevin", "has_uncommited_changes": false, "id": 387414101, "last_name": "Bacon", "line_items": [{"images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/c_black1_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/c_black1_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/c_black1.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/c_black1_small.jpg"}, "price": "28.5", "properties": [], "quantity": 1, "shopify_product_id": 6644278001835, "shopify_variant_id": 39696660332715, "sku": null, "subscription_id": 153612006, "tax_lines": [], "title": "I Make Beats Wool Blend Snapback", "type": "SUBSCRIPTION", "variant_title": "One Size / Black"}], "note": null, "note_attributes": null, "processed_at": "2021-05-13T11:32:53", "processor_name": "shopify_payments", "scheduled_at": "2021-05-13T00:00:00", "shipments_count": null, "shipping_address": {"address1": "6 Liberty Square", "address2": "12", "city": "Boston", "company": "", "country": "United States", "first_name": "Kevin", "last_name": "Bacon", "phone": "+16175550124", "province": "Massachusetts", "zip": "02109"}, "shipping_lines": [{"code": "Economy", "description": "", "price": 4.9, "source": "", "tax_lines": [], "title": "Economy"}], "shopify_order_id": "3787421647019", "status": "SUCCESS", "sub_total": null, "subtotal_price": "28.5", "tags": null, "tax_lines": "0", "total_discounts": "0", "total_duties": null, "total_line_items_price": "28.5", "total_price": "33.40", "total_refunds": null, "total_tax": "0", "total_weight": 0, "transaction_id": "Shopify Checkout", "type": "CHECKOUT", "updated_at": "2022-03-18T19:54:35"}, "emitted_at": 1673893320504} -{"stream": "charges", "data": {"address_id": 69282975, "billing_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": "", "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "client_details": {"browser_ip": "188.163.104.29", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}, "created_at": "2021-05-13T05:46:49", "currency": "USD", "customer_hash": "f99bd4a6877257af", "customer_id": 64962974, "discount_codes": null, "email": "kozakevich_k@example.com", "first_name": "Kelly", "has_uncommited_changes": false, "id": 387392771, "last_name": "Kozakevich", "line_items": [{"images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.3", "properties": [], "quantity": 1, "shopify_product_id": 6642695864491, "shopify_variant_id": 39684723835051, "sku": null, "subscription_id": 153601366, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "L / City Green"}], "note": null, "note_attributes": null, "processed_at": "2021-05-13T09:46:39", "processor_name": "shopify_payments", "scheduled_at": "2021-05-13T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": "", "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "shipping_lines": [{"code": "Economy", "description": "", "price": 4.9, "source": "", "tax_lines": [], "title": "Economy"}], "shopify_order_id": "3787335991467", "status": "SUCCESS", "sub_total": null, "subtotal_price": "24.3", "tags": null, "tax_lines": "0", "total_discounts": "0", "total_duties": null, "total_line_items_price": "24.3", "total_price": "29.20", "total_refunds": null, "total_tax": "0", "total_weight": 0, "transaction_id": "Shopify Checkout", "type": "CHECKOUT", "updated_at": "2022-03-18T19:54:36"}, "emitted_at": 1673893320506} -{"stream": "charges", "data": {"address_id": 69105381, "analytics_data": {"utm_params": []}, "billing_address": {"address1": "1 9th Ave", "address2": "1", "city": "San Francisco", "company": null, "country": "United States", "first_name": "Karina", "last_name": "Kuznetsova", "phone": null, "province": "California", "zip": "94118"}, "client_details": {"browser_ip": null, "user_agent": null}, "created_at": "2021-05-12T08:04:07", "currency": "USD", "customer_hash": "23dee52d73734a81", "customer_id": 64817252, "discount_codes": [], "email": "nikolaevaka@yahoo.com", "error": "None\r\n [May 12, 12:06AM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [May 13, 4:10PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [May 19, 4:10PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [May 25, 4:10PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [May 31, 4:09PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [Jun 06, 4:10PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']", "error_type": "CLOSED_MAX_RETRIES_REACHED", "first_name": "Karina", "has_uncommited_changes": false, "id": 386976088, "last_charge_attempt_date": "2022-06-06T16:10:19", "last_name": "Kuznetsova", "line_items": [{"grams": 0, "images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.30", "properties": [], "quantity": 1, "shopify_product_id": "6642695864491", "shopify_variant_id": "39684722131115", "sku": "T1", "subscription_id": 153224593, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "S / Black", "vendor": "Airbyte"}], "note": "", "note_attributes": null, "number_times_tried": 6, "processor_name": "shopify_payments", "retry_date": "2022-06-12T00:00:00", "scheduled_at": "2022-05-12T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1 9th Ave", "address2": "1", "city": "San Francisco", "company": null, "country": "United States", "first_name": "Jane", "last_name": "Doe", "phone": "1234567890", "province": "California", "zip": "94118"}, "shipping_lines": [{"code": "Economy", "description": "", "price": 4.9, "source": "shopify", "tax_lines": [], "title": "Economy"}], "shopify_order_id": null, "shopify_variant_id_not_found": null, "status": "ERROR", "sub_total": null, "subtotal_price": "24.3", "tags": "Subscription, Subscription Recurring Order", "tax_lines": "0.0", "total_discounts": "0.00", "total_duties": 0.0, "total_line_items_price": "24.30", "total_price": "29.20", "total_refunds": null, "total_tax": "0.0", "total_weight": 0, "transaction_id": null, "type": "RECURRING", "updated_at": "2023-01-16T13:08:54"}, "emitted_at": 1673893320507} -{"stream": "charges", "data": {"address_id": 69282975, "analytics_data": {"utm_params": []}, "billing_address": {"address1": "1921 W Wilson St", "address2": null, "city": "Batavia", "company": null, "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "client_details": {"browser_ip": null, "user_agent": null}, "created_at": "2021-05-13T05:46:47", "currency": "USD", "customer_hash": "f99bd4a6877257af", "customer_id": 64962974, "discount_codes": null, "email": "kozakevich_k@example.com", "first_name": "Kelly", "has_uncommited_changes": false, "id": 387392762, "last_name": "Kozakevich", "line_items": [{"images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.3", "properties": [], "quantity": 1, "shopify_product_id": 6642695864491, "shopify_variant_id": 39684723835051, "sku": "T3", "subscription_id": 153601366, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "L / City Green"}], "note": null, "note_attributes": [], "processed_at": "2022-05-13T00:07:39", "processor_name": "shopify_payments", "scheduled_at": "2022-05-13T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": null, "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "shipping_lines": [{"code": "Economy", "description": "", "price": "4.90", "source": "Subscription", "tax_lines": [], "title": "Economy"}], "shopify_order_id": "4387657613483", "status": "SUCCESS", "sub_total": null, "subtotal_price": "24.3", "tags": "", "tax_lines": "0", "total_discounts": "0.0", "total_duties": null, "total_line_items_price": "24.3", "total_price": "29.20", "total_refunds": null, "total_tax": "0", "total_weight": 0, "transaction_id": "4857856171", "type": "RECURRING", "updated_at": "2022-05-13T00:07:39"}, "emitted_at": 1673893320509} -{"stream": "charges", "data": {"address_id": 69282975, "analytics_data": {"utm_params": []}, "billing_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": null, "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "client_details": {"browser_ip": null, "user_agent": null}, "created_at": "2022-05-13T00:07:39", "currency": "USD", "customer_hash": "f99bd4a6877257af", "customer_id": 64962974, "discount_codes": [], "email": "kozakevich_k@example.com", "first_name": "Kelly", "has_uncommited_changes": false, "id": 580825303, "last_name": "Kozakevich", "line_items": [{"grams": 0, "images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.30", "properties": [], "quantity": 1, "shopify_product_id": "6642695864491", "shopify_variant_id": "39684723835051", "sku": "T3", "subscription_id": 153601366, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "L / City Green", "vendor": "Airbyte"}], "note": "", "note_attributes": null, "processor_name": "shopify_payments", "scheduled_at": "2023-05-13T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": null, "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "shipping_lines": [{"code": "Economy", "description": null, "price": "4.90", "source": "shopify", "tax_lines": [], "title": "Economy"}], "shopify_order_id": null, "status": "QUEUED", "sub_total": null, "subtotal_price": "24.3", "tags": "Subscription, Subscription Recurring Order", "tax_lines": "0.0", "total_discounts": "0.00", "total_duties": null, "total_line_items_price": "24.30", "total_price": "29.20", "total_refunds": null, "total_tax": "0.0", "total_weight": 0, "transaction_id": null, "type": "RECURRING", "updated_at": "2022-06-22T09:57:36"}, "emitted_at": 1673893320511} +{"stream": "charges", "data": {"address_id": 69105381, "billing_address": {"address1": "1 9th Ave", "address2": "1", "city": "San Francisco", "company": "", "country": "United States", "first_name": "Karina", "last_name": "Kuznetsova", "phone": null, "province": "California", "zip": "94118"}, "client_details": {"browser_ip": "188.163.104.29", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}, "created_at": "2021-05-12T08:04:10", "currency": "USD", "customer_hash": "23dee52d73734a81", "customer_id": 64817252, "discount_codes": null, "email": "nikolaevaka@yahoo.com", "first_name": "Karina", "has_uncommited_changes": false, "id": 386976096, "last_name": "Kuznetsova", "line_items": [{"images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.3", "properties": [], "quantity": 1, "shopify_product_id": 6642695864491, "shopify_variant_id": 39684722131115, "sku": null, "subscription_id": 153224593, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "S / Black"}], "note": null, "note_attributes": null, "processed_at": "2021-05-12T12:03:59", "processor_name": "shopify_payments", "requires_shipping": true, "scheduled_at": "2021-05-12T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1 9th Ave", "address2": "1", "city": "San Francisco", "company": "", "country": "United States", "first_name": "Karina", "last_name": "Kuznetsova", "phone": null, "province": "California", "zip": "94118"}, "shipping_lines": [{"code": "Economy", "description": "", "price": 4.9, "source": "", "tax_lines": [], "title": "Economy"}], "shopify_order_id": "3785952133291", "status": "SUCCESS", "sub_total": null, "subtotal_price": "24.3", "tags": null, "tax_lines": "0", "total_discounts": "0", "total_duties": null, "total_line_items_price": "24.3", "total_price": "29.20", "total_refunds": null, "total_tax": "0", "total_weight": 0, "transaction_id": "Shopify Checkout", "type": "CHECKOUT", "updated_at": "2022-03-18T19:55:18"}, "emitted_at": 1674494648028} +{"stream": "charges", "data": {"address_id": 69286278, "billing_address": {"address1": "6 Liberty Square", "address2": "12", "city": "Boston", "company": "", "country": "United States", "first_name": "Kevin", "last_name": "Bacon", "phone": "+16175550124", "province": "Massachusetts", "zip": "02109"}, "client_details": {"browser_ip": "188.163.104.29", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}, "created_at": "2021-05-13T07:33:04", "currency": "USD", "customer_hash": "bdfac1e99b8dc2b0", "customer_id": 64965464, "discount_codes": null, "email": "bacon_kev@example.com", "first_name": "Kevin", "has_uncommited_changes": false, "id": 387414101, "last_name": "Bacon", "line_items": [{"images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/c_black1_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/c_black1_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/c_black1.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/c_black1_small.jpg"}, "price": "28.5", "properties": [], "quantity": 1, "shopify_product_id": 6644278001835, "shopify_variant_id": 39696660332715, "sku": null, "subscription_id": 153612006, "tax_lines": [], "title": "I Make Beats Wool Blend Snapback", "type": "SUBSCRIPTION", "variant_title": "One Size / Black"}], "note": null, "note_attributes": null, "processed_at": "2021-05-13T11:32:53", "processor_name": "shopify_payments", "requires_shipping": true, "scheduled_at": "2021-05-13T00:00:00", "shipments_count": null, "shipping_address": {"address1": "6 Liberty Square", "address2": "12", "city": "Boston", "company": "", "country": "United States", "first_name": "Kevin", "last_name": "Bacon", "phone": "+16175550124", "province": "Massachusetts", "zip": "02109"}, "shipping_lines": [{"code": "Economy", "description": "", "price": 4.9, "source": "", "tax_lines": [], "title": "Economy"}], "shopify_order_id": "3787421647019", "status": "SUCCESS", "sub_total": null, "subtotal_price": "28.5", "tags": null, "tax_lines": "0", "total_discounts": "0", "total_duties": null, "total_line_items_price": "28.5", "total_price": "33.40", "total_refunds": null, "total_tax": "0", "total_weight": 0, "transaction_id": "Shopify Checkout", "type": "CHECKOUT", "updated_at": "2022-03-18T19:54:35"}, "emitted_at": 1674494648029} +{"stream": "charges", "data": {"address_id": 69282975, "billing_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": "", "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "client_details": {"browser_ip": "188.163.104.29", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}, "created_at": "2021-05-13T05:46:49", "currency": "USD", "customer_hash": "f99bd4a6877257af", "customer_id": 64962974, "discount_codes": null, "email": "kozakevich_k@example.com", "first_name": "Kelly", "has_uncommited_changes": false, "id": 387392771, "last_name": "Kozakevich", "line_items": [{"images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.3", "properties": [], "quantity": 1, "shopify_product_id": 6642695864491, "shopify_variant_id": 39684723835051, "sku": null, "subscription_id": 153601366, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "L / City Green"}], "note": null, "note_attributes": null, "processed_at": "2021-05-13T09:46:39", "processor_name": "shopify_payments", "requires_shipping": true, "scheduled_at": "2021-05-13T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": "", "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "shipping_lines": [{"code": "Economy", "description": "", "price": 4.9, "source": "", "tax_lines": [], "title": "Economy"}], "shopify_order_id": "3787335991467", "status": "SUCCESS", "sub_total": null, "subtotal_price": "24.3", "tags": null, "tax_lines": "0", "total_discounts": "0", "total_duties": null, "total_line_items_price": "24.3", "total_price": "29.20", "total_refunds": null, "total_tax": "0", "total_weight": 0, "transaction_id": "Shopify Checkout", "type": "CHECKOUT", "updated_at": "2022-03-18T19:54:36"}, "emitted_at": 1674494648029} +{"stream": "charges", "data": {"address_id": 69105381, "analytics_data": {"utm_params": []}, "billing_address": {"address1": "1 9th Ave", "address2": "1", "city": "San Francisco", "company": null, "country": "United States", "first_name": "Karina", "last_name": "Kuznetsova", "phone": null, "province": "California", "zip": "94118"}, "client_details": {"browser_ip": null, "user_agent": null}, "created_at": "2021-05-12T08:04:07", "currency": "USD", "customer_hash": "23dee52d73734a81", "customer_id": 64817252, "discount_codes": [], "email": "nikolaevaka@yahoo.com", "error": "None\r\n [May 12, 12:06AM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [May 13, 4:10PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [May 19, 4:10PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [May 25, 4:10PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [May 31, 4:09PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']\r\n [Jun 06, 4:10PM] ['Inventory unavailable S / Black T1 6642695864491 requested qty. 1, inventory was: -1']", "error_type": "CLOSED_MAX_RETRIES_REACHED", "first_name": "Karina", "has_uncommited_changes": false, "id": 386976088, "last_charge_attempt_date": "2022-06-06T16:10:19", "last_name": "Kuznetsova", "line_items": [{"grams": 0, "images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.30", "properties": [], "quantity": 1, "shopify_product_id": "6642695864491", "shopify_variant_id": "39684722131115", "sku": "T1", "subscription_id": 153224593, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "S / Black", "vendor": "Airbyte"}], "note": "", "note_attributes": null, "number_times_tried": 6, "processor_name": "shopify_payments", "requires_shipping": true, "retry_date": "2022-06-12T00:00:00", "scheduled_at": "2022-05-12T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1 9th Ave", "address2": "1", "city": "San Francisco", "company": null, "country": "United States", "first_name": "Jane", "last_name": "Doe", "phone": "1234567890", "province": "California", "zip": "94118"}, "shipping_lines": [{"code": "Economy", "description": "", "price": 4.9, "source": "shopify", "tax_lines": [], "title": "Economy"}], "shopify_order_id": null, "shopify_variant_id_not_found": null, "status": "ERROR", "sub_total": null, "subtotal_price": "24.3", "tags": "Subscription, Subscription Recurring Order", "tax_lines": "0.0", "total_discounts": "0.00", "total_duties": 0.0, "total_line_items_price": "24.30", "total_price": "29.20", "total_refunds": null, "total_tax": "0.0", "total_weight": 0, "transaction_id": null, "type": "RECURRING", "updated_at": "2023-01-16T13:08:54"}, "emitted_at": 1674494648030} +{"stream": "charges", "data": {"address_id": 69282975, "analytics_data": {"utm_params": []}, "billing_address": {"address1": "1921 W Wilson St", "address2": null, "city": "Batavia", "company": null, "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "client_details": {"browser_ip": null, "user_agent": null}, "created_at": "2021-05-13T05:46:47", "currency": "USD", "customer_hash": "f99bd4a6877257af", "customer_id": 64962974, "discount_codes": null, "email": "kozakevich_k@example.com", "first_name": "Kelly", "has_uncommited_changes": false, "id": 387392762, "last_name": "Kozakevich", "line_items": [{"images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.3", "properties": [], "quantity": 1, "shopify_product_id": 6642695864491, "shopify_variant_id": 39684723835051, "sku": "T3", "subscription_id": 153601366, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "L / City Green"}], "note": null, "note_attributes": [], "processed_at": "2022-05-13T00:07:39", "processor_name": "shopify_payments", "requires_shipping": true, "scheduled_at": "2022-05-13T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": null, "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "shipping_lines": [{"code": "Economy", "description": "", "price": "4.90", "source": "Subscription", "tax_lines": [], "title": "Economy"}], "shopify_order_id": "4387657613483", "status": "SUCCESS", "sub_total": null, "subtotal_price": "24.3", "tags": "", "tax_lines": "0", "total_discounts": "0.0", "total_duties": null, "total_line_items_price": "24.3", "total_price": "29.20", "total_refunds": null, "total_tax": "0", "total_weight": 0, "transaction_id": "4857856171", "type": "RECURRING", "updated_at": "2022-05-13T00:07:39"}, "emitted_at": 1674494648031} +{"stream": "charges", "data": {"address_id": 69282975, "analytics_data": {"utm_params": []}, "billing_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": null, "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "client_details": {"browser_ip": null, "user_agent": null}, "created_at": "2022-05-13T00:07:39", "currency": "USD", "customer_hash": "f99bd4a6877257af", "customer_id": 64962974, "discount_codes": [], "email": "kozakevich_k@example.com", "first_name": "Kelly", "has_uncommited_changes": false, "id": 580825303, "last_name": "Kozakevich", "line_items": [{"grams": 0, "images": {"large": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_large.jpg", "medium": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_medium.jpg", "original": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581.jpg", "small": "https://cdn.shopify.com/s/files/1/0565/0628/6251/products/t_neon_green_47f548d4-fda5-4e21-8066-1d4caadbe581_small.jpg"}, "price": "24.30", "properties": [], "quantity": 1, "shopify_product_id": "6642695864491", "shopify_variant_id": "39684723835051", "sku": "T3", "subscription_id": 153601366, "tax_lines": [], "title": "Airbit Box Corner Short sleeve t-shirt", "type": "SUBSCRIPTION", "variant_title": "L / City Green", "vendor": "Airbyte"}], "note": "", "note_attributes": null, "processor_name": "shopify_payments", "requires_shipping": true, "scheduled_at": "2023-05-13T00:00:00", "shipments_count": null, "shipping_address": {"address1": "1921 W Wilson St", "address2": "", "city": "Batavia", "company": null, "country": "United States", "first_name": "Kelly", "last_name": "Kozakevich", "phone": "+16145550188", "province": "Illinois", "zip": "60510"}, "shipping_lines": [{"code": "Economy", "description": null, "price": "4.90", "source": "shopify", "tax_lines": [], "title": "Economy"}], "shopify_order_id": null, "status": "QUEUED", "sub_total": null, "subtotal_price": "24.3", "tags": "Subscription, Subscription Recurring Order", "tax_lines": "0.0", "total_discounts": "0.00", "total_duties": null, "total_line_items_price": "24.30", "total_price": "29.20", "total_refunds": null, "total_tax": "0.0", "total_weight": 0, "transaction_id": null, "type": "RECURRING", "updated_at": "2022-06-22T09:57:36"}, "emitted_at": 1674494648032} {"stream": "customers", "data": {"accepts_marketing": null, "analytics_data": {"utm_params": []}, "billing_address1": "6 Liberty Square", "billing_address2": "12", "billing_city": "Boston", "billing_company": null, "billing_country": "United States", "billing_phone": "+16175550124", "billing_province": "Massachusetts", "billing_zip": "02109", "created_at": "2021-05-13T07:32:59", "email": "bacon_kev@example.com", "first_charge_processed_at": "2021-05-13T11:32:53", "first_name": "Kevin", "has_card_error_in_dunning": false, "has_valid_payment_method": true, "hash": "bdfac1e99b8dc2b0", "id": 64965464, "last_name": "Bacon", "number_active_subscriptions": 0, "number_subscriptions": 1, "phone": "+16175550124", "processor_type": "shopify_payments", "reason_payment_method_not_valid": null, "shopify_customer_id": "5213438017707", "status": "ACTIVE", "tax_exempt": false, "updated_at": "2022-07-25T02:23:18"}, "emitted_at": 1673893321011} {"stream": "customers", "data": {"accepts_marketing": 1, "analytics_data": {"utm_params": []}, "billing_address1": "1921 W Wilson St", "billing_address2": "", "billing_city": "Batavia", "billing_company": null, "billing_country": "United States", "billing_phone": "+16145550188", "billing_province": "Illinois", "billing_zip": "60510", "created_at": "2021-05-13T05:46:44", "email": "kozakevich_k@example.com", "first_charge_processed_at": "2021-05-13T09:46:39", "first_name": "Kelly", "has_card_error_in_dunning": false, "has_valid_payment_method": true, "hash": "f99bd4a6877257af", "id": 64962974, "last_name": "Kozakevich", "number_active_subscriptions": 1, "number_subscriptions": 1, "phone": "+16145550188", "processor_type": "shopify_payments", "reason_payment_method_not_valid": null, "shopify_customer_id": "5213433266347", "status": "ACTIVE", "tax_exempt": false, "updated_at": "2022-07-25T02:23:18"}, "emitted_at": 1673893321012} {"stream": "customers", "data": {"accepts_marketing": 1, "analytics_data": {"utm_params": []}, "billing_address1": "1 9th Ave", "billing_address2": "1", "billing_city": "San Francisco", "billing_company": null, "billing_country": "United States", "billing_phone": null, "billing_province": "California", "billing_zip": "94118", "created_at": "2021-05-12T08:04:06", "email": "nikolaevaka@yahoo.com", "first_charge_processed_at": "2021-05-12T12:03:59", "first_name": "Karina", "has_card_error_in_dunning": false, "has_valid_payment_method": true, "hash": "23dee52d73734a81", "id": 64817252, "last_name": "Kuznetsova", "number_active_subscriptions": 0, "number_subscriptions": 1, "phone": null, "processor_type": "shopify_payments", "reason_payment_method_not_valid": null, "shopify_customer_id": "5212085977259", "status": "ACTIVE", "tax_exempt": false, "updated_at": "2023-01-16T13:08:45"}, "emitted_at": 1673893321013} From 113b1345a84866b0e0789c830d387c9161d29622 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 25 Jan 2023 11:02:32 +0100 Subject: [PATCH 076/195] Hide anaonymize data field on preference page (#21733) --- .../PreferencesForm/PreferencesForm.tsx | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/airbyte-webapp/src/views/Settings/PreferencesForm/PreferencesForm.tsx b/airbyte-webapp/src/views/Settings/PreferencesForm/PreferencesForm.tsx index 0b88f593030cb..84225c929412a 100644 --- a/airbyte-webapp/src/views/Settings/PreferencesForm/PreferencesForm.tsx +++ b/airbyte-webapp/src/views/Settings/PreferencesForm/PreferencesForm.tsx @@ -9,6 +9,7 @@ import LabeledInput from "components/LabeledInput"; import { LabeledSwitch } from "components/LabeledSwitch"; import { Button } from "components/ui/Button"; +import { useConfig } from "config"; import { links } from "utils/links"; import EditControls from "./components/EditControls"; @@ -70,12 +71,13 @@ const PreferencesForm: React.FC = ({ errorMessage, }) => { const { formatMessage } = useIntl(); + const config = useConfig(); return ( = ({ )} - - - - - ( - - {docs} - - ), - }} - /> - - - - {({ field }: FieldProps) => ( - } + {config.segment.enabled && ( + <> + + + + + ( + + {docs} + + ), + }} /> - )} - - + + + + {({ field }: FieldProps) => ( + } + /> + )} + + + + )} From ecc17b6c64144ae708be5881bf2dcd2f55465eae Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 25 Jan 2023 15:00:52 +0100 Subject: [PATCH 077/195] Remove signup source selection experiment (#21819) --- .../hooks/services/Experiment/experiments.ts | 1 - airbyte-webapp/src/hooks/useLocationState.ts | 10 - .../SignupSourceDropdown.tsx | 197 -- .../experiments/SignupSourceDropdown/index.ts | 1 - .../sourceDefinitions.json | 1596 ----------------- .../useGetSourceDefinitions.tsx | 35 - .../SignupSourceDropdown/utils.tsx | 43 - .../cloud/components/experiments/constants.ts | 1 - .../src/packages/cloud/locales/en.json | 1 - .../src/packages/cloud/views/DefaultView.tsx | 16 - .../auth/SignupPage/components/SignupForm.tsx | 11 +- .../CreateConnectionPage.tsx | 8 +- 12 files changed, 2 insertions(+), 1918 deletions(-) delete mode 100644 airbyte-webapp/src/hooks/useLocationState.ts delete mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/SignupSourceDropdown.tsx delete mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/index.ts delete mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/sourceDefinitions.json delete mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/useGetSourceDefinitions.tsx delete mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/utils.tsx delete mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/constants.ts diff --git a/airbyte-webapp/src/hooks/services/Experiment/experiments.ts b/airbyte-webapp/src/hooks/services/Experiment/experiments.ts index 86806f34a0f14..cf52b070a898b 100644 --- a/airbyte-webapp/src/hooks/services/Experiment/experiments.ts +++ b/airbyte-webapp/src/hooks/services/Experiment/experiments.ts @@ -21,7 +21,6 @@ export interface Experiments { "authPage.oauth.google.signUpPage": boolean; "authPage.oauth.github.signUpPage": boolean; "onboarding.speedyConnection": boolean; - "authPage.signup.sourceSelector": boolean; "authPage.oauth.position": "top" | "bottom"; "connection.onboarding.sources": string; "connection.onboarding.destinations": string; diff --git a/airbyte-webapp/src/hooks/useLocationState.ts b/airbyte-webapp/src/hooks/useLocationState.ts deleted file mode 100644 index 8048849ce75a4..0000000000000 --- a/airbyte-webapp/src/hooks/useLocationState.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useLocation } from "react-router-dom"; - -interface ILocationState extends Omit { - state: T; -} - -export const useLocationState = (): T => { - const location = useLocation() as unknown as ILocationState; - return location.state; -}; diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/SignupSourceDropdown.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/SignupSourceDropdown.tsx deleted file mode 100644 index ad366f986303d..0000000000000 --- a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/SignupSourceDropdown.tsx +++ /dev/null @@ -1,197 +0,0 @@ -import { faPlus } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React, { useCallback, useMemo, useState } from "react"; -import { FormattedMessage, useIntl } from "react-intl"; -import { components } from "react-select"; -import { MenuListProps } from "react-select"; - -import { GAIcon } from "components/icons/GAIcon"; -import { ControlLabels } from "components/LabeledControl"; -import { - DropDown, - DropDownOptionDataItem, - DropDownOptionProps, - OptionView, - SingleValueIcon, - SingleValueProps, - SingleValueView, -} from "components/ui/DropDown"; -import { Text } from "components/ui/Text"; - -import { ReleaseStage } from "core/request/AirbyteClient"; -import { useModalService } from "hooks/services/Modal"; -import styles from "views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorServiceTypeControl.module.scss"; -import { useAnalyticsTrackFunctions } from "views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/useAnalyticsTrackFunctions"; -import { WarningMessage } from "views/Connector/ConnectorForm/components/WarningMessage"; -import RequestConnectorModal from "views/Connector/RequestConnectorModal"; - -import { useGetSourceDefinitions } from "./useGetSourceDefinitions"; -import { getSortedDropdownData } from "./utils"; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type MenuWithRequestButtonProps = MenuListProps & { selectProps: any }; - -const ConnectorList: React.FC> = ({ children, ...props }) => ( - <> - {children} -
    - -
    - -); - -const StageLabel: React.FC<{ releaseStage?: ReleaseStage }> = ({ releaseStage }) => { - if (!releaseStage) { - return null; - } - - if (releaseStage === ReleaseStage.generally_available) { - return ; - } - - return ( -
    - -
    - ); -}; - -const Option: React.FC = (props) => { - return ( - - -
    - {props.data.img || null} - {props.label} -
    - -
    -
    - ); -}; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const SingleValue: React.FC> = (props) => { - return ( - - {props.data.img && {props.data.img}} -
    - - {props.data.label} - - -
    -
    - ); -}; - -interface SignupSourceDropdownProps { - disabled?: boolean; - email: string; -} - -export const SignupSourceDropdown: React.FC = ({ disabled, email }) => { - const { formatMessage } = useIntl(); - const { openModal, closeModal } = useModalService(); - const { trackMenuOpen, trackNoOptionMessage, trackConnectorSelection } = useAnalyticsTrackFunctions("source"); - - const { data: availableSources } = useGetSourceDefinitions(); - - const [sourceDefinitionId, setSourceDefinitionId] = useState(""); - - const onChangeServiceType = useCallback((sourceDefinitionId: string) => { - setSourceDefinitionId(sourceDefinitionId); - localStorage.setItem("exp-signup-selected-source-definition-id", sourceDefinitionId); - }, []); - - const sortedDropDownData = useMemo(() => getSortedDropdownData(availableSources ?? []), [availableSources]); - - const getNoOptionsMessage = useCallback( - ({ inputValue }: { inputValue: string }) => { - trackNoOptionMessage(inputValue); - return formatMessage({ id: "form.noConnectorFound" }); - }, - [formatMessage, trackNoOptionMessage] - ); - - const selectedService = React.useMemo( - () => sortedDropDownData.find((s) => s.value === sourceDefinitionId), - [sourceDefinitionId, sortedDropDownData] - ); - - const handleSelect = useCallback( - (item: DropDownOptionDataItem | null) => { - if (item && onChangeServiceType) { - onChangeServiceType(item.value); - trackConnectorSelection(item.value, item.label || ""); - } - }, - [onChangeServiceType, trackConnectorSelection] - ); - - const selectProps = useMemo( - () => ({ - onOpenRequestConnectorModal: (input: string) => - openModal({ - title: formatMessage({ id: "connector.requestConnector" }), - content: () => ( - - ), - }), - }), - [closeModal, formatMessage, openModal, email] - ); - - if (!Boolean(sortedDropDownData.length)) { - return null; - } - return ( - <> - - - - {selectedService && - (selectedService.releaseStage === ReleaseStage.alpha || selectedService.releaseStage === ReleaseStage.beta) && ( - - )} - - ); -}; diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/index.ts b/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/index.ts deleted file mode 100644 index c4110b508920f..0000000000000 --- a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { SignupSourceDropdown } from "./SignupSourceDropdown"; diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/sourceDefinitions.json b/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/sourceDefinitions.json deleted file mode 100644 index a22acd703a4b8..0000000000000 --- a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/sourceDefinitions.json +++ /dev/null @@ -1,1596 +0,0 @@ -{ - "sourceDefinitions": [ - { - "sourceDefinitionId": "d3b7fa46-111b-419a-998a-d7f046f6d66d", - "name": "Adjust", - "dockerRepository": "airbyte/source-adjust", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/adjust", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "14c6e7ea-97ed-4f5e-a7b5-25e9a80b8212", - "name": "Airtable", - "dockerRepository": "airbyte/source-airtable", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/airtable", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "1fa90628-2b9e-11ed-a261-0242ac120002", - "name": "AlloyDB for PostgreSQL", - "dockerRepository": "airbyte/source-alloydb", - "dockerImageTag": "1.0.15", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/alloydb", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "database" - }, - { - "sourceDefinitionId": "6ff047c0-f5d5-4ce5-8c81-204a830fa7e1", - "name": "AWS CloudTrail", - "dockerRepository": "airbyte/source-aws-cloudtrail", - "dockerImageTag": "0.1.4", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/aws-cloudtrail", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "c6b0a29e-1da9-4512-9002-7bfd0cba2246", - "name": "Amazon Ads", - "dockerRepository": "airbyte/source-amazon-ads", - "dockerImageTag": "0.1.23", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/amazon-ads", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "e55879a8-0ef8-4557-abcf-ab34c53ec460", - "name": "Amazon Seller Partner", - "dockerRepository": "airbyte/source-amazon-seller-partner", - "dockerImageTag": "0.2.27", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/amazon-seller-partner", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "983fd355-6bf3-4709-91b5-37afa391eeb6", - "name": "Amazon SQS", - "dockerRepository": "airbyte/source-amazon-sqs", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/amazon-sqs", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "fa9f58c6-2d03-4237-aaa4-07d75e0c1396", - "name": "Amplitude", - "dockerRepository": "airbyte/source-amplitude", - "dockerImageTag": "0.1.16", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/amplitude", - "icon": "\n\t\n\t\n\t\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "47f17145-fe20-4ef5-a548-e29b048adf84", - "name": "Apify Dataset", - "dockerRepository": "airbyte/source-apify-dataset", - "dockerImageTag": "0.1.11", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/apify-dataset", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b4375641-e270-41d3-9c20-4f9cecad87a8", - "name": "Appfollow", - "dockerRepository": "airbyte/source-appfollow", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/appfollow", - "icon": "\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "2af123bf-0aaf-4e0d-9784-cb497f23741a", - "name": "Appstore", - "dockerRepository": "airbyte/source-appstore-singer", - "dockerImageTag": "0.2.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/appstore", - "icon": "\n\n \n \n \n \n \n \n\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d0243522-dccf-4978-8ba0-37ed47a0bdbf", - "name": "Asana", - "dockerRepository": "airbyte/source-asana", - "dockerImageTag": "0.1.4", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/asana", - "icon": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "releaseStage": "beta", - "sourceType": "api" - }, - { - "sourceDefinitionId": "798ae795-5189-42b6-b64e-3cb91db93338", - "name": "Azure Table Storage", - "dockerRepository": "airbyte/source-azure-table", - "dockerImageTag": "0.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/azure-table", - "icon": "", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "90916976-a132-4ce9-8bce-82a03dd58788", - "name": "BambooHR", - "dockerRepository": "airbyte/source-bamboo-hr", - "dockerImageTag": "0.2.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/bamboo-hr", - "icon": "\n\n \n BambooHR\n Created with Sketch.\n \n \n \n \n \n \n \n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "59c5501b-9f95-411e-9269-7143c939adbd", - "name": "BigCommerce", - "dockerRepository": "airbyte/source-bigcommerce", - "dockerImageTag": "0.1.7", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/bigcommerce", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "bfd1ddf8-ae8a-4620-b1d7-55597d2ba08c", - "name": "BigQuery", - "dockerRepository": "airbyte/source-bigquery", - "dockerImageTag": "0.2.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/bigquery", - "icon": "", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "47f25999-dd5e-4636-8c39-e7cea2453331", - "name": "Bing Ads", - "dockerRepository": "airbyte/source-bing-ads", - "dockerImageTag": "0.1.16", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/bing-ads", - "icon": "\n\n \n \n \n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "63cea06f-1c75-458d-88fe-ad48c7cb27fd", - "name": "Braintree", - "dockerRepository": "airbyte/source-braintree", - "dockerImageTag": "0.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/braintree", - "icon": "\n\n \n \n \n \n \n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "bb1a6d31-6879-4819-a2bd-3eed299ea8e2", - "name": "Cart.com", - "dockerRepository": "airbyte/source-cart", - "dockerImageTag": "0.2.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/cart", - "icon": "\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "686473f1-76d9-4994-9cc7-9b13da46147c", - "name": "Chargebee", - "dockerRepository": "airbyte/source-chargebee", - "dockerImageTag": "0.1.15", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/chargebee", - "icon": "\n\n \n \n \n\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "9b2d3607-7222-4709-9fa2-c2abdebbdd88", - "name": "Chargify", - "dockerRepository": "airbyte/source-chargify", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/chargify", - "icon": "\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b6604cbd-1b12-4c08-8767-e140d0fb0877", - "name": "Chartmogul", - "dockerRepository": "airbyte/source-chartmogul", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/chartmogul", - "icon": "\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "bad83517-5e54-4a3d-9b53-63e85fbd4d7c", - "name": "ClickHouse", - "dockerRepository": "airbyte/source-clickhouse", - "dockerImageTag": "0.1.14", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/clickhouse", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "dfffecb7-9a13-43e9-acdc-b92af7997ca9", - "name": "Close.com", - "dockerRepository": "airbyte/source-close-com", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/close-com", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "9fa5862c-da7c-11eb-8d19-0242ac130003", - "name": "Cockroachdb", - "dockerRepository": "airbyte/source-cockroachdb", - "dockerImageTag": "0.1.18", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/cockroachdb", - "icon": "", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "008b2e26-11a3-11ec-82a8-0242ac130003", - "name": "Commercetools", - "dockerRepository": "airbyte/source-commercetools", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/commercetools", - "icon": "\n\n\n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "cf40a7f8-71f8-45ce-a7fa-fca053e4028c", - "name": "Confluence", - "dockerRepository": "airbyte/source-confluence", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/confluence", - "icon": "\n\n \n \n \n \n \n \n \n \n \n \n \n\t\t\t\t\n\t\t\t\t\n\t\t\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "0541b2cd-2367-4986-b5f1-b79ff55439e4", - "name": "Courier", - "dockerRepository": "airbyte/source-courier", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/courier", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "c47d6804-8b98-449f-970a-5ddb5cb5d7aa", - "name": "Customer.io", - "dockerRepository": "farosai/airbyte-customer-io-source", - "dockerImageTag": "0.1.23", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/customer-io", - "icon": "Logo-Color-NEW", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "cc88c43f-6f53-4e8a-8c4d-b284baaf9635", - "name": "Delighted", - "dockerRepository": "airbyte/source-delighted", - "dockerImageTag": "0.1.4", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/delighted", - "icon": "\n \n \n \n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "0b5c867e-1b12-4d02-ab74-97b2184ff6d7", - "name": "Dixa", - "dockerRepository": "airbyte/source-dixa", - "dockerImageTag": "0.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/dixa", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "72d405a3-56d8-499f-a571-667c03406e43", - "name": "Dockerhub", - "dockerRepository": "airbyte/source-dockerhub", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/dockerhub", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "445831eb-78db-4b1f-8f1f-0d96ad8739e2", - "name": "Drift", - "dockerRepository": "airbyte/source-drift", - "dockerImageTag": "0.2.5", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/drift", - "icon": "\n\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "1356e1d9-977f-4057-ad4b-65f25329cf61", - "name": "DV 360", - "dockerRepository": "airbyte/source-dv-360", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/dv-360", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d53f9084-fa6b-4a5a-976c-5b8392f4ad8a", - "name": "E2E Testing", - "dockerRepository": "airbyte/source-e2e-test", - "dockerImageTag": "2.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/e2e-test", - "icon": "\n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "e2b40e36-aa0e-4bed-b41b-bcea6fa348b1", - "name": "Exchange Rates Api", - "dockerRepository": "airbyte/source-exchange-rates", - "dockerImageTag": "1.2.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/exchangeratesapi", - "icon": "\n\n \n logo\n Created with Sketch.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "e7778cfc-e97c-4458-9ecb-b4f2bba8946c", - "name": "Facebook Marketing", - "dockerRepository": "airbyte/source-facebook-marketing", - "dockerImageTag": "0.2.69", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/facebook-marketing", - "icon": "\nimage/svg+xml\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "010eb12f-837b-4685-892d-0a39f76a98f5", - "name": "Facebook Pages", - "dockerRepository": "airbyte/source-facebook-pages", - "dockerImageTag": "0.1.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/facebook-pages", - "icon": "\nimage/svg+xml\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "dfd88b22-b603-4c3d-aad7-3701784586b1", - "name": "Faker", - "dockerRepository": "airbyte/source-faker", - "dockerImageTag": "0.2.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/faker", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "3825db3e-c94b-42ac-bd53-b5a9507ace2b", - "name": "Fauna", - "dockerRepository": "airbyte/source-fauna", - "dockerImageTag": "dev", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/fauna", - "icon": "\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "778daa7c-feaf-4db6-96f3-70fd645acc77", - "name": "File", - "dockerRepository": "airbyte/source-file", - "dockerImageTag": "0.2.26", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/file", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "file" - }, - { - "sourceDefinitionId": "8a5d48f6-03bb-4038-a942-a8d3f175cca3", - "name": "Freshcaller", - "dockerRepository": "airbyte/source-freshcaller", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/freshcaller" - }, - { - "sourceDefinitionId": "f95337f1-2ad1-4baf-922f-2ca9152de630", - "name": "Flexport", - "dockerRepository": "airbyte/source-flexport", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/flexport", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "ec4b9503-13cb-48ab-a4ab-6ade4be46567", - "name": "Freshdesk", - "dockerRepository": "airbyte/source-freshdesk", - "dockerImageTag": "0.3.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/freshdesk", - "icon": "\nimage/svg+xml\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "eca08d79-7b92-4065-b7f3-79c14836ebe7", - "name": "Freshsales", - "dockerRepository": "airbyte/source-freshsales", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/freshsales", - "icon": "freshsales_logo_color", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "9bb85338-ea95-4c93-b267-6be89125b267", - "name": "Freshservice", - "dockerRepository": "airbyte/source-freshservice", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/freshservice", - "icon": "\r\n\r\n\r\n\r\n\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\r\n\r\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "ef69ef6e-aa7f-4af1-a01d-ef775033524e", - "name": "GitHub", - "dockerRepository": "airbyte/source-github", - "dockerImageTag": "0.3.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/github", - "icon": "\n\n\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "5e6175e5-68e1-4c17-bff9-56103bbb0d80", - "name": "Gitlab", - "dockerRepository": "airbyte/source-gitlab", - "dockerImageTag": "0.1.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/gitlab", - "icon": "\n\n\n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\n\n\t\n\t\n\t\n\t\n\tH: 2.5 x\n\t1/2 x\n\t1x\n\t1x\n\t\n\t1x\n\t\n\t1x\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "cf8ff320-6272-4faa-89e6-4402dc17e5d5", - "name": "Glassfrog", - "dockerRepository": "airbyte/source-glassfrog", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/glassfrog", - "icon": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "ba15ac82-5c6a-4fb2-bf24-925c23a1180c", - "name": "GoCardless", - "dockerRepository": "airbyte/source-gocardless", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/gocardless", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "253487c0-2246-43ba-a21f-5116b20a2c50", - "name": "Google Ads", - "dockerRepository": "airbyte/source-google-ads", - "dockerImageTag": "0.2.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/google-ads", - "icon": "\r\n\r\n\r\n\r\n\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\r\n\r\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "eff3616a-f9c3-11eb-9a03-0242ac130003", - "name": "Google Analytics (Universal Analytics)", - "dockerRepository": "airbyte/source-google-analytics-v4", - "dockerImageTag": "0.1.30", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/google-analytics-universal-analytics", - "icon": "\n\n\n\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\n\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "3cc2eafd-84aa-4dca-93af-322d9dfeec1a", - "name": "Google Analytics 4 (GA4)", - "dockerRepository": "airbyte/source-google-analytics-data-api", - "dockerImageTag": "0.0.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/google-analytics-v4", - "icon": "\n\n\n\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d19ae824-e289-4b14-995a-0632eb46d246", - "name": "Google Directory", - "dockerRepository": "airbyte/source-google-directory", - "dockerImageTag": "0.1.9", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/google-directory", - "icon": "\n\n\n\n \n\n\n \n\n\n \n\n\n\n \n\n\n \n\n\n \n\n\n\n \n\n\n \n\n\n \n\n\n\n \n\n\n \n\n\n \n\n\n\n \n\n\n \n\n\n \n\n\n\n \n\n\n \n\n\n \n\n\n\n \n\n\n \n\n\n \n\n\n\n \n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "eb4c9e00-db83-4d63-a386-39cfa91012a8", - "name": "Google Search Console", - "dockerRepository": "airbyte/source-google-search-console", - "dockerImageTag": "0.1.17", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/google-search-console", - "icon": "\n\n \n Artboard\n Created with Sketch.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "71607ba1-c0ac-4799-8049-7f4b90dd50f7", - "name": "Google Sheets", - "dockerRepository": "airbyte/source-google-sheets", - "dockerImageTag": "0.2.21", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/google-sheets", - "icon": "\n\n\n\n\t\n\t\n\t\n\n\n", - "releaseStage": "generally_available", - "sourceType": "file" - }, - { - "sourceDefinitionId": "ed9dfefa-1bbc-419d-8c5e-4d78f0ef6734", - "name": "Google Workspace Admin Reports", - "dockerRepository": "airbyte/source-google-workspace-admin-reports", - "dockerImageTag": "0.1.8", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/google-workspace-admin-reports", - "icon": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "59f1e50a-331f-4f09-b3e8-2e8d4d355f44", - "name": "Greenhouse", - "dockerRepository": "airbyte/source-greenhouse", - "dockerImageTag": "0.2.11", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/greenhouse", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "6fe89830-d04d-401b-aad6-6552ffa5c4af", - "name": "Harness", - "dockerRepository": "farosai/airbyte-harness-source", - "dockerImageTag": "0.1.23", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/harness", - "icon": "\n\n\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "fe2b4084-3386-4d3b-9ad6-308f61a6f1e6", - "name": "Harvest", - "dockerRepository": "airbyte/source-harvest", - "dockerImageTag": "0.1.11", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/harvest", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "492b56d1-937c-462e-8076-21ad2031e784", - "name": "Hellobaton", - "dockerRepository": "airbyte/source-hellobaton", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/hellobaton", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "8097ceb9-383f-42f6-9f92-d3fd4bcc7689", - "name": "Hubplanner", - "dockerRepository": "airbyte/source-hubplanner", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/hubplanner", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "36c891d9-4bd9-43ac-bad2-10e12756272c", - "name": "HubSpot", - "dockerRepository": "airbyte/source-hubspot", - "dockerImageTag": "0.2.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/hubspot", - "icon": "\n\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "447e0381-3780-4b46-bb62-00a4e3c8b8e2", - "name": "IBM Db2", - "dockerRepository": "airbyte/source-db2", - "dockerImageTag": "0.1.16", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/db2", - "icon": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "6acf6b55-4f1e-4fca-944e-1a3caef8aba8", - "name": "Instagram", - "dockerRepository": "airbyte/source-instagram", - "dockerImageTag": "1.0.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/instagram", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d8313939-3782-41b0-be29-b3ca20d8dd3a", - "name": "Intercom", - "dockerRepository": "airbyte/source-intercom", - "dockerImageTag": "0.1.27", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/intercom", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "2e875208-0c0b-4ee4-9e92-1cb3156ea799", - "name": "Iterable", - "dockerRepository": "airbyte/source-iterable", - "dockerImageTag": "0.1.19", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/iterable", - "icon": "\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\t\r\n\t\r\n\t\t\r\n\t\r\n\t\t\r\n\r\n\r\n\t\r\n\t\r\n\t\r\n\t\r\n\r\n\r\n\r\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d6f73702-d7a0-4e95-9758-b0fb1af0bfba", - "name": "Jenkins", - "dockerRepository": "farosai/airbyte-jenkins-source", - "dockerImageTag": "0.1.23", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/jenkins", - "icon": "\n\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "68e63de2-bb83-4c7e-93fa-a8a9051e3993", - "name": "Jira", - "dockerRepository": "airbyte/source-jira", - "dockerImageTag": "0.2.21", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/jira", - "icon": "\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d917a47b-8537-4d0d-8c10-36a9928d4265", - "name": "Kafka", - "dockerRepository": "airbyte/source-kafka", - "dockerImageTag": "0.2.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/kafka", - "icon": "\n", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "95e8cffd-b8c4-4039-968e-d32fb4a69bde", - "name": "Klaviyo", - "dockerRepository": "airbyte/source-klaviyo", - "dockerImageTag": "0.1.10", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/klaviyo", - "icon": "\r\n\r\n\r\n\r\n\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\r\n\r\n\r\n\r\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "547dc08e-ab51-421d-953b-8f3745201a8c", - "name": "Kyriba", - "dockerRepository": "airbyte/source-kyriba", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/kyriba", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "789f8e7a-2d28-11ec-8d3d-0242ac130003", - "name": "Lemlist", - "dockerRepository": "airbyte/source-lemlist", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/lemlist", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "3981c999-bd7d-4afc-849b-e53dea90c948", - "name": "Lever Hiring", - "dockerRepository": "airbyte/source-lever-hiring", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/lever-hiring", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "137ece28-5434-455c-8f34-69dc3782f451", - "name": "LinkedIn Ads", - "dockerRepository": "airbyte/source-linkedin-ads", - "dockerImageTag": "0.1.11", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/linkedin-ads", - "icon": "\n\n\n \n \n \n \n\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "af54297c-e8f8-4d63-a00d-a94695acc9d3", - "name": "LinkedIn Pages", - "dockerRepository": "airbyte/source-linkedin-pages", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/linkedin-pages", - "icon": "\n\n\n \n \n \n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "7b86879e-26c5-4ef6-a5ce-2be5c7b46d1e", - "name": "Linnworks", - "dockerRepository": "airbyte/source-linnworks", - "dockerImageTag": "0.1.5", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/linnworks", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "00405b19-9768-4e0c-b1ae-9fc2ee2b2a8c", - "name": "Looker", - "dockerRepository": "airbyte/source-looker", - "dockerImageTag": "0.2.7", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/looker", - "icon": "\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b03a9f3e-22a5-11eb-adc1-0242ac120002", - "name": "Mailchimp", - "dockerRepository": "airbyte/source-mailchimp", - "dockerImageTag": "0.2.15", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/mailchimp", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "5b9cb09e-1003-4f9c-983d-5779d1b2cd51", - "name": "Mailgun", - "dockerRepository": "airbyte/source-mailgun", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/mailgun", - "icon": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "9e0556f4-69df-4522-a3fb-03264d36b348", - "name": "Marketo", - "dockerRepository": "airbyte/source-marketo", - "dockerImageTag": "0.1.11", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/marketo", - "icon": "\nimage/svg+xml\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "c7cb421b-942e-4468-99ee-e369bcabaec5", - "name": "Metabase", - "dockerRepository": "airbyte/source-metabase", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/metabase", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b5ea17b1-f170-46dc-bc31-cc744ca984c1", - "name": "Microsoft SQL Server (MSSQL)", - "dockerRepository": "airbyte/source-mssql", - "dockerImageTag": "0.4.22", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/mssql", - "icon": "", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "eaf50f04-21dd-4620-913b-2a83f5635227", - "name": "Microsoft teams", - "dockerRepository": "airbyte/source-microsoft-teams", - "dockerImageTag": "0.2.5", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/microsoft-teams", - "icon": "\n\n\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n]>\n\n\n\t\n\t\t\n\t\t\n\t\t\t\n\t\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\n\t\n\t\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "12928b32-bf0a-4f1e-964f-07e12e37153a", - "name": "Mixpanel", - "dockerRepository": "airbyte/source-mixpanel", - "dockerImageTag": "0.1.28", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/mixpanel", - "icon": "\n\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "80a54ea2-9959-4040-aac1-eee42423ec9b", - "name": "Monday", - "dockerRepository": "airbyte/source-monday", - "dockerImageTag": "0.1.4", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/monday", - "icon": "\n\n \n \n \n image/svg+xml\n \n \n \n \n \n \n Logo / monday.com\n \n \n \n \n \n \n \n \n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b2e713cd-cc36-4c0a-b5bd-b47cb8a0561e", - "name": "MongoDb", - "dockerRepository": "airbyte/source-mongodb-v2", - "dockerImageTag": "0.1.19", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/mongodb-v2", - "icon": "\n\n", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "722ba4bf-06ec-45a4-8dd5-72e4a5cf3903", - "name": "My Hours", - "dockerRepository": "airbyte/source-my-hours", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/my-hours", - "icon": "\n\n \n \n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "435bb9a5-7887-4809-aa58-28c27df0d7ad", - "name": "MySQL", - "dockerRepository": "airbyte/source-mysql", - "dockerImageTag": "1.0.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/mysql", - "icon": "\n\n", - "releaseStage": "beta", - "sourceType": "database" - }, - { - "sourceDefinitionId": "4f2f093d-ce44-4121-8118-9d13b7bfccd0", - "name": "Netsuite", - "dockerRepository": "airbyte/source-netsuite", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/netsuite", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "6e00b415-b02e-4160-bf02-58176a0ae687", - "name": "Notion", - "dockerRepository": "airbyte/source-notion", - "dockerImageTag": "0.1.10", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/notion", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "1d4fdb25-64fc-4569-92da-fcdca79a8372", - "name": "Okta", - "dockerRepository": "airbyte/source-okta", - "dockerImageTag": "0.1.13", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/okta", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "bb6afd81-87d5-47e3-97c4-e2c2901b1cf8", - "name": "OneSignal", - "dockerRepository": "airbyte/source-onesignal", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/onesignal", - "icon": "\n\n \n \n \n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d8540a80-6120-485d-b7d6-272bca477d9b", - "name": "OpenWeather", - "dockerRepository": "airbyte/source-openweather", - "dockerImageTag": "0.1.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/openweather", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b39a7370-74c3-45a6-ac3a-380d48520a83", - "name": "Oracle DB", - "dockerRepository": "airbyte/source-oracle", - "dockerImageTag": "0.3.21", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/oracle", - "icon": "", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "7f0455fb-4518-4ec0-b7a3-d808bf8081cc", - "name": "Orb", - "dockerRepository": "airbyte/source-orb", - "dockerImageTag": "0.1.4", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/orb", - "icon": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "95bcc041-1d1a-4c2e-8802-0ca5b1bfa36a", - "name": "Orbit", - "dockerRepository": "airbyte/source-orbit", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/orbit", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "3490c201-5d95-4783-b600-eaf07a4c7787", - "name": "Outreach", - "dockerRepository": "airbyte/source-outreach", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/outreach", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "2817b3f0-04e4-4c7a-9f32-7a5e8a83db95", - "name": "PagerDuty", - "dockerRepository": "farosai/airbyte-pagerduty-source", - "dockerImageTag": "0.1.23", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/pagerduty", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d913b0f2-cc51-4e55-a44c-8ba1697b9239", - "name": "Paypal Transaction", - "dockerRepository": "airbyte/source-paypal-transaction", - "dockerImageTag": "0.1.10", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/paypal-transaction", - "icon": "\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "193bdcb8-1dd9-48d1-aade-91cadfd74f9b", - "name": "Paystack", - "dockerRepository": "airbyte/source-paystack", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/paystack", - "icon": "\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "3052c77e-8b91-47e2-97a0-a29a22794b4b", - "name": "PersistIq", - "dockerRepository": "airbyte/source-persistiq", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/persistiq", - "icon": "\n \n \n \n \n \n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "5cb7e5fe-38c2-11ec-8d3d-0242ac130003", - "name": "Pinterest", - "dockerRepository": "airbyte/source-pinterest", - "dockerImageTag": "0.1.7", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/pinterest", - "icon": "\nimage/svg+xml", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d8286229-c680-4063-8c59-23b9b391c700", - "name": "Pipedrive", - "dockerRepository": "airbyte/source-pipedrive", - "dockerImageTag": "0.1.13", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/pipedrive", - "icon": "\n\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d60f5393-f99e-4310-8d05-b1876820f40e", - "name": "Pivotal Tracker", - "dockerRepository": "airbyte/source-pivotal-tracker", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/pivotal-tracker", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "ed799e2b-2158-4c66-8da4-b40fe63bc72a", - "name": "Plaid", - "dockerRepository": "airbyte/source-plaid", - "dockerImageTag": "0.3.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/plaid", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "6371b14b-bc68-4236-bfbd-468e8df8e968", - "name": "PokeAPI", - "dockerRepository": "airbyte/source-pokeapi", - "dockerImageTag": "0.1.5", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/pokeapi", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "af6d50ee-dddf-4126-a8ee-7faee990774f", - "name": "PostHog", - "dockerRepository": "airbyte/source-posthog", - "dockerImageTag": "0.1.7", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/posthog", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "decd338e-5647-4c0b-adf4-da0e75f5a750", - "name": "Postgres", - "dockerRepository": "airbyte/source-postgres", - "dockerImageTag": "1.0.18", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/postgres", - "icon": "\r\n\r\n\r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n", - "releaseStage": "generally_available", - "sourceType": "database" - }, - { - "sourceDefinitionId": "d60a46d4-709f-4092-a6b7-2457f7d455f5", - "name": "Prestashop", - "dockerRepository": "airbyte/source-prestashop", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/prestashop", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "f636c3c6-4077-45ac-b109-19fc62a283c1", - "name": "Primetric", - "dockerRepository": "airbyte/source-primetric", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/primetric", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b08e4776-d1de-4e80-ab5c-1e51dad934a2", - "name": "Qualaroo", - "dockerRepository": "airbyte/source-qualaroo", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/qualaroo", - "icon": "\n\n\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "29b409d9-30a5-4cc8-ad50-886eb846fea3", - "name": "QuickBooks", - "dockerRepository": "airbyte/source-quickbooks-singer", - "dockerImageTag": "0.1.5", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/quickbooks-singer", - "icon": " qb-logoCreated with Sketch. ", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "45d2e135-2ede-49e1-939f-3e3ec357a65e", - "name": "Recharge", - "dockerRepository": "airbyte/source-recharge", - "dockerImageTag": "0.2.4", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/recharge", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "cd42861b-01fc-4658-a8ab-5d11d0510f01", - "name": "Recurly", - "dockerRepository": "airbyte/source-recurly", - "dockerImageTag": "0.4.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/recurly", - "icon": "\nimage/svg+xml\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "e87ffa8e-a3b5-f69c-9076-6011339de1f6", - "name": "Redshift", - "dockerRepository": "airbyte/source-redshift", - "dockerImageTag": "0.3.14", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/redshift", - "icon": "", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "db04ecd1-42e7-4115-9cec-95812905c626", - "name": "Retently", - "dockerRepository": "airbyte/source-retently", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/retently", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d78e5de0-aa44-4744-aa4f-74c818ccfe19", - "name": "RKI Covid", - "dockerRepository": "airbyte/source-rki-covid", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/rki-covid", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "69589781-7828-43c5-9f63-8925b1c1ccc2", - "name": "S3", - "dockerRepository": "airbyte/source-s3", - "dockerImageTag": "0.1.24", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/s3", - "icon": "\n\n Icon-Resource/Storage/Res_Amazon-Simple-Storage_Service-Standard_48_Light\n \n \n \n\n", - "releaseStage": "generally_available", - "sourceType": "file" - }, - { - "sourceDefinitionId": "41991d12-d4b5-439e-afd0-260a31d4c53f", - "name": "SalesLoft", - "dockerRepository": "airbyte/source-salesloft", - "dockerImageTag": "0.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/salesloft", - "icon": "\n\n \n \n \n image/svg+xml\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b117307c-14b6-41aa-9422-947e34922962", - "name": "Salesforce", - "dockerRepository": "airbyte/source-salesforce", - "dockerImageTag": "1.0.22", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/salesforce", - "icon": "\n\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "8d7ef552-2c0f-11ec-8d3d-0242ac130003", - "name": "SearchMetrics", - "dockerRepository": "airbyte/source-search-metrics", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/search-metrics", - "icon": "\n\n\n\nCreated by potrace 1.16, written by Peter Selinger 2001-2019\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "fbb5fbe2-16ad-4cf4-af7d-ff9d9c316c87", - "name": "Sendgrid", - "dockerRepository": "airbyte/source-sendgrid", - "dockerImageTag": "0.2.15", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/sendgrid", - "icon": "\nimage/svg+xml\n", - "releaseStage": "beta", - "sourceType": "api" - }, - { - "sourceDefinitionId": "9da77001-af33-4bcd-be46-6252bf9342b9", - "name": "Shopify", - "dockerRepository": "airbyte/source-shopify", - "dockerImageTag": "0.1.39", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/shopify", - "icon": "\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "2fed2292-5586-480c-af92-9944e39fe12d", - "name": "Short.io", - "dockerRepository": "airbyte/source-shortio", - "dockerImageTag": "0.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/shortio", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "c2281cee-86f9-4a86-bb48-d23286b4c7bd", - "name": "Slack", - "dockerRepository": "airbyte/source-slack", - "dockerImageTag": "0.1.18", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/slack", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "374ebc65-6636-4ea0-925c-7d35999a8ffc", - "name": "Smartsheets", - "dockerRepository": "airbyte/source-smartsheets", - "dockerImageTag": "0.1.12", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/smartsheets", - "icon": "", - "releaseStage": "beta", - "sourceType": "api" - }, - { - "sourceDefinitionId": "200330b2-ea62-4d11-ac6d-cfe3e3f8ab2b", - "name": "Snapchat Marketing", - "dockerRepository": "airbyte/source-snapchat-marketing", - "dockerImageTag": "0.1.8", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/snapchat-marketing", - "icon": "\n\n\n\n \n \n \n \n \n image/svg+xml\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\t\n\t\t\n\n\t\n\n\t\n\n\n \n \n\t.st0{fill:#FFFFFF;}\n\n\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "e2d65910-8c8b-40a1-ae7d-ee2416b2bfa2", - "name": "Snowflake", - "dockerRepository": "airbyte/source-snowflake", - "dockerImageTag": "0.1.24", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/snowflake", - "icon": "\n\n \n Group\n Created with Sketch.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "77225a51-cd15-4a13-af02-65816bd0ecf4", - "name": "Square", - "dockerRepository": "airbyte/source-square", - "dockerImageTag": "0.1.4", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/square", - "icon": "\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "7a4327c4-315a-11ec-8d3d-0242ac130003", - "name": "Strava", - "dockerRepository": "airbyte/source-strava", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/strava", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "e094cb9a-26de-4645-8761-65c0c425d1de", - "name": "Stripe", - "dockerRepository": "airbyte/source-stripe", - "dockerImageTag": "0.1.39", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/stripe", - "icon": "Asset 32Stone Hub", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "badc5925-0485-42be-8caa-b34096cb71b5", - "name": "SurveyMonkey", - "dockerRepository": "airbyte/source-surveymonkey", - "dockerImageTag": "0.1.11", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/surveymonkey", - "icon": "Horizontal_Sabaeus_RGB", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "f00d2cf4-3c28-499a-ba93-b50b6f26359e", - "name": "TalkDesk Explore", - "dockerRepository": "airbyte/source-talkdesk-explore", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/talkdesk-explore", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "d1aa448b-7c54-498e-ad95-263cbebcd2db", - "name": "Tempo", - "dockerRepository": "airbyte/source-tempo", - "dockerImageTag": "0.2.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/tempo", - "icon": "\n\n\n \n \n \n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "0dad1a35-ccf8-4d03-b73e-6788c00b13ae", - "name": "TiDB", - "dockerRepository": "airbyte/source-tidb", - "dockerImageTag": "0.2.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/tidb", - "icon": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "4bfac00d-ce15-44ff-95b9-9e3c3e8fbd35", - "name": "TikTok Marketing", - "dockerRepository": "airbyte/source-tiktok-marketing", - "dockerImageTag": "0.1.17", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/tiktok-marketing", - "icon": "\n\n \n 编组\n Created with Sketch.\n \n \n \n \n \n \n \n \n \n \n \n \n \n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "bc617b5f-1b9e-4a2d-bebe-782fd454a771", - "name": "Timely", - "dockerRepository": "airbyte/source-timely", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/timely", - "icon": "\n\n\n\n\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "8da67652-004c-11ec-9a03-0242ac130003", - "name": "Trello", - "dockerRepository": "airbyte/source-trello", - "dockerImageTag": "0.1.6", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/trello", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "b9dc6155-672e-42ea-b10d-9f1f1fb95ab1", - "name": "Twilio", - "dockerRepository": "airbyte/source-twilio", - "dockerImageTag": "0.1.12", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/twilio", - "icon": "\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "e7eff203-90bf-43e5-a240-19ea3056c474", - "name": "Typeform", - "dockerRepository": "airbyte/source-typeform", - "dockerImageTag": "0.1.9", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/typeform", - "icon": "\n \n \n \n \n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "c4cfaeda-c757-489a-8aba-859fb08b6970", - "name": "US Census", - "dockerRepository": "airbyte/source-us-census", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/us-census", - "icon": "\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\r\n\r\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "afa734e4-3571-11ec-991a-1e0031268139", - "name": "YouTube Analytics", - "dockerRepository": "airbyte/source-youtube-analytics", - "dockerImageTag": "0.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/youtube-analytics", - "icon": "", - "releaseStage": "beta", - "sourceType": "api" - }, - { - "sourceDefinitionId": "7e20ce3e-d820-4327-ad7a-88f3927fd97a", - "name": "VictorOps", - "dockerRepository": "farosai/airbyte-victorops-source", - "dockerImageTag": "0.1.23", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/victorops", - "icon": "\n\n\t\n\t\t\n\t\t\n\t\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "ef580275-d9a9-48bb-af5e-db0f5855be04", - "name": "Webflow", - "dockerRepository": "airbyte/source-webflow", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/webflow", - "icon": "", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "2a2552ca-9f78-4c1c-9eb7-4d0dc66d72df", - "name": "WooCommerce", - "dockerRepository": "airbyte/source-woocommerce", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/woocommerce", - "icon": "\n\n \n \n \n image/svg+xml\n \n \n \n \n \n \n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "9c13f986-a13b-4988-b808-4705badf71c2", - "name": "Wrike", - "dockerRepository": "airbyte/source-wrike", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/wrike", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "40d24d0f-b8f9-4fe0-9e6c-b06c0f3f45e4", - "name": "Zendesk Chat", - "dockerRepository": "airbyte/source-zendesk-chat", - "dockerImageTag": "0.1.11", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zendesk-chat", - "icon": "\nimage/svg+xml\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "325e0640-e7b3-4e24-b823-3361008f603f", - "name": "Zendesk Sunshine", - "dockerRepository": "airbyte/source-zendesk-sunshine", - "dockerImageTag": "0.1.1", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zendesk-sunshine", - "icon": "\nimage/svg+xml\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "79c1aa37-dae3-42ae-b333-d1c105477715", - "name": "Zendesk Support", - "dockerRepository": "airbyte/source-zendesk-support", - "dockerImageTag": "0.2.16", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zendesk-support", - "icon": "\nimage/svg+xml\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "c8630570-086d-4a40-99ae-ea5b18673071", - "name": "Zendesk Talk", - "dockerRepository": "airbyte/source-zendesk-talk", - "dockerImageTag": "0.1.5", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zendesk-talk", - "icon": "\nimage/svg+xml\n", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "8baba53d-2fe3-4e33-bc85-210d0eb62884", - "name": "Zenefits", - "dockerRepository": "airbyte/source-zenefits", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zenefits", - "icon": "\n\n\n\n\n\n\n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "f1e4c7f6-db5c-4035-981f-d35ab4998794", - "name": "Zenloop", - "dockerRepository": "airbyte/source-zenloop", - "dockerImageTag": "0.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zenloop", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "cdaf146a-9b75-49fd-9dd2-9d64a0bb4781", - "name": "Sentry", - "dockerRepository": "airbyte/source-sentry", - "dockerImageTag": "0.1.7", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/sentry", - "icon": "", - "releaseStage": "generally_available", - "sourceType": "api" - }, - { - "sourceDefinitionId": "aea2fd0d-377d-465e-86c0-4fdc4f688e51", - "name": "Zoom", - "dockerRepository": "airbyte/source-zoom-singer", - "dockerImageTag": "0.2.4", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zoom", - "icon": "\n\n \n \n \n image/svg+xml\n \n \n \n \n \n \n \n \n\n", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "3dc3037c-5ce8-4661-adc2-f7a9e3c5ece5", - "name": "Zuora", - "dockerRepository": "airbyte/source-zuora", - "dockerImageTag": "0.1.3", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zuora", - "icon": "\n\n\nimage/svg+xml", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "cd06e646-31bf-4dc8-af48-cbc6530fcad3", - "name": "Kustomer", - "dockerRepository": "airbyte/source-kustomer-singer", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/kustomer", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "4942d392-c7b5-4271-91f9-3b4f4e51eb3e", - "name": "ZohoCRM", - "dockerRepository": "airbyte/source-zoho-crm", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/zoho-crm", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "a827c52e-791c-4135-a245-e233c5255199", - "name": "SFTP", - "dockerRepository": "airbyte/source-sftp", - "dockerImageTag": "0.1.2", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/sftp", - "releaseStage": "alpha", - "sourceType": "file" - }, - { - "sourceDefinitionId": "6f2ac653-8623-43c4-8950-19218c7caf3d", - "name": "Firebolt", - "dockerRepository": "airbyte/source-firebolt", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/firebolt", - "releaseStage": "alpha", - "sourceType": "database" - }, - { - "sourceDefinitionId": "7cf88806-25f5-4e1a-b422-b2fa9e1b0090", - "name": "Elasticsearch", - "dockerRepository": "airbyte/source-elasticsearch", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/elasticsearch", - "releaseStage": "alpha", - "sourceType": "api" - }, - { - "sourceDefinitionId": "7865dce4-2211-4f6a-88e5-9d0fe161afe7", - "name": "Yandex Metrica", - "dockerRepository": "airbyte/source-yandex-metrica", - "dockerImageTag": "0.1.0", - "documentationUrl": "https://docs.airbyte.com/integrations/sources/yandex-metrica", - "releaseStage": "alpha", - "sourceType": "api" - } - ] -} diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/useGetSourceDefinitions.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/useGetSourceDefinitions.tsx deleted file mode 100644 index 81f43ae1b8978..0000000000000 --- a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/useGetSourceDefinitions.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useQuery } from "react-query"; - -import { getExcludedConnectorIds } from "core/domain/connector/constants"; -import { DestinationDefinitionRead, SourceDefinitionRead } from "core/request/AirbyteClient"; - -import availableSourceDefinitions from "./sourceDefinitions.json"; - -interface Catalog { - destinations: DestinationDefinitionRead[]; - sources: SourceDefinitionRead[]; -} -const fetchCatalog = async (): Promise => { - const path = "https://storage.googleapis.com/prod-airbyte-cloud-connector-metadata-service/cloud_catalog.json"; - const response = await fetch(path); - return response.json(); -}; - -export const useGetSourceDefinitions = () => { - return useQuery("cloud_catalog", fetchCatalog, { - select: (data) => { - const excludedConnectorIds = getExcludedConnectorIds(); - return data.sources - .filter((source) => !excludedConnectorIds.includes(source.sourceDefinitionId)) - .map((source) => { - const icon = availableSourceDefinitions.sourceDefinitions.find( - (src) => src.sourceDefinitionId === source.sourceDefinitionId - )?.icon; - return { - ...source, - icon, - }; - }); - }, - }); -}; diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/utils.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/utils.tsx deleted file mode 100644 index 0265a6a4ddce8..0000000000000 --- a/airbyte-webapp/src/packages/cloud/components/experiments/SignupSourceDropdown/utils.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { ConnectorIcon } from "components/common/ConnectorIcon"; - -import { Connector } from "core/domain/connector"; -import { ReleaseStage, SourceDefinitionRead } from "core/request/AirbyteClient"; -import { naturalComparator } from "utils/objects"; - -/** - * Returns the order for a specific release stage label. This will define - * in what order the different release stages are shown inside the select. - * They will be shown in an increasing order (i.e. 0 on top) - */ -const getOrderForReleaseStage = (stage?: ReleaseStage): number => { - switch (stage) { - case ReleaseStage.beta: - return 1; - case ReleaseStage.alpha: - return 2; - default: - return 0; - } -}; -interface ServiceDropdownOption { - label: string; - value: string; - img: JSX.Element; - releaseStage: ReleaseStage | undefined; -} -const transformConnectorDefinitionToDropdownOption = (item: SourceDefinitionRead): ServiceDropdownOption => ({ - label: item.name, - value: Connector.id(item), - img: , - releaseStage: item.releaseStage, -}); - -const sortByReleaseStage = (a: ServiceDropdownOption, b: ServiceDropdownOption) => { - if (a.releaseStage !== b.releaseStage) { - return getOrderForReleaseStage(a.releaseStage) - getOrderForReleaseStage(b.releaseStage); - } - return naturalComparator(a.label, b.label); -}; - -export const getSortedDropdownData = (availableConnectorDefinitions: SourceDefinitionRead[]): ServiceDropdownOption[] => - availableConnectorDefinitions.map(transformConnectorDefinitionToDropdownOption).sort(sortByReleaseStage); diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/constants.ts b/airbyte-webapp/src/packages/cloud/components/experiments/constants.ts deleted file mode 100644 index b57ce9d03ec84..0000000000000 --- a/airbyte-webapp/src/packages/cloud/components/experiments/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const EXP_SOURCE_SIGNUP_SELECTOR = "exp-signup-selected-source-definition-id"; diff --git a/airbyte-webapp/src/packages/cloud/locales/en.json b/airbyte-webapp/src/packages/cloud/locales/en.json index 735212e95f262..9613710f325b6 100644 --- a/airbyte-webapp/src/packages/cloud/locales/en.json +++ b/airbyte-webapp/src/packages/cloud/locales/en.json @@ -41,7 +41,6 @@ "login.oauth.github": "Continue with GitHub", "login.oauth.differentCredentialsError": "Use your email and password to sign in.", "login.oauth.unknownError": "An unknown error happened during sign in: {error}", - "login.sourceSelector": "Select a source to get started", "confirmResetPassword.newPassword": "Enter a new password", "confirmResetPassword.success": "Your password has been reset. Please log in with the new password.", diff --git a/airbyte-webapp/src/packages/cloud/views/DefaultView.tsx b/airbyte-webapp/src/packages/cloud/views/DefaultView.tsx index bf48f1fa9ab98..86a5e63509e5a 100644 --- a/airbyte-webapp/src/packages/cloud/views/DefaultView.tsx +++ b/airbyte-webapp/src/packages/cloud/views/DefaultView.tsx @@ -1,22 +1,12 @@ -import { useEffect } from "react"; import { Navigate } from "react-router-dom"; -import { useExperiment } from "hooks/services/Experiment"; - import { RoutePaths } from "../../../pages/routePaths"; import { CloudRoutes } from "../cloudRoutePaths"; -import { EXP_SOURCE_SIGNUP_SELECTOR } from "../components/experiments/constants"; import { useListCloudWorkspaces } from "../services/workspaces/CloudWorkspacesService"; export const DefaultView: React.FC = () => { const workspaces = useListCloudWorkspaces(); - // exp-signup-selected-source-definition - const isSignupSourceSelectorExperiment = useExperiment("authPage.signup.sourceSelector", false); - const sourceDefinitionId = localStorage.getItem(EXP_SOURCE_SIGNUP_SELECTOR); - useEffect(() => { - localStorage.removeItem(EXP_SOURCE_SIGNUP_SELECTOR); - }, []); // Only show the workspace creation list if there is more than one workspace // otherwise redirect to the single workspace return ( @@ -27,12 +17,6 @@ export const DefaultView: React.FC = () => { : `/${RoutePaths.Workspaces}/${workspaces[0].workspaceId}` } replace - // exp-signup-selected-source-definition - {...(isSignupSourceSelectorExperiment && - sourceDefinitionId && { - state: { sourceDefinitionId }, - to: `/${RoutePaths.Workspaces}/${workspaces[0].workspaceId}/${RoutePaths.Connections}/${RoutePaths.ConnectionNew}`, - })} /> ); }; diff --git a/airbyte-webapp/src/packages/cloud/views/auth/SignupPage/components/SignupForm.tsx b/airbyte-webapp/src/packages/cloud/views/auth/SignupPage/components/SignupForm.tsx index 1445bd7999e93..3078009e344dc 100644 --- a/airbyte-webapp/src/packages/cloud/views/auth/SignupPage/components/SignupForm.tsx +++ b/airbyte-webapp/src/packages/cloud/views/auth/SignupPage/components/SignupForm.tsx @@ -9,7 +9,6 @@ import { LabeledInput, Link } from "components"; import { Button } from "components/ui/Button"; import { useExperiment } from "hooks/services/Experiment"; -import { SignupSourceDropdown } from "packages/cloud/components/experiments/SignupSourceDropdown"; import { FieldError } from "packages/cloud/lib/errors/FieldError"; import { useAuthService } from "packages/cloud/services/auth/AuthService"; import { isGdprCountry } from "utils/dataPrivacy"; @@ -172,7 +171,6 @@ export const SignupForm: React.FC = () => { const showName = !useExperiment("authPage.signup.hideName", false); const showCompanyName = !useExperiment("authPage.signup.hideCompanyName", false); - const showSourceSelector = useExperiment("authPage.signup.sourceSelector", false); const validationSchema = useMemo(() => { const shape = { @@ -216,7 +214,7 @@ export const SignupForm: React.FC = () => { validateOnBlur validateOnChange > - {({ isValid, isSubmitting, status, values }) => ( + {({ isValid, isSubmitting, status }) => ( {(showName || showCompanyName) && ( @@ -224,13 +222,6 @@ export const SignupForm: React.FC = () => { {showCompanyName && } )} - - {/* exp-select-source-signup */} - {showSourceSelector && ( - - - - )} diff --git a/airbyte-webapp/src/pages/connections/CreateConnectionPage/CreateConnectionPage.tsx b/airbyte-webapp/src/pages/connections/CreateConnectionPage/CreateConnectionPage.tsx index eb17fae00aaf8..15f44721f8e65 100644 --- a/airbyte-webapp/src/pages/connections/CreateConnectionPage/CreateConnectionPage.tsx +++ b/airbyte-webapp/src/pages/connections/CreateConnectionPage/CreateConnectionPage.tsx @@ -21,7 +21,6 @@ import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics"; import { useFormChangeTrackerService } from "hooks/services/FormChangeTracker"; import { useGetDestination } from "hooks/services/useDestinationHook"; import { useGetSource } from "hooks/services/useSourceHook"; -import { useLocationState } from "hooks/useLocationState"; import { useDestinationDefinition } from "services/connector/DestinationDefinitionService"; import { useSourceDefinition } from "services/connector/SourceDefinitionService"; import { ConnectorDocumentationWrapper } from "views/Connector/ConnectorDocumentationLayout"; @@ -77,10 +76,6 @@ export const CreateConnectionPage: React.FC = () => { const location = useLocation(); const { formatMessage } = useIntl(); - // exp-signup-selected-source-definition - const state = useLocationState<{ sourceDefinitionId?: string }>(); - const isSourceDefinitionSelected = Boolean(state?.sourceDefinitionId); - const navigate = useNavigate(); const { clearAllFormChanges } = useFormChangeTrackerService(); @@ -137,8 +132,7 @@ export const CreateConnectionPage: React.FC = () => { if (currentEntityStep === EntityStepsTypes.SOURCE) { return ( <> - {/* // exp-signup-selected-source-definition */} - {type === EntityStepsTypes.CONNECTION && !isSourceDefinitionSelected && ( + {type === EntityStepsTypes.CONNECTION && ( )} Date: Wed, 25 Jan 2023 15:32:55 +0100 Subject: [PATCH 078/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=8E=89=20Add=20col?= =?UTF-8?q?umn=20selection=20UI=20to=20new=20stream=20table=20(#21058)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add column selection UI to new stream table * disable experiment by default * add option to toggle all selected fields * fix header styling * fix missing dependencies * fix checkbox warnings * add ability to select/deselect all, ignoring pk and cursor * typo in merge * refactor method for single field toggle, add tests * test that cursor & pk are selected when toggling all fields * support source defined pk & cursor * disable field selection checkboxes in readonly mode * omit selectedFields if field selection disabled * disable deselection of parent field when child is part of pk or is cursor * fix disabling checkboxes in readonly mode * missing dependency --- .../connection/CatalogTree/CatalogSection.tsx | 70 ++-- .../CatalogTree/CatalogTreeBody.tsx | 5 + .../StreamDetailsPanel/StreamDetailsPanel.tsx | 6 + .../StreamFieldsTable.module.scss | 5 + .../StreamFieldsTable.test.tsx | 126 ++++++++ .../StreamFieldsTable/StreamFieldsTable.tsx | 110 ++++++- .../SyncFieldCell/SyncFieldCell.tsx | 77 +++++ .../StreamFieldsTable/SyncFieldCell/index.ts | 1 + .../streamConfigHelpers.test.ts | 303 +++++++++++++----- .../streamConfigHelpers.ts | 82 ++++- .../mockAirbyteStreamConfiguration.ts | 9 + 11 files changed, 651 insertions(+), 143 deletions(-) create mode 100644 airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.test.tsx create mode 100644 airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/SyncFieldCell/SyncFieldCell.tsx create mode 100644 airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/SyncFieldCell/index.ts create mode 100644 airbyte-webapp/src/test-utils/mock-data/mockAirbyteStreamConfiguration.ts diff --git a/airbyte-webapp/src/components/connection/CatalogTree/CatalogSection.tsx b/airbyte-webapp/src/components/connection/CatalogTree/CatalogSection.tsx index b1f5fb973048e..8c6e3ecf0ef31 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/CatalogSection.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/CatalogSection.tsx @@ -1,5 +1,4 @@ import { FormikErrors, getIn } from "formik"; -import isEqual from "lodash/isEqual"; import React, { memo, useCallback, useMemo } from "react"; import { useToggle } from "react-use"; @@ -13,7 +12,6 @@ import { DestinationSyncMode, NamespaceDefinitionType, SyncMode, - SelectedFieldInfo, } from "core/request/AirbyteClient"; import { useDestinationNamespace } from "hooks/connection/useDestinationNamespace"; import { useNewTableDesignExperiment } from "hooks/connection/useNewTableDesignExperiment"; @@ -27,6 +25,8 @@ import { updatePrimaryKey, toggleFieldInPrimaryKey, updateCursorField, + updateFieldSelected, + toggleAllFieldsSelected, } from "./streamConfigHelpers/streamConfigHelpers"; import { StreamFieldTable } from "./StreamFieldTable"; import { StreamHeader } from "./StreamHeader"; @@ -51,8 +51,14 @@ const CatalogSectionInner: React.FC = ({ errors, changedSelected, }) => { + const { stream, config } = streamNode; const isNewTableDesignEnabled = useNewTableDesignExperiment(); + const fields = useMemo(() => { + const traversedFields = traverseSchemaToField(stream?.jsonSchema, stream?.name); + return traversedFields.sort(naturalComparatorBy((field) => field.cleanedName)); + }, [stream?.jsonSchema, stream?.name]); + const numberOfFieldsInStream = Object.keys(streamNode?.stream?.jsonSchema?.properties).length ?? 0; const { @@ -61,7 +67,6 @@ const CatalogSectionInner: React.FC = ({ const { mode } = useConnectionFormService(); const [isRowExpanded, onExpand] = useToggle(false); - const { stream, config } = streamNode; const updateStreamWithConfig = useCallback( (config: Partial) => updateStream(streamNode.id, config), @@ -86,9 +91,7 @@ const CatalogSectionInner: React.FC = ({ if (!config) { return; } - const updatedConfig = toggleFieldInPrimaryKey(config, pkPath, numberOfFieldsInStream); - updateStreamWithConfig(updatedConfig); }, [config, updateStreamWithConfig, numberOfFieldsInStream] @@ -99,9 +102,7 @@ const CatalogSectionInner: React.FC = ({ if (!config) { return; } - const updatedConfig = updateCursorField(config, cursorField, numberOfFieldsInStream); - updateStreamWithConfig(updatedConfig); }, [config, numberOfFieldsInStream, updateStreamWithConfig] @@ -112,43 +113,30 @@ const CatalogSectionInner: React.FC = ({ if (!config) { return; } - const updatedConfig = updatePrimaryKey(config, newPrimaryKey, numberOfFieldsInStream); - updateStreamWithConfig(updatedConfig); }, [config, updateStreamWithConfig, numberOfFieldsInStream] ); - const onToggleFieldSelected = (fieldPath: string[], isSelected: boolean) => { - const previouslySelectedFields = config?.selectedFields || []; - - if (!config?.fieldSelectionEnabled && !isSelected) { - // All fields in a stream are implicitly selected. When deselecting the first one, we also need to explicitly select the rest. - const allOtherFields = fields.filter((field: SyncSchemaField) => !isEqual(field.path, fieldPath)) ?? []; - const selectedFields: SelectedFieldInfo[] = allOtherFields.map((field) => ({ fieldPath: field.path })); - updateStreamWithConfig({ - selectedFields, - fieldSelectionEnabled: true, - }); - } else if (isSelected && previouslySelectedFields.length === numberOfFieldsInStream - 1) { - // In this case we are selecting the only unselected field - updateStreamWithConfig({ - selectedFields: [], - fieldSelectionEnabled: false, - }); - } else if (isSelected) { - updateStreamWithConfig({ - selectedFields: [...previouslySelectedFields, { fieldPath }], - fieldSelectionEnabled: true, - }); - } else { - updateStreamWithConfig({ - selectedFields: previouslySelectedFields.filter((f) => !isEqual(f.fieldPath, fieldPath)) || [], - fieldSelectionEnabled: true, - }); + const onToggleAllFieldsSelected = useCallback(() => { + if (!config) { + return; } - }; + const updatedConfig = toggleAllFieldsSelected(config); + updateStreamWithConfig(updatedConfig); + }, [config, updateStreamWithConfig]); + + const onToggleFieldSelected = useCallback( + (fieldPath: string[], isSelected: boolean) => { + if (!config) { + return; + } + const updatedConfig = updateFieldSelected({ config, fields, fieldPath, isSelected, numberOfFieldsInStream }); + updateStreamWithConfig(updatedConfig); + }, + [config, fields, numberOfFieldsInStream, updateStreamWithConfig] + ); const pkRequired = config?.destinationSyncMode === DestinationSyncMode.append_dedup; const cursorRequired = config?.syncMode === SyncMode.incremental; @@ -172,12 +160,6 @@ const CatalogSectionInner: React.FC = ({ namespaceFormat, }) ?? ""; - const fields = useMemo(() => { - const traversedFields = traverseSchemaToField(stream?.jsonSchema, stream?.name); - - return traversedFields.sort(naturalComparatorBy((field) => field.cleanedName)); - }, [stream?.jsonSchema, stream?.name]); - const flattenedFields = useMemo(() => flatten(fields), [fields]); const primitiveFields = useMemo( @@ -231,11 +213,13 @@ const CatalogSectionInner: React.FC = ({ onCursorSelect={onCursorSelect} onPkSelect={onPkSelect} onSelectedChange={onSelectStream} + handleFieldToggle={onToggleFieldSelected} shouldDefinePk={shouldDefinePk} shouldDefineCursor={shouldDefineCursor} isCursorDefinitionSupported={cursorRequired} isPKDefinitionSupported={pkRequired} stream={stream} + toggleAllFieldsSelected={onToggleAllFieldsSelected} /> ) : (
    diff --git a/airbyte-webapp/src/components/connection/CatalogTree/CatalogTreeBody.tsx b/airbyte-webapp/src/components/connection/CatalogTree/CatalogTreeBody.tsx index da13166480e97..c02d1e5c6a380 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/CatalogTreeBody.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/CatalogTreeBody.tsx @@ -33,6 +33,11 @@ export const CatalogTreeBody: React.FC = ({ streams, chang if (streamNode) { const newStreamNode = setIn(streamNode, "config", { ...streamNode.config, ...newConfig }); + // config.selectedFields must be removed if fieldSelection is disabled + if (!newStreamNode.config.fieldSelectionEnabled) { + delete newStreamNode.config.selectedFields; + } + onStreamChanged(newStreamNode); } }, diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.tsx index fb0ed0625471b..6785c085b66a3 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.tsx @@ -14,12 +14,15 @@ interface StreamDetailsPanelProps extends StreamFieldsTableProps { onClose: () => void; onSelectedChange: () => void; stream?: AirbyteStream; + handleFieldToggle: (fieldPath: string[], isSelected: boolean) => void; + toggleAllFieldsSelected: () => void; } export const StreamDetailsPanel: React.FC = ({ stream, config, disabled, + handleFieldToggle, onPkSelect, onCursorSelect, onClose, @@ -29,6 +32,7 @@ export const StreamDetailsPanel: React.FC = ({ isCursorDefinitionSupported, isPKDefinitionSupported, syncSchemaFields, + toggleAllFieldsSelected, }) => { return ( @@ -45,12 +49,14 @@ export const StreamDetailsPanel: React.FC = ({
    diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss index 67c68c04a842b..8879f4bf39144 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss @@ -38,6 +38,11 @@ $cell-left-padding: variables.$spacing-xl + variables.$spacing-sm; line-height: 15px; text-transform: capitalize; + &--syncCell { + width: 0; /** Collapses the th to the exact size of its content **/ + padding-right: variables.$spacing-lg; + } + &:first-child { padding-left: $cell-left-padding; border-radius: 0; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.test.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.test.tsx new file mode 100644 index 0000000000000..c5de78fee89f1 --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.test.tsx @@ -0,0 +1,126 @@ +import { mockStreamConfiguration } from "test-utils/mock-data/mockAirbyteStreamConfiguration"; + +import { AirbyteStreamConfiguration } from "core/request/AirbyteClient"; + +import { isChildFieldCursor, isChildFieldPrimaryKey, isCursor, isPrimaryKey } from "./StreamFieldsTable"; + +const mockIncrementalConfig: AirbyteStreamConfiguration = { + ...mockStreamConfiguration, + syncMode: "incremental", +}; + +const mockIncrementalDedupConfig: AirbyteStreamConfiguration = { + ...mockStreamConfiguration, + syncMode: "incremental", + destinationSyncMode: "append_dedup", +}; + +describe(`${isCursor.name}`, () => { + it("returns true if the path matches the cursor", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalConfig, + cursorField: ["my_cursor"], + }; + expect(isCursor(config, ["my_cursor"])).toBe(true); + }); + + it("returns false if there is no cursor", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalConfig, + cursorField: undefined, + }; + expect(isCursor(config, ["my_cursor"])).toBe(false); + }); + + it("returns false if the path does not match the cursor", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalConfig, + cursorField: ["my_cursor"], + }; + expect(isCursor(config, ["some_other_field"])).toBe(false); + }); +}); + +describe(`${isChildFieldCursor.name}`, () => { + it("returns true if the path is the parent of the cursor", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalConfig, + cursorField: ["my_cursor", "nested_field"], + }; + expect(isChildFieldCursor(config, ["my_cursor"])).toBe(true); + }); + + it("returns false if there is no cursor", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalConfig, + cursorField: undefined, + }; + expect(isChildFieldCursor(config, ["my_cursor"])).toBe(false); + }); + + it("returns false if the path does not match the cursor", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalConfig, + cursorField: ["my_cursor", "nested_field"], + }; + expect(isChildFieldCursor(config, ["some_other_field"])).toBe(false); + }); +}); + +describe(`${isPrimaryKey.name}`, () => { + it("returns true if the path matches any part of the primary key", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalDedupConfig, + primaryKey: [["some_other_pk"], ["my_pk"]], + }; + expect(isPrimaryKey(config, ["my_pk"])).toBe(true); + }); + + it("returns false if there is no primary key", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalDedupConfig, + primaryKey: undefined, + }; + expect(isPrimaryKey(config, ["my_pk"])).toBe(false); + }); + + it("returns false if the path does not match any part of the primary key", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalDedupConfig, + primaryKey: [["some_other_pk"], ["my_pk"]], + }; + expect(isPrimaryKey(config, ["unrelated_field"])).toBe(false); + }); +}); + +describe(`${isChildFieldPrimaryKey.name}`, () => { + it("returns true if the path is the parent of any part of the primary key", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalDedupConfig, + primaryKey: [ + ["some_other_pk", "nested_field"], + ["my_pk", "nested_field"], + ], + }; + expect(isChildFieldPrimaryKey(config, ["my_pk"])).toBe(true); + }); + + it("returns false if there is no primary key", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalDedupConfig, + primaryKey: undefined, + }; + expect(isChildFieldPrimaryKey(config, ["my_pk"])).toBe(false); + }); + + it("returns false if the path is not the parent of any part of the primary key", () => { + const config: AirbyteStreamConfiguration = { + ...mockIncrementalDedupConfig, + primaryKey: [ + ["some_other_pk", "nested_field"], + ["my_pk", "nested_field"], + ], + }; + expect(isChildFieldPrimaryKey(config, ["unrelated_field"])).toBe(false); + }); +}); diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx index 54bf980f0d4ac..4860f0e97e4d3 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx @@ -1,23 +1,30 @@ import { createColumnHelper } from "@tanstack/react-table"; -import React, { useMemo } from "react"; +import classNames from "classnames"; +import isEqual from "lodash/isEqual"; +import React, { useCallback, useMemo } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { pathDisplayName } from "components/connection/CatalogTree/PathPopout"; import { ArrowRightIcon } from "components/icons/ArrowRightIcon"; +import { CheckBox } from "components/ui/CheckBox"; +import { FlexContainer } from "components/ui/Flex"; import { NextTable } from "components/ui/NextTable"; import { SyncSchemaField, SyncSchemaFieldObject } from "core/domain/catalog"; import { AirbyteStreamConfiguration } from "core/request/AirbyteClient"; import { useConnectionFormService } from "hooks/services/ConnectionForm/ConnectionFormService"; -import { equal } from "utils/objects"; +import { useExperiment } from "hooks/services/Experiment"; import { getDataType } from "utils/useTranslateDataType"; import { ConnectorHeaderGroupIcon } from "./ConnectorHeaderGroupIcon"; import { CursorCell } from "./CursorCell"; import { PKCell } from "./PKCell"; import styles from "./StreamFieldsTable.module.scss"; +import { SyncFieldCell } from "./SyncFieldCell"; export interface TableStream { + field: SyncSchemaField; + isFieldSelected: boolean; path: string[]; dataType: string; cursorDefined?: boolean; @@ -26,6 +33,7 @@ export interface TableStream { export interface StreamFieldsTableProps { config?: AirbyteStreamConfiguration; + handleFieldToggle: (fieldPath: string[], isSelected: boolean) => void; onCursorSelect: (cursorPath: string[]) => void; onPkSelect: (pkPath: string[]) => void; shouldDefinePk: boolean; @@ -33,10 +41,28 @@ export interface StreamFieldsTableProps { isCursorDefinitionSupported: boolean; isPKDefinitionSupported: boolean; syncSchemaFields: SyncSchemaField[]; + toggleAllFieldsSelected: () => void; +} + +export function isCursor(config: AirbyteStreamConfiguration | undefined, path: string[]): boolean { + return config ? isEqual(config?.cursorField, path) : false; +} + +export function isChildFieldCursor(config: AirbyteStreamConfiguration | undefined, path: string[]): boolean { + return config?.cursorField ? isEqual([config.cursorField[0]], path) : false; +} + +export function isPrimaryKey(config: AirbyteStreamConfiguration | undefined, path: string[]): boolean { + return !!config?.primaryKey?.some((p) => isEqual(p, path)); +} + +export function isChildFieldPrimaryKey(config: AirbyteStreamConfiguration | undefined, path: string[]): boolean { + return !!config?.primaryKey?.some((p) => isEqual([p[0]], path)); } export const StreamFieldsTable: React.FC = ({ config, + handleFieldToggle, onPkSelect, onCursorSelect, shouldDefineCursor, @@ -44,36 +70,88 @@ export const StreamFieldsTable: React.FC = ({ isCursorDefinitionSupported, isPKDefinitionSupported, syncSchemaFields, + toggleAllFieldsSelected, }) => { const { formatMessage } = useIntl(); + const isColumnSelectionEnabled = useExperiment("connection.columnSelection", false); + const checkIsCursor = useCallback((path: string[]) => isCursor(config, path), [config]); + const checkIsChildFieldCursor = useCallback((path: string[]) => isChildFieldCursor(config, path), [config]); + const checkIsPrimaryKey = useCallback((path: string[]) => isPrimaryKey(config, path), [config]); + const checkIsChildFieldPrimaryKey = useCallback((path: string[]) => isChildFieldPrimaryKey(config, path), [config]); + + const checkIsFieldSelected = useCallback( + (field: SyncSchemaField): boolean => { + // All fields are implicitly selected if field selection is disabled + if (!config?.fieldSelectionEnabled) { + return true; + } - const isCursor = useMemo(() => (path: string[]) => equal(config?.cursorField, path), [config?.cursorField]); - const isPrimaryKey = useMemo( - () => (path: string[]) => !!config?.primaryKey?.some((p) => equal(p, path)), - [config?.primaryKey] + // path[0] is the top-level field name for all nested fields + return !!config?.selectedFields?.find((f) => isEqual(f.fieldPath, [field.path[0]])); + }, + [config] ); // header group icons: const { connection: { source, destination }, + mode, } = useConnectionFormService(); // prepare data for table const tableData: TableStream[] = useMemo( () => syncSchemaFields.map((stream) => ({ + field: stream, + isFieldSelected: checkIsFieldSelected(stream), path: stream.path, dataType: getDataType(stream), cursorDefined: shouldDefineCursor && SyncSchemaFieldObject.isPrimitive(stream), primaryKeyDefined: shouldDefinePk && SyncSchemaFieldObject.isPrimitive(stream), })), - [shouldDefineCursor, shouldDefinePk, syncSchemaFields] + [shouldDefineCursor, shouldDefinePk, syncSchemaFields, checkIsFieldSelected] ); const columnHelper = createColumnHelper(); const sourceColumns = useMemo( () => [ + ...(isColumnSelectionEnabled + ? [ + columnHelper.display({ + id: "sourceSyncField", + header: () => ( + + + + + ), + cell: (props) => ( + + ), + meta: { + thClassName: classNames(styles.headerCell, styles["headerCell--syncCell"]), + tdClassName: styles.textCell, + }, + }), + ] + : []), columnHelper.accessor("path", { id: "sourcePath", header: () => , @@ -99,7 +177,7 @@ export const StreamFieldsTable: React.FC = ({ header: () => , cell: (props) => ( = ({ cell: (props) => ( @@ -130,13 +208,23 @@ export const StreamFieldsTable: React.FC = ({ ], [ columnHelper, + config?.fieldSelectionEnabled, + config?.selectedFields?.length, formatMessage, - isCursor, - isPrimaryKey, + handleFieldToggle, + isColumnSelectionEnabled, + checkIsCursor, + checkIsChildFieldCursor, + checkIsPrimaryKey, + checkIsChildFieldPrimaryKey, isCursorDefinitionSupported, isPKDefinitionSupported, onCursorSelect, onPkSelect, + toggleAllFieldsSelected, + config?.syncMode, + config?.destinationSyncMode, + mode, ] ); diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/SyncFieldCell/SyncFieldCell.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/SyncFieldCell/SyncFieldCell.tsx new file mode 100644 index 0000000000000..f5dc774a3e75d --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/SyncFieldCell/SyncFieldCell.tsx @@ -0,0 +1,77 @@ +import { useCallback } from "react"; +import { FormattedMessage } from "react-intl"; + +import { CheckBox } from "components/ui/CheckBox"; +import { Tooltip } from "components/ui/Tooltip"; + +import { SyncSchemaField, SyncSchemaFieldObject } from "core/domain/catalog"; +import { SyncMode, DestinationSyncMode } from "core/request/AirbyteClient"; +import { useConnectionFormService } from "hooks/services/ConnectionForm/ConnectionFormService"; + +interface SyncFieldCellProps { + field: SyncSchemaField; + checkIsCursor: (path: string[]) => boolean; + checkIsChildFieldCursor: (path: string[]) => boolean; + checkIsPrimaryKey: (path: string[]) => boolean; + checkIsChildFieldPrimaryKey: (path: string[]) => boolean; + isFieldSelected: boolean; + handleFieldToggle: (fieldPath: string[], isSelected: boolean) => void; + syncMode?: SyncMode; + destinationSyncMode?: DestinationSyncMode; +} + +export const SyncFieldCell: React.FC = ({ + checkIsCursor, + checkIsChildFieldCursor, + checkIsPrimaryKey, + checkIsChildFieldPrimaryKey, + isFieldSelected, + field, + handleFieldToggle, + syncMode, + destinationSyncMode, +}) => { + const { mode } = useConnectionFormService(); + const isNestedField = SyncSchemaFieldObject.isNestedField(field); + const isCursor = checkIsCursor(field.path); + const isChildFieldCursor = checkIsChildFieldCursor(field.path); + const isPrimaryKey = checkIsPrimaryKey(field.path); + const isChildFieldPrimaryKey = checkIsChildFieldPrimaryKey(field.path); + const isDisabled = + mode === "readonly" || + (syncMode === SyncMode.incremental && (isCursor || isChildFieldCursor)) || + (destinationSyncMode === DestinationSyncMode.append_dedup && (isPrimaryKey || isChildFieldPrimaryKey)) || + isNestedField; + const showTooltip = isDisabled && mode !== "readonly"; + + const renderDisabledReasonMessage = useCallback(() => { + if (isNestedField) { + return ; + } + if (isPrimaryKey || isChildFieldPrimaryKey) { + return ; + } + if (isCursor || isChildFieldCursor) { + return ; + } + return null; + }, [isCursor, isChildFieldCursor, isPrimaryKey, isChildFieldPrimaryKey, isNestedField, field.path]); + + return ( + <> + {!showTooltip && ( + handleFieldToggle(field.path, !isFieldSelected)} + /> + )} + {showTooltip && ( + }> + {renderDisabledReasonMessage()} + + )} + + ); +}; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/SyncFieldCell/index.ts b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/SyncFieldCell/index.ts new file mode 100644 index 0000000000000..a194c5c4f1abd --- /dev/null +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/SyncFieldCell/index.ts @@ -0,0 +1 @@ +export { SyncFieldCell } from "./SyncFieldCell"; diff --git a/airbyte-webapp/src/components/connection/CatalogTree/streamConfigHelpers/streamConfigHelpers.test.ts b/airbyte-webapp/src/components/connection/CatalogTree/streamConfigHelpers/streamConfigHelpers.test.ts index 8e5065e42e7f6..f4bbf61f98f44 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/streamConfigHelpers/streamConfigHelpers.test.ts +++ b/airbyte-webapp/src/components/connection/CatalogTree/streamConfigHelpers/streamConfigHelpers.test.ts @@ -1,3 +1,6 @@ +import { mockStreamConfiguration } from "test-utils/mock-data/mockAirbyteStreamConfiguration"; + +import { SyncSchemaField } from "core/domain/catalog"; import { AirbyteStreamConfiguration } from "core/request/AirbyteClient"; import { @@ -5,44 +8,58 @@ import { toggleFieldInPrimaryKey, updatePrimaryKey, updateCursorField, + updateFieldSelected, + toggleAllFieldsSelected, } from "./streamConfigHelpers"; -const mockStreamConfiguration: AirbyteStreamConfiguration = { - fieldSelectionEnabled: false, - selectedFields: [], - selected: true, - syncMode: "full_refresh", - destinationSyncMode: "overwrite", +const FIELD_ONE: SyncSchemaField = { + path: ["field_one"], + cleanedName: "field_one", + key: "field_one", + type: "string", +}; +const FIELD_TWO: SyncSchemaField = { + path: ["field_two"], + cleanedName: "field_two", + key: "field_two", + type: "string", +}; +const FIELD_THREE: SyncSchemaField = { + cleanedName: "field_three", + type: "todo", + key: "field_three", + path: ["field_three"], }; -const FIELD_ONE = ["field_one"]; -const FIELD_TWO = ["field_two"]; -const FIELD_THREE = ["field_three"]; +const mockSyncSchemaFields: SyncSchemaField[] = [FIELD_ONE, FIELD_TWO, FIELD_THREE]; describe(`${mergeFieldPathArrays.name}`, () => { it("merges two arrays of fieldPaths without duplicates", () => { - const arr1 = [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }]; - const arr2 = [{ fieldPath: FIELD_TWO }, { fieldPath: FIELD_THREE }]; + const arr1 = [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }]; + const arr2 = [{ fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }]; expect(mergeFieldPathArrays(arr1, arr2)).toEqual([ - { fieldPath: FIELD_ONE }, - { fieldPath: FIELD_TWO }, - { fieldPath: FIELD_THREE }, + { fieldPath: FIELD_ONE.path }, + { fieldPath: FIELD_TWO.path }, + { fieldPath: FIELD_THREE.path }, ]); }); it("merges two arrays of complex fieldPaths without duplicates", () => { - const arr1 = [{ fieldPath: [...FIELD_ONE, ...FIELD_TWO] }, { fieldPath: [...FIELD_TWO, ...FIELD_THREE] }]; + const arr1 = [ + { fieldPath: [...FIELD_ONE.path, ...FIELD_TWO.path] }, + { fieldPath: [...FIELD_TWO.path, ...FIELD_THREE.path] }, + ]; const arr2 = [ - { fieldPath: [...FIELD_ONE, ...FIELD_TWO] }, - { fieldPath: [...FIELD_TWO, ...FIELD_THREE] }, - { fieldPath: [...FIELD_ONE, ...FIELD_THREE] }, + { fieldPath: [...FIELD_ONE.path, ...FIELD_TWO.path] }, + { fieldPath: [...FIELD_TWO.path, ...FIELD_THREE.path] }, + { fieldPath: [...FIELD_ONE.path, ...FIELD_THREE.path] }, ]; expect(mergeFieldPathArrays(arr1, arr2)).toEqual([ - { fieldPath: [...FIELD_ONE, ...FIELD_TWO] }, - { fieldPath: [...FIELD_TWO, ...FIELD_THREE] }, - { fieldPath: [...FIELD_ONE, ...FIELD_THREE] }, + { fieldPath: [...FIELD_ONE.path, ...FIELD_TWO.path] }, + { fieldPath: [...FIELD_TWO.path, ...FIELD_THREE.path] }, + { fieldPath: [...FIELD_ONE.path, ...FIELD_THREE.path] }, ]); }); }); @@ -55,10 +72,10 @@ describe(`${updateCursorField.name}`, () => { selectedFields: [], }; - const newStreamConfiguration = updateCursorField(mockConfig, FIELD_ONE, 3); + const newStreamConfiguration = updateCursorField(mockConfig, FIELD_ONE.path, 3); expect(newStreamConfiguration).toEqual({ - cursorField: FIELD_ONE, + cursorField: FIELD_ONE.path, }); }); describe("when fieldSelection is active", () => { @@ -66,15 +83,15 @@ describe(`${updateCursorField.name}`, () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = updateCursorField(mockConfig, FIELD_THREE, 100); + const newStreamConfiguration = updateCursorField(mockConfig, FIELD_THREE.path, 100); expect(newStreamConfiguration).toEqual({ - cursorField: FIELD_THREE, + cursorField: FIELD_THREE.path, fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }, { fieldPath: FIELD_THREE }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }], }); }); @@ -82,15 +99,15 @@ describe(`${updateCursorField.name}`, () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = updateCursorField(mockConfig, FIELD_ONE, 3); + const newStreamConfiguration = updateCursorField(mockConfig, FIELD_ONE.path, 3); expect(newStreamConfiguration).toEqual({ - cursorField: FIELD_ONE, + cursorField: FIELD_ONE.path, fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }); }); @@ -98,7 +115,7 @@ describe(`${updateCursorField.name}`, () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; const newStreamConfiguration = updateCursorField(mockConfig, ["new_cursor"], 100); @@ -106,7 +123,7 @@ describe(`${updateCursorField.name}`, () => { expect(newStreamConfiguration).toEqual({ cursorField: ["new_cursor"], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }, { fieldPath: ["new_cursor"] }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }, { fieldPath: ["new_cursor"] }], }); }); @@ -114,13 +131,13 @@ describe(`${updateCursorField.name}`, () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = updateCursorField(mockConfig, FIELD_THREE, 3); + const newStreamConfiguration = updateCursorField(mockConfig, FIELD_THREE.path, 3); expect(newStreamConfiguration).toEqual({ - cursorField: FIELD_THREE, + cursorField: FIELD_THREE.path, fieldSelectionEnabled: false, selectedFields: [], }); @@ -132,13 +149,13 @@ describe(`${updatePrimaryKey.name}`, () => { it("updates the primary key field", () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, - primaryKey: [FIELD_ONE], + primaryKey: [FIELD_ONE.path], }; - const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_TWO], 3); + const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_TWO.path], 3); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_TWO], + primaryKey: [FIELD_TWO.path], }); }); @@ -146,16 +163,16 @@ describe(`${updatePrimaryKey.name}`, () => { it("adds each piece of the composite primary key to selectedFields", () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, - primaryKey: [FIELD_ONE], + primaryKey: [FIELD_ONE.path], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }], + selectedFields: [{ fieldPath: FIELD_ONE.path }], }; - const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_TWO, FIELD_THREE], 100); + const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_TWO.path, FIELD_THREE.path], 100); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_TWO, FIELD_THREE], - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }, { fieldPath: FIELD_THREE }], + primaryKey: [FIELD_TWO.path, FIELD_THREE.path], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }], fieldSelectionEnabled: true, }); }); @@ -165,14 +182,14 @@ describe(`${updatePrimaryKey.name}`, () => { ...mockStreamConfiguration, primaryKey: [], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_THREE], 100); + const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_THREE.path], 100); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_THREE], - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }, { fieldPath: FIELD_THREE }], + primaryKey: [FIELD_THREE.path], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }], fieldSelectionEnabled: true, }); }); @@ -180,17 +197,17 @@ describe(`${updatePrimaryKey.name}`, () => { it("replaces the primary key when only one other field is unselected", () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, - primaryKey: [FIELD_ONE], + primaryKey: [FIELD_ONE.path], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_TWO], 3); + const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_TWO.path], 3); expect(newStreamConfiguration).toEqual({ fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], - primaryKey: [FIELD_TWO], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], + primaryKey: [FIELD_TWO.path], }); }); @@ -199,13 +216,13 @@ describe(`${updatePrimaryKey.name}`, () => { ...mockStreamConfiguration, primaryKey: [], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }], + selectedFields: [{ fieldPath: FIELD_ONE.path }], }; - const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_TWO, FIELD_THREE], 3); + const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_TWO.path, FIELD_THREE.path], 3); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_TWO, FIELD_THREE], + primaryKey: [FIELD_TWO.path, FIELD_THREE.path], selectedFields: [], fieldSelectionEnabled: false, }); @@ -214,15 +231,15 @@ describe(`${updatePrimaryKey.name}`, () => { it("disables field selection when part of the selected primary key is the last unselected field", () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, - primaryKey: [FIELD_ONE], + primaryKey: [FIELD_ONE.path], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_THREE], 3); + const newStreamConfiguration = updatePrimaryKey(mockConfig, [FIELD_THREE.path], 3); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_THREE], + primaryKey: [FIELD_THREE.path], selectedFields: [], fieldSelectionEnabled: false, }); @@ -234,13 +251,13 @@ describe(`${toggleFieldInPrimaryKey.name}`, () => { it("adds a new field to the composite primary key", () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, - primaryKey: [FIELD_ONE], + primaryKey: [FIELD_ONE.path], }; - const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_TWO, 3); + const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_TWO.path, 3); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_ONE, FIELD_TWO], + primaryKey: [FIELD_ONE.path, FIELD_TWO.path], }); }); @@ -248,16 +265,16 @@ describe(`${toggleFieldInPrimaryKey.name}`, () => { it("adds the new primary key field to selectedFields", () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, - primaryKey: [FIELD_ONE], + primaryKey: [FIELD_ONE.path], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_THREE, 100); + const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_THREE.path, 100); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_ONE, FIELD_THREE], - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }, { fieldPath: FIELD_THREE }], + primaryKey: [FIELD_ONE.path, FIELD_THREE.path], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }], fieldSelectionEnabled: true, }); }); @@ -267,14 +284,14 @@ describe(`${toggleFieldInPrimaryKey.name}`, () => { ...mockStreamConfiguration, primaryKey: [], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_TWO, 3); + const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_TWO.path, 3); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_TWO], - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + primaryKey: [FIELD_TWO.path], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], fieldSelectionEnabled: true, }); }); @@ -283,33 +300,159 @@ describe(`${toggleFieldInPrimaryKey.name}`, () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }], + selectedFields: [{ fieldPath: FIELD_ONE.path }], }; - const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_TWO, 100); + const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_TWO.path, 100); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_TWO], + primaryKey: [FIELD_TWO.path], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }); }); it("disables field selection when selected primary key is the last unselected field", () => { const mockConfig: AirbyteStreamConfiguration = { ...mockStreamConfiguration, - primaryKey: [FIELD_ONE], + primaryKey: [FIELD_ONE.path], fieldSelectionEnabled: true, - selectedFields: [{ fieldPath: FIELD_ONE }, { fieldPath: FIELD_TWO }], + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], }; - const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_THREE, 3); + const newStreamConfiguration = toggleFieldInPrimaryKey(mockConfig, FIELD_THREE.path, 3); expect(newStreamConfiguration).toEqual({ - primaryKey: [FIELD_ONE, FIELD_THREE], + primaryKey: [FIELD_ONE.path, FIELD_THREE.path], selectedFields: [], fieldSelectionEnabled: false, }); }); }); }); + +describe(`${updateFieldSelected.name}`, () => { + it("Adds a field to selectedFields when selected", () => { + const newStreamConfiguration = updateFieldSelected({ + config: { + ...mockStreamConfiguration, + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], + }, + fieldPath: FIELD_THREE.path, + isSelected: true, + numberOfFieldsInStream: 5, + fields: mockSyncSchemaFields, + }); + + expect(newStreamConfiguration).toEqual({ + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }], + }); + }); + + it("Removes a field to selectedFields when deselected selected", () => { + const newStreamConfiguration = updateFieldSelected({ + config: { + ...mockStreamConfiguration, + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }], + }, + fieldPath: FIELD_THREE.path, + isSelected: false, + numberOfFieldsInStream: 5, + fields: mockSyncSchemaFields, + }); + + expect(newStreamConfiguration).toEqual({ + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], + }); + }); + + it("Deselects the first field, enabling fieldSelection", () => { + const newStreamConfiguration = updateFieldSelected({ + config: mockStreamConfiguration, + fieldPath: FIELD_ONE.path, + isSelected: false, + numberOfFieldsInStream: 3, + fields: mockSyncSchemaFields, + }); + + expect(newStreamConfiguration).toEqual({ + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }], + }); + }); + + it("Selects the last unselected field", () => { + const newStreamConfiguration = updateFieldSelected({ + config: { + ...mockStreamConfiguration, + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], + }, + fieldPath: FIELD_THREE.path, + isSelected: true, + numberOfFieldsInStream: 3, + fields: mockSyncSchemaFields, + }); + + expect(newStreamConfiguration).toEqual({ + fieldSelectionEnabled: false, + selectedFields: [], + }); + }); +}); + +describe(`${toggleAllFieldsSelected.name}`, () => { + it("unselects all fields if field selection was disabled", () => { + const newStreamConfiguration = toggleAllFieldsSelected({ ...mockStreamConfiguration }); + expect(newStreamConfiguration).toEqual({ + fieldSelectionEnabled: true, + selectedFields: [], + }); + }); + + it("selects all fields if field selection was enabled", () => { + const newStreamConfiguration = toggleAllFieldsSelected({ + ...mockStreamConfiguration, + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }, { fieldPath: FIELD_THREE.path }], + }); + expect(newStreamConfiguration).toEqual({ + fieldSelectionEnabled: false, + selectedFields: [], + }); + }); + + it("keeps cursor field selected if syncMode is incremental", () => { + const newStreamConfiguration = toggleAllFieldsSelected({ + ...mockStreamConfiguration, + fieldSelectionEnabled: false, + selectedFields: [], + syncMode: "incremental", + cursorField: FIELD_ONE.path, + }); + + expect(newStreamConfiguration).toEqual({ + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_ONE.path }], + }); + }); + + it("keeps primary key fields selected if destinationSyncMode is append_dedup", () => { + const newStreamConfiguration = toggleAllFieldsSelected({ + ...mockStreamConfiguration, + fieldSelectionEnabled: false, + selectedFields: [], + destinationSyncMode: "append_dedup", + primaryKey: [FIELD_ONE.path, FIELD_TWO.path], + }); + + expect(newStreamConfiguration).toEqual({ + fieldSelectionEnabled: true, + selectedFields: [{ fieldPath: FIELD_ONE.path }, { fieldPath: FIELD_TWO.path }], + }); + }); +}); diff --git a/airbyte-webapp/src/components/connection/CatalogTree/streamConfigHelpers/streamConfigHelpers.ts b/airbyte-webapp/src/components/connection/CatalogTree/streamConfigHelpers/streamConfigHelpers.ts index e3dacd8ebcef1..ac50b0c93755a 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/streamConfigHelpers/streamConfigHelpers.ts +++ b/airbyte-webapp/src/components/connection/CatalogTree/streamConfigHelpers/streamConfigHelpers.ts @@ -1,5 +1,6 @@ import isEqual from "lodash/isEqual"; +import { SyncSchemaField } from "core/domain/catalog"; import { AirbyteStreamConfiguration, SelectedFieldInfo } from "core/request/AirbyteClient"; /** @@ -20,14 +21,56 @@ export function mergeFieldPathArrays(...args: SelectedFieldInfo[][]): SelectedFi return Array.from(set).map((key) => ({ fieldPath: JSON.parse(key) })); } +interface onToggleFieldSelectedArguments { + config: AirbyteStreamConfiguration; + fields: SyncSchemaField[]; // could be calculated again from config, but is potentially expensive + fieldPath: string[]; + isSelected: boolean; + numberOfFieldsInStream: number; +} +export function updateFieldSelected({ + config, + fields, + fieldPath, + isSelected, + numberOfFieldsInStream, +}: onToggleFieldSelectedArguments): Partial { + const previouslySelectedFields = config?.selectedFields || []; + + if (!config?.fieldSelectionEnabled && !isSelected) { + // All fields in a stream are implicitly selected. When deselecting the first one, we also need to explicitly select the rest. + const allOtherFields = fields.filter((field: SyncSchemaField) => !isEqual(field.path, fieldPath)) ?? []; + const selectedFields: SelectedFieldInfo[] = allOtherFields.map((field) => ({ fieldPath: field.path })); + return { + selectedFields, + fieldSelectionEnabled: true, + }; + } else if (isSelected && previouslySelectedFields.length === numberOfFieldsInStream - 1) { + // In this case we are selecting the only unselected field + return { + selectedFields: [], + fieldSelectionEnabled: false, + }; + } else if (isSelected) { + return { + selectedFields: [...previouslySelectedFields, { fieldPath }], + fieldSelectionEnabled: true, + }; + } + return { + selectedFields: previouslySelectedFields.filter((f) => !isEqual(f.fieldPath, fieldPath)) || [], + fieldSelectionEnabled: true, + }; +} + /** * Updates the cursor field in AirbyteStreamConfiguration */ -export const updateCursorField = ( +export function updateCursorField( config: AirbyteStreamConfiguration, selectedCursorField: string[], numberOfFieldsInStream: number -): Partial => { +): Partial { // If field selection is enabled, we need to be sure the new cursor is also selected if (config?.fieldSelectionEnabled) { const previouslySelectedFields = config?.selectedFields || []; @@ -45,16 +88,37 @@ export const updateCursorField = ( }; } return { cursorField: selectedCursorField }; -}; +} + +export function toggleAllFieldsSelected(config: AirbyteStreamConfiguration): Partial { + const wasFieldSelectionEnabled = config?.fieldSelectionEnabled; + const fieldSelectionEnabled = !wasFieldSelectionEnabled; + const selectedFields: string[][] = []; + + // When deselecting all fields, we need to be careful not to deselect any primary keys or the cursor field + if (!wasFieldSelectionEnabled) { + if (config?.primaryKey && config.destinationSyncMode === "append_dedup") { + selectedFields.push(...config.primaryKey); + } + if (config?.cursorField && config.syncMode === "incremental") { + selectedFields.push(config.cursorField); + } + } + + return { + fieldSelectionEnabled, + selectedFields: selectedFields.map((fieldPath) => ({ fieldPath })), + }; +} /** * Overwrites the entire primaryKey value in AirbyteStreamConfiguration, which is a composite of one or more fieldPaths */ -export const updatePrimaryKey = ( +export function updatePrimaryKey( config: AirbyteStreamConfiguration, compositePrimaryKey: string[][], numberOfFieldsInStream: number -): Partial => { +): Partial { // If field selection is enabled, we need to be sure each fieldPath in the new composite primary key is also selected if (config?.fieldSelectionEnabled) { const previouslySelectedFields = config?.selectedFields || []; @@ -78,16 +142,16 @@ export const updatePrimaryKey = ( return { primaryKey: compositePrimaryKey, }; -}; +} /** * Toggles whether a fieldPath is part of the composite primaryKey */ -export const toggleFieldInPrimaryKey = ( +export function toggleFieldInPrimaryKey( config: AirbyteStreamConfiguration, fieldPath: string[], numberOfFieldsInStream: number -): Partial => { +): Partial { const fieldIsSelected = !config?.primaryKey?.find((pk) => isEqual(pk, fieldPath)); let newPrimaryKey: string[][]; @@ -117,4 +181,4 @@ export const toggleFieldInPrimaryKey = ( return { primaryKey: newPrimaryKey, }; -}; +} diff --git a/airbyte-webapp/src/test-utils/mock-data/mockAirbyteStreamConfiguration.ts b/airbyte-webapp/src/test-utils/mock-data/mockAirbyteStreamConfiguration.ts new file mode 100644 index 0000000000000..309932ae5acf4 --- /dev/null +++ b/airbyte-webapp/src/test-utils/mock-data/mockAirbyteStreamConfiguration.ts @@ -0,0 +1,9 @@ +import { AirbyteStreamConfiguration } from "core/request/AirbyteClient"; + +export const mockStreamConfiguration: AirbyteStreamConfiguration = { + fieldSelectionEnabled: false, + selectedFields: [], + selected: true, + syncMode: "full_refresh", + destinationSyncMode: "overwrite", +}; From e0e83e22152ddd61ce77a88a86963770b1d1b337 Mon Sep 17 00:00:00 2001 From: Artem Inzhyyants <36314070+artem1205@users.noreply.github.com> Date: Wed, 25 Jan 2023 15:49:50 +0100 Subject: [PATCH 079/195] Low Code CDK: DpathExtractor extend (#21690) * Low Code CDK: Dpath Extractor extend * Low Code CDK: Dpath Extractor update docs * Low Code CDK: Update version * Low Code CDK: fix formatting * Low Code CDK: update docs --- .../declarative/extractors/dpath_extractor.py | 5 ++- .../extractors/test_dpath_extractor.py | 2 + .../record-selector.md | 45 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/airbyte-cdk/python/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py b/airbyte-cdk/python/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py index 164161de63e6a..01387c7ad6903 100644 --- a/airbyte-cdk/python/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py +++ b/airbyte-cdk/python/airbyte_cdk/sources/declarative/extractors/dpath_extractor.py @@ -70,7 +70,10 @@ def extract_records(self, response: requests.Response) -> List[Record]: extracted = response_body else: pointer = [pointer.eval(self.config) for pointer in self.field_pointer] - extracted = dpath.util.get(response_body, pointer, default=[]) + if "*" in pointer: + extracted = dpath.util.values(response_body, pointer) + else: + extracted = dpath.util.get(response_body, pointer, default=[]) if isinstance(extracted, list): return extracted elif extracted: diff --git a/airbyte-cdk/python/unit_tests/sources/declarative/extractors/test_dpath_extractor.py b/airbyte-cdk/python/unit_tests/sources/declarative/extractors/test_dpath_extractor.py index 5b15fb5fbb6af..4e9c575ad957e 100644 --- a/airbyte-cdk/python/unit_tests/sources/declarative/extractors/test_dpath_extractor.py +++ b/airbyte-cdk/python/unit_tests/sources/declarative/extractors/test_dpath_extractor.py @@ -26,6 +26,8 @@ ("test_field_in_config", ["{{ config['field'] }}"], {"record_array": [{"id": 1}, {"id": 2}]}, [{"id": 1}, {"id": 2}]), ("test_field_in_options", ["{{ options['options_field'] }}"], {"record_array": [{"id": 1}, {"id": 2}]}, [{"id": 1}, {"id": 2}]), ("test_field_does_not_exist", ["record"], {"id": 1}, []), + ("test_nested_list", ["list", "*", "item"], {"list": [{"item": {"id": "1"}}]}, [{"id": "1"}]), + ("test_complex_nested_list", ['data', '*', 'list', 'data2', '*'], {"data": [{"list": {"data2": [{"id": 1}, {"id": 2}]}},{"list": {"data2": [{"id": 3}, {"id": 4}]}}]}, [{"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}]) ], ) def test_dpath_extractor(test_name, field_pointer, body, expected_records): diff --git a/docs/connector-development/config-based/understanding-the-yaml-file/record-selector.md b/docs/connector-development/config-based/understanding-the-yaml-file/record-selector.md index dd729ca78ff9d..bf48dcf9b60e0 100644 --- a/docs/connector-development/config-based/understanding-the-yaml-file/record-selector.md +++ b/docs/connector-development/config-based/understanding-the-yaml-file/record-selector.md @@ -22,6 +22,7 @@ Schema: ``` The current record extraction implementation uses [dpath](https://pypi.org/project/dpath/) to select records from the json-decoded HTTP response. +For nested structures `*` can be used to iterate over array elements. Schema: ```yaml @@ -152,6 +153,50 @@ The selected records will be ] ``` +### Selecting fields nested in arrays + +Given a response body of the form + +```json + +{ + "data": [ + { + "record": { + "id": "1" + } + }, + { + "record": { + "id": "2" + } + } + ] +} + +``` + +and a selector + +```yaml +selector: + extractor: + field_pointer: [ "data", "*", "record" ] +``` + +The selected records will be + +```json +[ + { + "id": 1 + }, + { + "id": 2 + } +] +``` + ## Filtering records Records can be filtered by adding a record_filter to the selector. From 8a4153b75733babc1af72bf20cf6bb66e8e291aa Mon Sep 17 00:00:00 2001 From: artem1205 Date: Wed, 25 Jan 2023 14:51:08 +0000 Subject: [PATCH 080/195] =?UTF-8?q?=F0=9F=A4=96=20Bump=20minor=20version?= =?UTF-8?q?=20of=20Airbyte=20CDK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- airbyte-cdk/python/.bumpversion.cfg | 2 +- airbyte-cdk/python/CHANGELOG.md | 3 +++ airbyte-cdk/python/setup.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/airbyte-cdk/python/.bumpversion.cfg b/airbyte-cdk/python/.bumpversion.cfg index 1278da16b49c7..f07beca7898a7 100644 --- a/airbyte-cdk/python/.bumpversion.cfg +++ b/airbyte-cdk/python/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.23.0 +current_version = 0.24.0 commit = False [bumpversion:file:setup.py] diff --git a/airbyte-cdk/python/CHANGELOG.md b/airbyte-cdk/python/CHANGELOG.md index 22592251d7022..7166679fc8c87 100644 --- a/airbyte-cdk/python/CHANGELOG.md +++ b/airbyte-cdk/python/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.24.0 +Use dpath.util.values method to parse response with nested lists + ## 0.23.0 Limiting the number of HTTP requests during a test read diff --git a/airbyte-cdk/python/setup.py b/airbyte-cdk/python/setup.py index 8424ac5cb726e..9d3fcf2775f12 100644 --- a/airbyte-cdk/python/setup.py +++ b/airbyte-cdk/python/setup.py @@ -15,7 +15,7 @@ setup( name="airbyte-cdk", - version="0.23.0", + version="0.24.0", description="A framework for writing Airbyte Connectors.", long_description=README, long_description_content_type="text/markdown", From 12dde5bb4af4448094146e87196310605ef144d4 Mon Sep 17 00:00:00 2001 From: artem1205 Date: Wed, 25 Jan 2023 15:06:34 +0000 Subject: [PATCH 081/195] =?UTF-8?q?=F0=9F=A4=96=20Bump=20minor=20version?= =?UTF-8?q?=20of=20Airbyte=20CDK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- airbyte-cdk/python/.bumpversion.cfg | 2 +- airbyte-cdk/python/CHANGELOG.md | 3 +++ airbyte-cdk/python/setup.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/airbyte-cdk/python/.bumpversion.cfg b/airbyte-cdk/python/.bumpversion.cfg index f07beca7898a7..a503f43197a37 100644 --- a/airbyte-cdk/python/.bumpversion.cfg +++ b/airbyte-cdk/python/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.24.0 +current_version = 0.25.0 commit = False [bumpversion:file:setup.py] diff --git a/airbyte-cdk/python/CHANGELOG.md b/airbyte-cdk/python/CHANGELOG.md index 7166679fc8c87..97bc82da7605c 100644 --- a/airbyte-cdk/python/CHANGELOG.md +++ b/airbyte-cdk/python/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.25.0 +Use dpath.util.values method to parse response with nested lists + ## 0.24.0 Use dpath.util.values method to parse response with nested lists diff --git a/airbyte-cdk/python/setup.py b/airbyte-cdk/python/setup.py index 9d3fcf2775f12..87c2f75ec45de 100644 --- a/airbyte-cdk/python/setup.py +++ b/airbyte-cdk/python/setup.py @@ -15,7 +15,7 @@ setup( name="airbyte-cdk", - version="0.24.0", + version="0.25.0", description="A framework for writing Airbyte Connectors.", long_description=README, long_description_content_type="text/markdown", From 74c8327a1e5d9fd269ee017019622a3cab59db34 Mon Sep 17 00:00:00 2001 From: Ben Church Date: Wed, 25 Jan 2023 07:14:27 -0800 Subject: [PATCH 082/195] Typo Snowlight -> Snowsight (#21834) --- docs/integrations/destinations/snowflake.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/integrations/destinations/snowflake.md b/docs/integrations/destinations/snowflake.md index 1bbadee5053ad..dac1cd6981d5f 100644 --- a/docs/integrations/destinations/snowflake.md +++ b/docs/integrations/destinations/snowflake.md @@ -110,7 +110,7 @@ You can use the following script in a new [Snowflake worksheet](https://docs.sno commit; -3. Run the script using the [Worksheet page](https://docs.snowflake.com/en/user-guide/ui-worksheet.html) or [Snowlight](https://docs.snowflake.com/en/user-guide/ui-snowsight-gs.html). Make sure to select the **All Queries** checkbox. +3. Run the script using the [Worksheet page](https://docs.snowflake.com/en/user-guide/ui-worksheet.html) or [Snowsight](https://docs.snowflake.com/en/user-guide/ui-snowsight-gs.html). Make sure to select the **All Queries** checkbox. ### Step 2: Set up a data loading method @@ -148,7 +148,7 @@ To use a Google Cloud Storage bucket: ``` The final query should show a `STORAGE_GCP_SERVICE_ACCOUNT` property with an email as the property value. Add read/write permissions to your bucket with that email. -4. Navigate to the Snowflake UI and run the script as a [Snowflake account admin](https://docs.snowflake.com/en/user-guide/security-access-control-considerations.html) using the [Worksheet page](https://docs.snowflake.com/en/user-guide/ui-worksheet.html) or [Snowlight](https://docs.snowflake.com/en/user-guide/ui-snowsight-gs.html). +4. Navigate to the Snowflake UI and run the script as a [Snowflake account admin](https://docs.snowflake.com/en/user-guide/security-access-control-considerations.html) using the [Worksheet page](https://docs.snowflake.com/en/user-guide/ui-worksheet.html) or [Snowsight](https://docs.snowflake.com/en/user-guide/ui-snowsight-gs.html). #### Using Azure Blob Storage From 0863aae928fe326d7254047be33a0687231387dd Mon Sep 17 00:00:00 2001 From: Maxime Carbonneau-Leclerc Date: Wed, 25 Jan 2023 10:58:49 -0500 Subject: [PATCH 083/195] [ISSUE #19981] update skip-publish-test description (#21850) --- .github/workflows/publish-cdk-command-manually.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-cdk-command-manually.yml b/.github/workflows/publish-cdk-command-manually.yml index 7e607f2aca804..ef3db19ed566e 100644 --- a/.github/workflows/publish-cdk-command-manually.yml +++ b/.github/workflows/publish-cdk-command-manually.yml @@ -20,7 +20,7 @@ on: - patch required: true skip-publish-test: - description: 'By default, the job publishes to Test PyPi. Use "true" to only publish to actual PyPi servers.' + description: 'By default, the job publishes to both Test and actual PyPi. Use "true" to only publish to actual PyPi servers.' required: false changelog-message: description: "Changelog message to be added to CHANGELOG.md" From 438c1ebc19bfebe0a9ea9590aa59c02b228815c1 Mon Sep 17 00:00:00 2001 From: oneshcheret <33333155+sashaNeshcheret@users.noreply.github.com> Date: Wed, 25 Jan 2023 17:26:15 +0100 Subject: [PATCH 084/195] Mysql source: handle ssh timeout exception (#20593) * Ssh wrapped source: mark ssh timeout exception as config error. * Ssh wrapped source: move to single catch block * Ssh wrapped source: code format * Source postgres: update display message * Source mysql: format * Source mysql: bump versions * auto-bump connector version Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../integrations/base/ssh/SshTunnel.java | 12 +++++- .../source-mysql-strict-encrypt/Dockerfile | 2 +- .../connectors/source-mysql/Dockerfile | 2 +- .../AbstractSshMySqlSourceAcceptanceTest.java | 2 +- .../SshPasswordMySqlSourceAcceptanceTest.java | 40 +++++++++++++++++++ docs/integrations/sources/mysql.md | 5 ++- 8 files changed, 59 insertions(+), 8 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 67cb1b65ad8a2..93d770f597f9e 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1078,7 +1078,7 @@ - name: MySQL sourceDefinitionId: 435bb9a5-7887-4809-aa58-28c27df0d7ad dockerRepository: airbyte/source-mysql - dockerImageTag: 1.0.19 + dockerImageTag: 1.0.20 documentationUrl: https://docs.airbyte.com/integrations/sources/mysql icon: mysql.svg sourceType: database diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index d9ac4a58f00e2..f77ebf642281c 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -9002,7 +9002,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-mysql:1.0.19" +- dockerImage: "airbyte/source-mysql:1.0.20" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/mysql" connectionSpecification: diff --git a/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/base/ssh/SshTunnel.java b/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/base/ssh/SshTunnel.java index 2b24d2babb357..f07ef2e6d0054 100644 --- a/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/base/ssh/SshTunnel.java +++ b/airbyte-integrations/bases/base-java/src/main/java/io/airbyte/integrations/base/ssh/SshTunnel.java @@ -22,9 +22,11 @@ import java.time.Duration; import java.util.Arrays; import java.util.List; +import java.util.Locale; import org.apache.sshd.client.SshClient; import org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier; import org.apache.sshd.client.session.ClientSession; +import org.apache.sshd.common.SshException; import org.apache.sshd.common.util.net.SshdSocketAddress; import org.apache.sshd.common.util.security.SecurityUtils; import org.apache.sshd.core.CoreModuleProperties; @@ -41,6 +43,8 @@ public class SshTunnel implements AutoCloseable { private static final Logger LOGGER = LoggerFactory.getLogger(SshTunnel.class); + public static final String SSH_TIMEOUT_DISPLAY_MESSAGE = + "Timed out while opening a SSH Tunnel. Please double check the given SSH configurations and try again."; public enum TunnelMethod { NO_TUNNEL, @@ -364,7 +368,13 @@ ClientSession openTunnel(final SshClient client) { remoteServiceHost, remoteServicePort, address.toInetSocketAddress())); return session; } catch (final IOException | GeneralSecurityException e) { - throw new RuntimeException(e); + if (e instanceof SshException && e.getMessage() + .toLowerCase(Locale.ROOT) + .contains("failed to get operation result within specified timeout")) { + throw new ConfigErrorException(SSH_TIMEOUT_DISPLAY_MESSAGE, e); + } else { + throw new RuntimeException(e); + } } } diff --git a/airbyte-integrations/connectors/source-mysql-strict-encrypt/Dockerfile b/airbyte-integrations/connectors/source-mysql-strict-encrypt/Dockerfile index bb8acc44839f0..29f88559128a8 100644 --- a/airbyte-integrations/connectors/source-mysql-strict-encrypt/Dockerfile +++ b/airbyte-integrations/connectors/source-mysql-strict-encrypt/Dockerfile @@ -16,6 +16,6 @@ ENV APPLICATION source-mysql-strict-encrypt COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.19 +LABEL io.airbyte.version=1.0.20 LABEL io.airbyte.name=airbyte/source-mysql-strict-encrypt diff --git a/airbyte-integrations/connectors/source-mysql/Dockerfile b/airbyte-integrations/connectors/source-mysql/Dockerfile index 149618a5dfe6b..672255ba2ea15 100644 --- a/airbyte-integrations/connectors/source-mysql/Dockerfile +++ b/airbyte-integrations/connectors/source-mysql/Dockerfile @@ -16,6 +16,6 @@ ENV APPLICATION source-mysql COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=1.0.19 +LABEL io.airbyte.version=1.0.20 LABEL io.airbyte.name=airbyte/source-mysql diff --git a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractSshMySqlSourceAcceptanceTest.java b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractSshMySqlSourceAcceptanceTest.java index 1d9d99cd420f2..d6d73ad51c054 100644 --- a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractSshMySqlSourceAcceptanceTest.java +++ b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/AbstractSshMySqlSourceAcceptanceTest.java @@ -28,7 +28,7 @@ public abstract class AbstractSshMySqlSourceAcceptanceTest extends SourceAccepta private static final String STREAM_NAME = "id_and_name"; private static final String STREAM_NAME2 = "starships"; - private JsonNode config; + protected static JsonNode config; public abstract Path getConfigFilePath(); diff --git a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshPasswordMySqlSourceAcceptanceTest.java b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshPasswordMySqlSourceAcceptanceTest.java index e2386f69645e0..22b57890da22c 100644 --- a/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshPasswordMySqlSourceAcceptanceTest.java +++ b/airbyte-integrations/connectors/source-mysql/src/test-integration/java/io/airbyte/integrations/io/airbyte/integration_tests/sources/SshPasswordMySqlSourceAcceptanceTest.java @@ -4,10 +4,22 @@ package io.airbyte.integrations.io.airbyte.integration_tests.sources; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import io.airbyte.commons.exceptions.ConfigErrorException; import io.airbyte.commons.features.EnvVariableFeatureFlags; +import io.airbyte.integrations.base.Source; +import io.airbyte.integrations.base.ssh.SshBastionContainer; +import io.airbyte.integrations.base.ssh.SshTunnel; +import io.airbyte.integrations.source.mysql.MySqlSource; import io.airbyte.integrations.standardtest.source.TestDestinationEnv; import java.nio.file.Path; +import java.util.List; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.containers.Network; import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; import uk.org.webcompere.systemstubs.jupiter.SystemStub; import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; @@ -29,4 +41,32 @@ public Path getConfigFilePath() { return Path.of("secrets/ssh-pwd-repl-config.json"); } + @Test + public void sshTimeoutExceptionMarkAsConfigErrorTest() throws Exception { + SshBastionContainer bastion = new SshBastionContainer(); + final Network network = Network.newNetwork(); + // set up env + MySQLContainer db = startTestContainers(bastion, network); + config = bastion.getTunnelConfig(SshTunnel.TunnelMethod.SSH_PASSWORD_AUTH, bastion.getBasicDbConfigBuider(db, List.of("public"))); + bastion.stopAndClose(); + Source sshWrappedSource = MySqlSource.sshWrappedSource(); + Exception exception = assertThrows(ConfigErrorException.class, () -> sshWrappedSource.discover(config)); + + String expectedMessage = "Timed out while opening a SSH Tunnel. Please double check the given SSH configurations and try again."; + String actualMessage = exception.getMessage(); + + assertTrue(actualMessage.contains(expectedMessage)); + } + + private MySQLContainer startTestContainers(SshBastionContainer bastion, Network network) { + bastion.initAndStartBastion(network); + return initAndStartJdbcContainer(network); + } + + private MySQLContainer initAndStartJdbcContainer(Network network) { + MySQLContainer db = new MySQLContainer<>("mysql:8.0").withNetwork(network); + db.start(); + return db; + } + } diff --git a/docs/integrations/sources/mysql.md b/docs/integrations/sources/mysql.md index 77318d284bde8..507a3732323b4 100644 --- a/docs/integrations/sources/mysql.md +++ b/docs/integrations/sources/mysql.md @@ -256,8 +256,9 @@ WHERE actor_definition_id ='435bb9a5-7887-4809-aa58-28c27df0d7ad' AND (configura | Version | Date | Pull Request | Subject | |:--------|:-----------|:-----------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 1.0.19 | 2022-12-14 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | -| 1.0.18 | 2022-12-14 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | +| 1.0.20 | 2023-01-24 | [20593](https://github.com/airbytehq/airbyte/pull/20593) | Handle ssh time out exception | +| 1.0.19 | 2022-12-14 | [20436](https://github.com/airbytehq/airbyte/pull/20346) | Consolidate date/time values mapping for JDBC sources | +| 1.0.18 | 2022-12-14 | [20378](https://github.com/airbytehq/airbyte/pull/20378) | Improve descriptions | | 1.0.17 | 2022-12-13 | [20289](https://github.com/airbytehq/airbyte/pull/20289) | Mark unknown column exception as config error | | 1.0.16 | 2022-12-12 | [18959](https://github.com/airbytehq/airbyte/pull/18959) | CDC : Don't timeout if snapshot is not complete. | | 1.0.15 | 2022-12-06 | [20000](https://github.com/airbytehq/airbyte/pull/20000) | Add check and better messaging when user does not have permission to access binary log in CDC mode | From 734d5484c2cacfad83b0edc6804e0edc91656fb9 Mon Sep 17 00:00:00 2001 From: Augustin Date: Wed, 25 Jan 2023 17:38:52 +0100 Subject: [PATCH 085/195] qa-engine: implement early enrichments and validations on QA report (#21776) --- .../ci_connector_ops/qa_engine/__init__.py | 3 + .../ci_connector_ops/qa_engine/constants.py | 15 +++++ .../ci_connector_ops/qa_engine/enrichments.py | 42 +++++++++++++ .../ci_connector_ops/qa_engine/inputs.py | 4 +- .../ci_connector_ops/qa_engine/main.py | 30 +++------- .../ci_connector_ops/qa_engine/models.py | 7 ++- .../ci_connector_ops/qa_engine/validations.py | 60 +++++++++++++++++++ tools/ci_connector_ops/setup.py | 10 +++- .../tests/test_qa_engine/__init__.py | 3 + .../tests/test_qa_engine/test_enrichments.py | 38 ++++++++++++ .../tests/test_qa_engine/test_main.py | 33 ++++++++-- .../tests/test_qa_engine/test_validations.py | 34 +++++++++++ 12 files changed, 247 insertions(+), 32 deletions(-) create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/constants.py create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py create mode 100644 tools/ci_connector_ops/tests/test_qa_engine/test_enrichments.py create mode 100644 tools/ci_connector_ops/tests/test_qa_engine/test_validations.py diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/__init__.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/__init__.py index e69de29bb2d1d..c941b30457953 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/__init__.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/__init__.py @@ -0,0 +1,3 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/constants.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/constants.py new file mode 100644 index 0000000000000..c007c7328cb6d --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/constants.py @@ -0,0 +1,15 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +CLOUD_CATALOG_URL = "https://storage.googleapis.com/prod-airbyte-cloud-connector-metadata-service/cloud_catalog.json" +OSS_CATALOG_URL = "https://storage.googleapis.com/prod-airbyte-cloud-connector-metadata-service/oss_catalog.json" + +INAPPROPRIATE_FOR_CLOUD_USE_CONNECTORS = [ + "8be1cf83-fde1-477f-a4ad-318d23c9f3c6", # Local CSV + "a625d593-bba5-4a1c-a53d-2d246268a816", # Local JSON + "b76be0a6-27dc-4560-95f6-2623da0bd7b6" # Local SQL Lite +] + +GCS_QA_REPORT_PATH = "gs://prod-airbyte-cloud-connector-metadata-service/qa_report.json" diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py new file mode 100644 index 0000000000000..e275dcb51d33b --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py @@ -0,0 +1,42 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import pandas as pd + +def get_enriched_catalog(oss_catalog: pd.DataFrame, cloud_catalog: pd.DataFrame) -> pd.DataFrame: + """Merge OSS and Cloud catalog in a single dataframe on their definition id. + Transformations: + - Rename columns to snake case. + - Rename name column to connector_name. + - Rename docker_image_tag to connector_version. + - Replace null value for release_stage with alpha. + Enrichments: + - is_on_cloud: determined by the merge operation results. + - connector_technical_name: built from the docker repository field. airbyte/source-pokeapi -> source-pokeapi. + Args: + oss_catalog (pd.DataFrame): The open source catalog dataframe. + cloud_catalog (pd.DataFrame): The cloud catalog dataframe. + + Returns: + pd.DataFrame: The enriched catalog. + """ + enriched_catalog = pd.merge( + oss_catalog, + cloud_catalog, + how="left", + on="connector_definition_id", + indicator=True, + suffixes=("", "_del"), + ) + enriched_catalog.columns = enriched_catalog.columns.str.replace( + "(?<=[a-z])(?=[A-Z])", "_", regex=True + ).str.lower() # column names to snake case + enriched_catalog["is_on_cloud"] = enriched_catalog["_merge"] == "both" + enriched_catalog = enriched_catalog.drop(columns="_merge") + enriched_catalog["connector_name"] = enriched_catalog["name"] + enriched_catalog["connector_technical_name"] = enriched_catalog["docker_repository"].str.replace("airbyte/", "") + enriched_catalog["connector_version"] = enriched_catalog["docker_image_tag"] + enriched_catalog["release_stage"] = enriched_catalog["release_stage"].fillna("unknown") + return enriched_catalog diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py index 1e560df0be562..a46298b972662 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py @@ -6,9 +6,7 @@ import requests import pandas as pd -CLOUD_CATALOG_URL = "https://storage.googleapis.com/prod-airbyte-cloud-connector-metadata-service/cloud_catalog.json" -OSS_CATALOG_URL = "https://storage.googleapis.com/prod-airbyte-cloud-connector-metadata-service/oss_catalog.json" - +from .constants import CLOUD_CATALOG_URL, OSS_CATALOG_URL def fetch_remote_catalog(catalog_url: str) -> pd.DataFrame: """Fetch a combined remote catalog and return a single DataFrame diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py index 7d632788aa6ae..a1e623cddb50c 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py @@ -3,29 +3,13 @@ # -import pandas as pd -from .models import QAReport +from .constants import GCS_QA_REPORT_PATH +from .enrichments import get_enriched_catalog +from .inputs import CLOUD_CATALOG, OSS_CATALOG +from .validations import get_qa_report -GCS_QA_REPORT_PATH = "gs://prod-airbyte-cloud-connector-metadata-service/qa_report.json" -DUMMY_REPORT = pd.DataFrame([ - { - "connector_type": "source", - "connector_name": "test", - "docker_image_tag": "0.0.0", - "release_stage": "alpha", - "is_on_cloud": False, - "latest_build_is_successful": False, - "documentation_is_available": False, - "number_of_connections": 0, - "number_of_users": 0, - "sync_success_rate": .99 - } - ]) - -def write_qa_report_to_gcs(qa_report: pd.DataFrame, output_file_path: str): - # Validate the report structure with pydantic QAReport model. - QAReport(connectors_qa_report=qa_report.to_dict(orient="records")) - qa_report.to_json(output_file_path, orient="records") def main(): - write_qa_report_to_gcs(DUMMY_REPORT, GCS_QA_REPORT_PATH) + enriched_catalog = get_enriched_catalog(OSS_CATALOG, CLOUD_CATALOG) + qa_report = get_qa_report(enriched_catalog) + qa_report.to_json(GCS_QA_REPORT_PATH, orient="records") diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py index eec91b90eee70..7fef17500db3c 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py @@ -5,6 +5,7 @@ from enum import Enum from typing import List + from pydantic import BaseModel class ConnectorTypeEnum(str, Enum): @@ -12,6 +13,7 @@ class ConnectorTypeEnum(str, Enum): destination = "destination" class ReleaseStageEnum(str, Enum): + unknown = "unknown" alpha = "alpha" beta = "beta" generally_available = "generally_available" @@ -19,9 +21,12 @@ class ReleaseStageEnum(str, Enum): class ConnectorQAReport(BaseModel): connector_type: ConnectorTypeEnum connector_name: str - docker_image_tag: str + connector_technical_name: str + connector_definition_id: str + connector_version: str release_stage: ReleaseStageEnum is_on_cloud: bool + is_appropriate_for_cloud_use: bool latest_build_is_successful: bool documentation_is_available: bool number_of_connections: int diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py new file mode 100644 index 0000000000000..8a04e8b91bb8a --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py @@ -0,0 +1,60 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import pandas as pd +import requests + +from .constants import INAPPROPRIATE_FOR_CLOUD_USE_CONNECTORS +from .inputs import OSS_CATALOG +from .models import ConnectorQAReport, QAReport + +class QAReportGenerationError(Exception): + pass + +def url_is_reachable(url: str) -> bool: + response = requests.get(url) + return response.status_code == 200 + +def is_appropriate_for_cloud_use(definition_id: str) -> bool: + return definition_id not in INAPPROPRIATE_FOR_CLOUD_USE_CONNECTORS + +def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame: + """Perform validation steps on top of the enriched catalog. + Adds the following columns: + - documentation_is_available: + GET the documentation URL and expect a 200 status code. + - is_appropriate_for_cloud_use: + Determined from an hardcoded list of definition ids inappropriate for cloud use. + - latest_build_is_successful: + Check if the latest build for the current connector version is successful. + - number_of_connections: + Get the number of connections using this connector version from our datawarehouse. + - number_of_users: + Get the number of users using this connector version from our datawarehouse. + - sync_success_rate: + Get the sync success rate of the connections with this connector version from our datawarehouse. + Args: + enriched_catalog (pd.DataFrame): The enriched catalog. + + Returns: + pd.DataFrame: The final QA report. + """ + qa_report = enriched_catalog.copy(deep=True) + qa_report["documentation_is_available"] = qa_report.documentation_url.apply(url_is_reachable) + qa_report["is_appropriate_for_cloud_use"] = qa_report.connector_definition_id.apply(is_appropriate_for_cloud_use) + + # TODO YET TO IMPLEMENT VALIDATIONS + qa_report["latest_build_is_successful"] = False # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21720 + qa_report["number_of_connections"] = 0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721 + qa_report["number_of_users"] = 0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721 + qa_report["sync_success_rate"] = .0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721 + + # Only select dataframe columns defined in the ConnectorQAReport model. + qa_report= qa_report[[field.name for field in ConnectorQAReport.__fields__.values()]] + # Validate the report structure with pydantic QAReport model. + QAReport(connectors_qa_report=qa_report.to_dict(orient="records")) + if len(qa_report) != len(OSS_CATALOG): + raise QAReportGenerationError("The QA report does not contain all the connectors defined in the OSS catalog.") + return qa_report diff --git a/tools/ci_connector_ops/setup.py b/tools/ci_connector_ops/setup.py index 7f544c03c6e8e..ca732211d40be 100644 --- a/tools/ci_connector_ops/setup.py +++ b/tools/ci_connector_ops/setup.py @@ -15,15 +15,23 @@ "gcsfs~=2023.1.0" ] +TEST_REQUIREMENTS = [ + "pytest~=6.2.5", + "pytest-mock~=3.10.0", +] + setup( - version="0.1.3", + version="0.1.4", name="ci_connector_ops", description="Packaged maintained by the connector operations team to perform CI for connectors", author="Airbyte", author_email="contact@airbyte.io", packages=find_packages(), install_requires=MAIN_REQUIREMENTS, + extras_require={ + "tests": TEST_REQUIREMENTS, + }, python_requires=">=3.9", entry_points={ "console_scripts": [ diff --git a/tools/ci_connector_ops/tests/test_qa_engine/__init__.py b/tools/ci_connector_ops/tests/test_qa_engine/__init__.py index e69de29bb2d1d..c941b30457953 100644 --- a/tools/ci_connector_ops/tests/test_qa_engine/__init__.py +++ b/tools/ci_connector_ops/tests/test_qa_engine/__init__.py @@ -0,0 +1,3 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_enrichments.py b/tools/ci_connector_ops/tests/test_qa_engine/test_enrichments.py new file mode 100644 index 0000000000000..c108c2d612c20 --- /dev/null +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_enrichments.py @@ -0,0 +1,38 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import re + +import pandas as pd +import pytest + +from ci_connector_ops.qa_engine import inputs, enrichments + +@pytest.fixture +def enriched_catalog() -> pd.DataFrame: + return enrichments.get_enriched_catalog(inputs.OSS_CATALOG, inputs.CLOUD_CATALOG) + +@pytest.fixture +def enriched_catalog_columns(enriched_catalog: pd.DataFrame) -> set: + return set(enriched_catalog.columns) + +def test_merge_performed_correctly(enriched_catalog): + assert len(enriched_catalog) == len(inputs.OSS_CATALOG) + +def test_new_columns_are_added(enriched_catalog_columns): + expected_new_columns = { + "is_on_cloud", + "connector_name", + "connector_technical_name", + "connector_version" + } + assert expected_new_columns.issubset(enriched_catalog_columns) + +def test_no_column_are_removed_and_lowercased(enriched_catalog_columns): + for column in inputs.OSS_CATALOG: + assert re.sub(r"(? pd.DataFrame: + return pd.DataFrame([ + { + "connector_type": "source", + "connector_name": "test", + "docker_image_tag": "0.0.0", + "release_stage": "alpha", + "is_on_cloud": False, + "latest_build_is_successful": False, + "documentation_is_available": False, + "number_of_connections": 0, + "number_of_users": 0, + "sync_success_rate": .99 + } + ]) + +def test_main(tmp_path, mocker, dummy_report): output_path = tmp_path / "output.json" - main.write_qa_report_to_gcs(main.DUMMY_REPORT, output_path) - assert pandas.read_json(output_path).to_dict() == main.DUMMY_REPORT.to_dict() + mocker.patch.object(main, "GCS_QA_REPORT_PATH", output_path) + mocker.patch.object(main, "get_enriched_catalog") + mocker.patch.object(main, "get_qa_report", mocker.Mock(return_value=dummy_report)) + main.main() + main.get_enriched_catalog.assert_called_with(main.OSS_CATALOG, main.CLOUD_CATALOG) + main.get_qa_report.assert_called_with(main.get_enriched_catalog.return_value) + assert pd.read_json(output_path).to_dict() == dummy_report.to_dict() diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py b/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py new file mode 100644 index 0000000000000..c20dc12f4b8a3 --- /dev/null +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py @@ -0,0 +1,34 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import pandas as pd +import pytest + +from ci_connector_ops.qa_engine import inputs, enrichments, models, validations + +@pytest.fixture +def enriched_catalog() -> pd.DataFrame: + return enrichments.get_enriched_catalog(inputs.OSS_CATALOG, inputs.CLOUD_CATALOG) + +@pytest.fixture +def qa_report(enriched_catalog, mocker) -> pd.DataFrame: + mocker.patch.object(validations, "url_is_reachable", mocker.Mock(return_value=True)) + return validations.get_qa_report(enriched_catalog) + +@pytest.fixture +def qa_report_columns(qa_report: pd.DataFrame) -> set: + return set(qa_report.columns) + +def test_all_columns_are_declared(qa_report_columns: set): + expected_columns = set([field.name for field in models.ConnectorQAReport.__fields__.values()]) + assert qa_report_columns == expected_columns + +def test_not_null_values_after_validation(qa_report: pd.DataFrame): + assert len(qa_report.dropna()) == len(qa_report) + +def test_report_generation_error(enriched_catalog, mocker): + mocker.patch.object(validations, "url_is_reachable", mocker.Mock(return_value=True)) + with pytest.raises(validations.QAReportGenerationError): + return validations.get_qa_report(enriched_catalog.sample(10)) From a18d724a8bfc1f40b6f0cb2b341e0b401b9917dd Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi <53845333+lazebnyi@users.noreply.github.com> Date: Wed, 25 Jan 2023 17:43:25 +0100 Subject: [PATCH 086/195] Source Google Search Console: enable `high` test strictness level in SAT (#21503) * Enable high test strictness level * Deleted search_analytics_all_fields stream from expected records * Updated acceptance tests * Updated expected records * Updated expected records --- .../source-google-search-console/README.md | 2 +- .../acceptance-test-config.yml | 67 +++++++++++-------- .../integration_tests/configured_catalog.json | 18 +++++ .../integration_tests/expected_records.jsonl | 46 +++++++++++++ 4 files changed, 104 insertions(+), 29 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-search-console/integration_tests/expected_records.jsonl diff --git a/airbyte-integrations/connectors/source-google-search-console/README.md b/airbyte-integrations/connectors/source-google-search-console/README.md index 5c280d3bc910b..20372693ce885 100755 --- a/airbyte-integrations/connectors/source-google-search-console/README.md +++ b/airbyte-integrations/connectors/source-google-search-console/README.md @@ -79,7 +79,7 @@ docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integrat Make sure to familiarize yourself with [pytest test discovery](https://docs.pytest.org/en/latest/goodpractices.html#test-discovery) to know how your test files and methods should be named. First install test dependencies into your virtual environment: ``` -pip install .[tests] +pip install .'[tests]' ``` ### Unit Tests To run unit tests locally, from the connector directory run: diff --git a/airbyte-integrations/connectors/source-google-search-console/acceptance-test-config.yml b/airbyte-integrations/connectors/source-google-search-console/acceptance-test-config.yml index c6228a70c37d0..4aa9eb83bd57f 100755 --- a/airbyte-integrations/connectors/source-google-search-console/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-google-search-console/acceptance-test-config.yml @@ -1,37 +1,48 @@ # See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-google-search-console:dev -tests: +test_strictness_level: "high" +acceptance_tests: spec: - - spec_path: "source_google_search_console/spec.json" + tests: + - spec_path: "source_google_search_console/spec.json" connection: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "secrets/service_account_config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + tests: + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "secrets/service_account_config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" discovery: - - config_path: "secrets/config.json" + tests: + - config_path: "secrets/config.json" basic_read: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - empty_streams: [] - timeout_seconds: 1800 + tests: + - config_path: "secrets/config.json" + expect_records: + path: "integration_tests/expected_records.jsonl" + extra_fields: yes + exact_order: yes + extra_records: no + timeout_seconds: 1800 full_refresh: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/catalog.json" - timeout_seconds: 1800 + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/catalog.json" + timeout_seconds: 1800 incremental: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog_incremental.json" - timeout_seconds: 1800 - future_state_path: "integration_tests/abnormal_state.json" - cursor_paths: - search_analytics_by_country: [ "https://airbyte.io", "web", "date" ] - search_analytics_by_country: [ "https://airbyte.io", "web", "image" ] - search_analytics_by_device: [ "https://airbyte.io", "web", "date" ] - search_analytics_by_page: [ "https://airbyte.io", "web", "date" ] - search_analytics_by_query: [ "https://airbyte.io", "web", "date" ] - search_analytics_all_fields: [ "https://airbyte.io", "web", "date" ] - custom_dimensions: [ "https://airbyte.io", "web", "date" ] + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog_incremental.json" + timeout_seconds: 1800 + future_state: + future_state_path: "integration_tests/abnormal_state.json" + cursor_paths: + search_analytics_by_country: [ "https://airbyte.io", "web", "date" ] + search_analytics_by_country: [ "https://airbyte.io", "web", "image" ] + search_analytics_by_device: [ "https://airbyte.io", "web", "date" ] + search_analytics_by_page: [ "https://airbyte.io", "web", "date" ] + search_analytics_by_query: [ "https://airbyte.io", "web", "date" ] + search_analytics_all_fields: [ "https://airbyte.io", "web", "date" ] + custom_dimensions: [ "https://airbyte.io", "web", "date" ] diff --git a/airbyte-integrations/connectors/source-google-search-console/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-google-search-console/integration_tests/configured_catalog.json index ce8bcd1048811..d407ec0746926 100755 --- a/airbyte-integrations/connectors/source-google-search-console/integration_tests/configured_catalog.json +++ b/airbyte-integrations/connectors/source-google-search-console/integration_tests/configured_catalog.json @@ -1,5 +1,23 @@ { "streams": [ + { + "stream": { + "name": "sites", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" + }, + { + "stream": { + "name": "sitemaps", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" + }, { "stream": { "name": "search_analytics_by_date", diff --git a/airbyte-integrations/connectors/source-google-search-console/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-google-search-console/integration_tests/expected_records.jsonl new file mode 100644 index 0000000000000..56f1dd7f7c57d --- /dev/null +++ b/airbyte-integrations/connectors/source-google-search-console/integration_tests/expected_records.jsonl @@ -0,0 +1,46 @@ +{"stream": "sites", "data": {"permissionLevel": "siteOwner"}, "emitted_at": 1674600072721} +{"stream": "sites", "data": {"permissionLevel": "siteOwner"}, "emitted_at": 1674600073155} +{"stream": "sitemaps", "data": {"lastSubmitted": "2021-09-10T23:02:22.258Z", "isPending": false, "isSitemapsIndex": false, "type": "sitemap", "warnings": "0", "errors": "0", "contents": [{"type": "web", "submitted": "5690", "indexed": "0"}]}, "emitted_at": 1674600073428} +{"stream": "sitemaps", "data": {"lastSubmitted": "2021-09-10T23:02:22.258Z", "isPending": false, "isSitemapsIndex": false, "type": "sitemap", "warnings": "0", "errors": "0", "contents": [{"type": "web", "submitted": "5690", "indexed": "0"}]}, "emitted_at": 1674600073798} +{"stream": "search_analytics_by_date", "data": {"ctr": 0.07940251572327044, "position": 31.88456498951782, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600074364} +{"stream": "search_analytics_by_date", "data": {"ctr": 0.07130707837236687, "position": 32.45505691482403, "search_type": "web", "date": "2021-09-15"}, "emitted_at": 1674600074364} +{"stream": "search_analytics_by_date", "data": {"ctr": 0.06246691371095818, "position": 35.16079936474325, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600074365} +{"stream": "search_analytics_by_date", "data": {"ctr": 0.04798676227247656, "position": 37.52137341423056, "search_type": "web", "date": "2021-09-17"}, "emitted_at": 1674600074816} +{"stream": "search_analytics_by_date", "data": {"ctr": 0.026209048361934478, "position": 43.134477379095166, "search_type": "web", "date": "2021-09-18"}, "emitted_at": 1674600074817} +{"stream": "search_analytics_by_date", "data": {"ctr": 0.029040774420651217, "position": 42.78952772073922, "search_type": "web", "date": "2021-09-19"}, "emitted_at": 1674600074818} +{"stream": "search_analytics_by_country", "data": {"ctr": 0.1301955990220049, "position": 24.62530562347188, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600075212} +{"stream": "search_analytics_by_country", "data": {"ctr": 0.10391061452513967, "position": 29.924022346368716, "search_type": "web", "date": "2021-09-15"}, "emitted_at": 1674600075213} +{"stream": "search_analytics_by_country", "data": {"ctr": 0.09462915601023018, "position": 30.83759590792839, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600075213} +{"stream": "search_analytics_by_country", "data": {"ctr": 0.0832, "position": 27.408, "search_type": "web", "date": "2021-09-15"}, "emitted_at": 1674600075213} +{"stream": "search_analytics_by_country", "data": {"ctr": 0.08223684210526316, "position": 26.820723684210527, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600075214} +{"stream": "search_analytics_by_country", "data": {"ctr": 0.07445008460236886, "position": 27.43993231810491, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600075214} +{"stream": "search_analytics_by_device", "data": {"ctr": 0.07708300015992324, "position": 31.635375019990406, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600075873} +{"stream": "search_analytics_by_device", "data": {"ctr": 0.07342657342657342, "position": 31.832326764144945, "search_type": "web", "date": "2021-09-15"}, "emitted_at": 1674600075873} +{"stream": "search_analytics_by_device", "data": {"ctr": 0.06650602409638554, "position": 34.87839357429719, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600075874} +{"stream": "search_analytics_by_device", "data": {"ctr": 0.09090909090909091, "position": 33.38137472283814, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600075874} +{"stream": "search_analytics_by_device", "data": {"ctr": 0.06221889055472264, "position": 35.52473763118441, "search_type": "web", "date": "2021-09-15"}, "emitted_at": 1674600075874} +{"stream": "search_analytics_by_device", "data": {"ctr": 0.04354469060351413, "position": 36.913674560733384, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600075875} +{"stream": "search_analytics_by_page", "data": {"ctr": 0.16593362654938024, "position": 32.60535785685725, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600077103} +{"stream": "search_analytics_by_page", "data": {"ctr": 0.14685874349739897, "position": 34.94597839135654, "search_type": "web", "date": "2021-09-15"}, "emitted_at": 1674600077104} +{"stream": "search_analytics_by_page", "data": {"ctr": 0.14058234758871702, "position": 37.05686988171065, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600077105} +{"stream": "search_analytics_by_page", "data": {"ctr": 0.09090909090909091, "position": 14.812316715542522, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600077105} +{"stream": "search_analytics_by_page", "data": {"ctr": 0.07418397626112759, "position": 11.57566765578635, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600077106} +{"stream": "search_analytics_by_page", "data": {"ctr": 0.02894736842105263, "position": 2.375, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600077107} +{"stream": "search_analytics_by_query", "data": {"ctr": 0.6571428571428571, "position": 1, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600078165} +{"stream": "search_analytics_by_query", "data": {"ctr": 0.6563786008230452, "position": 1.0041152263374487, "search_type": "web", "date": "2021-09-15"}, "emitted_at": 1674600078165} +{"stream": "search_analytics_by_query", "data": {"ctr": 0.6157517899761337, "position": 1, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600078166} +{"stream": "search_analytics_by_query", "data": {"ctr": 0.6666666666666666, "position": 1.3333333333333333, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600078166} +{"stream": "search_analytics_by_query", "data": {"ctr": 0.6363636363636364, "position": 1, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600078166} +{"stream": "search_analytics_by_query", "data": {"ctr": 0.5384615384615384, "position": 1, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600078166} +{"stream": "search_analytics_all_fields", "data": {"ctr": 0.6490066225165563, "position": 1, "search_type": "web", "date": "2021-09-15"}, "emitted_at": 1674600079765} +{"stream": "search_analytics_all_fields", "data": {"ctr": 0.5272727272727272, "position": 1, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600079765} +{"stream": "search_analytics_all_fields", "data": {"ctr": 0.6229508196721312, "position": 1, "search_type": "web", "date": "2021-09-16"}, "emitted_at": 1674600079766} +{"stream": "search_analytics_all_fields", "data": {"ctr": 0.6097560975609756, "position": 1, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600079766} +{"stream": "search_analytics_all_fields", "data": {"ctr": 0.8, "position": 1, "search_type": "web", "date": "2021-09-14"}, "emitted_at": 1674600079766} +{"stream": "search_analytics_all_fields", "data": {"ctr": 0.6666666666666666, "position": 1, "date": "2021-09-15"}, "emitted_at": 1674600079766} +{"stream": "custom_dimensions", "data": {"ctr": 0.10220440881763528, "position": 29.36005344021376, "date": "2021-09-15"}, "emitted_at": 1674600080130} +{"stream": "custom_dimensions", "data": {"ctr": 0.11009174311926606, "position": 25.412079510703364, "date": "2021-09-14"}, "emitted_at": 1674600080131} +{"stream": "custom_dimensions", "data": {"ctr": 0.1004601226993865, "position": 30.555981595092025, "date": "2021-09-16"}, "emitted_at": 1674600080131} +{"stream": "custom_dimensions", "data": {"ctr": 0.21518987341772153, "position": 22.227848101265824, "date": "2021-09-14"}, "emitted_at": 1674600080131} +{"stream": "custom_dimensions", "data": {"ctr": 0.09109730848861283, "position": 26.467908902691512, "date": "2021-09-14"}, "emitted_at": 1674600080131} +{"stream": "custom_dimensions", "data": {"ctr": 0.08528784648187633, "position": 27.658848614072493, "date": "2021-09-15"}, "emitted_at": 1674600080132} From f7524f0976b0356381c0bb8c92c507f6e91ad7ac Mon Sep 17 00:00:00 2001 From: Artem Inzhyyants <36314070+artem1205@users.noreply.github.com> Date: Wed, 25 Jan 2023 19:07:02 +0100 Subject: [PATCH 087/195] Source Facebook Marketing: set high test_strictness_level (#21826) --- .../acceptance-test-config.yml | 63 +++++++--- .../integration_tests/expected_records.jsonl | 109 ++++++++++++++++++ .../integration_tests/future_state.json | 10 ++ 3 files changed, 165 insertions(+), 17 deletions(-) create mode 100644 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/expected_records.jsonl diff --git a/airbyte-integrations/connectors/source-facebook-marketing/acceptance-test-config.yml b/airbyte-integrations/connectors/source-facebook-marketing/acceptance-test-config.yml index f7b5a6e5a19c1..3799cbc2e64ca 100644 --- a/airbyte-integrations/connectors/source-facebook-marketing/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-facebook-marketing/acceptance-test-config.yml @@ -1,26 +1,55 @@ # See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-facebook-marketing:dev -tests: +test_strictness_level: "high" +acceptance_tests: spec: - - spec_path: "integration_tests/spec.json" + tests: + - spec_path: "integration_tests/spec.json" connection: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + tests: + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" discovery: - - config_path: "secrets/config.json" - backward_compatibility_tests_config: - disable_for_version: "0.2.81" + tests: + - config_path: "secrets/config.json" basic_read: - - config_path: "secrets/config.json" - empty_streams: ["videos"] - timeout_seconds: 2400 + tests: + - config_path: "secrets/config.json" + empty_streams: + - name: "ad_account" + bypass_reason: "Cannot populate" + - name: "ad_sets" + bypass_reason: "Thumbnail urls changes permanently" + - name: "ad_creatives" + bypass_reason: "Thumbnail urls changes permanently" + - name: "ads_insights_age_and_gender" + bypass_reason: "Data not permanent" + - name: "ads_insights_region" + bypass_reason: "Data not permanent" + - name: "ads_insights_dma" + bypass_reason: "Data not permanent" + - name: "ads_insights_platform_and_device" + bypass_reason: "Data not permanent" + - name: "activities" + bypass_reason: "age field autoupdated" + - name: "custom_conversions" + bypass_reason: "Cannot populate" + - name: "images" + bypass_reason: "Links not permanent" + - name: "videos" + bypass_reason: "Cannot populate" + timeout_seconds: 2400 + expect_records: + path: "integration_tests/expected_records.jsonl" incremental: - - config_path: "secrets/config.json" - timeout_seconds: 2400 - future_state_path: "integration_tests/future_state.json" - skip_comprehensive_incremental_tests: true + tests: + - config_path: "secrets/config.json" + timeout_seconds: 2400 + future_state: + future_state_path: "integration_tests/future_state.json" full_refresh: - - config_path: "secrets/config.json" + tests: + - config_path: "secrets/config.json" diff --git a/airbyte-integrations/connectors/source-facebook-marketing/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-facebook-marketing/integration_tests/expected_records.jsonl new file mode 100644 index 0000000000000..e4c6d4b9ac176 --- /dev/null +++ b/airbyte-integrations/connectors/source-facebook-marketing/integration_tests/expected_records.jsonl @@ -0,0 +1,109 @@ +{"stream":"ads","data":{"bid_type":"ABSOLUTE_OCPM","account_id":"212551616838260","campaign_id":"23846765228240398","adset_id":"23846765228280398","status":"ACTIVE","creative":{"id":"23846784944290398"},"id":"23846784938030398","updated_time":"2021-08-27T08:32:19-0700","created_time":"2021-02-11T18:24:12-0800","name":"Stock photo ad 2","targeting":{"age_max":65,"age_min":18,"geo_locations":{"countries":["US"],"location_types":["home","recent"]},"brand_safety_content_filter_levels":["FACEBOOK_STANDARD","AN_STANDARD"]},"effective_status":"CAMPAIGN_PAUSED","last_updated_by_app_id":"119211728144504","source_ad_id":"0","tracking_specs":[{"action.type":["dwell"],"creative":["23846784944290398"]},{"action.type":["attention_event"],"creative":["23846784944290398"]},{"action.type":["link_click"],"post":["243077367363346"],"post.wall":["112704783733939"]},{"action.type":["post_engagement"],"page":["112704783733939"],"post":["243077367363346"]}]},"emitted_at":1674584126201} +{"stream":"ads","data":{"bid_type":"ABSOLUTE_OCPM","account_id":"212551616838260","campaign_id":"23846765228240398","adset_id":"23846765228280398","status":"ACTIVE","creative":{"id":"23846815595220398"},"id":"23846765228310398","updated_time":"2021-08-27T08:32:19-0700","created_time":"2021-02-09T15:04:15-0800","name":"Airbyte Ad","targeting":{"age_max":65,"age_min":18,"geo_locations":{"countries":["US"],"location_types":["home","recent"]},"brand_safety_content_filter_levels":["FACEBOOK_STANDARD","AN_STANDARD"]},"effective_status":"CAMPAIGN_PAUSED","last_updated_by_app_id":"119211728144504","source_ad_id":"0","tracking_specs":[{"action.type":["offsite_conversion"],"fb_pixel":["2667253716886462"]},{"action.type":["attention_event"],"creative":["23846815595220398"]},{"action.type":["post_engagement"],"page":["112704783733939"],"post":["244953057175777"]},{"action.type":["link_click"],"post":["244953057175777"],"post.wall":["112704783733939"]},{"action.type":["dwell"],"creative":["23846815595220398"]}]},"emitted_at":1674584126202} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-09","date_start":"2021-02-08","date_stop":"2021-02-08","engagement_rate_ranking":"UNKNOWN","frequency":0,"impressions":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584138535} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-09","date_start":"2021-02-09","date_stop":"2021-02-09","engagement_rate_ranking":"UNKNOWN","frequency":0,"impressions":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584138822} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-09","date_start":"2021-02-10","date_stop":"2021-02-10","engagement_rate_ranking":"UNKNOWN","frequency":0,"impressions":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584139237} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-11","date_start":"2021-02-10","date_stop":"2021-02-10","engagement_rate_ranking":"UNKNOWN","frequency":0,"impressions":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584139240} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.006571,"cost_per_inline_link_click":0.23,"cost_per_inline_post_engagement":0.23,"cost_per_unique_click":0.23,"cost_per_unique_inline_link_click":0.23,"cpc":0.23,"cpm":0.946502,"cpp":0.964361,"created_time":"2021-02-09","ctr":0.411523,"date_start":"2021-02-11","date_stop":"2021-02-11","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.675052,"estimated_ad_recallers":70,"frequency":1.018868,"impressions":486,"inline_link_click_ctr":0.411523,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":2}],"quality_ranking":"UNKNOWN","reach":477,"social_spend":0,"spend":0.46,"unique_actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.419287,"unique_inline_link_click_ctr":0.419287,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.419287,"unique_outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":2}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.411523}],"wish_bid":0},"emitted_at":1674584139606} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-11","date_start":"2021-02-11","date_stop":"2021-02-11","engagement_rate_ranking":"UNKNOWN","estimated_ad_recallers":0,"frequency":0,"impressions":0,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584139610} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.008667,"cpm":1.293532,"cpp":1.381142,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-12","date_stop":"2021-02-12","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":15.936255,"estimated_ad_recallers":120,"frequency":1.067729,"impressions":804,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":753,"social_spend":0,"spend":1.04,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584139982} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.007545,"cost_per_inline_link_click":0.83,"cost_per_inline_post_engagement":0.83,"cost_per_unique_click":0.83,"cost_per_unique_inline_link_click":0.83,"cpc":0.83,"cpm":1.111111,"cpp":1.173975,"created_time":"2021-02-11","ctr":0.133869,"date_start":"2021-02-12","date_stop":"2021-02-12","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":15.558699,"estimated_ad_recallers":110,"frequency":1.056577,"impressions":747,"inline_link_click_ctr":0.133869,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":707,"social_spend":0,"spend":0.83,"unique_actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.141443,"unique_inline_link_click_ctr":0.141443,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.141443,"unique_outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.133869}],"wish_bid":0},"emitted_at":1674584139986} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010727,"cost_per_inline_link_click":1.18,"cost_per_inline_post_engagement":1.18,"cost_per_unique_click":1.18,"cost_per_unique_inline_link_click":1.18,"cpc":1.18,"cpm":1.528497,"cpp":1.620879,"created_time":"2021-02-09","ctr":0.129534,"date_start":"2021-02-13","date_stop":"2021-02-13","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":15.10989,"estimated_ad_recallers":110,"frequency":1.06044,"impressions":772,"inline_link_click_ctr":0.129534,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":728,"social_spend":0,"spend":1.18,"unique_actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.137363,"unique_inline_link_click_ctr":0.137363,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.137363,"unique_outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.129534}],"wish_bid":0},"emitted_at":1674584140335} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.011286,"cost_per_inline_link_click":0.395,"cost_per_inline_post_engagement":0.395,"cost_per_unique_click":0.395,"cost_per_unique_inline_link_click":0.395,"cpc":0.395,"cpm":1.519231,"cpp":1.592742,"created_time":"2021-02-11","ctr":0.384615,"date_start":"2021-02-13","date_stop":"2021-02-13","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.112903,"estimated_ad_recallers":70,"frequency":1.048387,"impressions":520,"inline_link_click_ctr":0.384615,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":2}],"quality_ranking":"UNKNOWN","reach":496,"social_spend":0,"spend":0.79,"unique_actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.403226,"unique_inline_link_click_ctr":0.403226,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.403226,"unique_outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":2}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.384615}],"wish_bid":0},"emitted_at":1674584140340} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.009538,"cost_per_inline_link_click":1.24,"cost_per_inline_post_engagement":1.24,"cost_per_unique_click":1.24,"cost_per_unique_inline_link_click":1.24,"cpc":1.24,"cpm":1.27572,"cpp":1.341991,"created_time":"2021-02-09","ctr":0.102881,"date_start":"2021-02-14","date_stop":"2021-02-14","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.069264,"estimated_ad_recallers":130,"frequency":1.051948,"impressions":972,"inline_link_click_ctr":0.102881,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":924,"social_spend":0,"spend":1.24,"unique_actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.108225,"unique_inline_link_click_ctr":0.108225,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.108225,"unique_outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.102881}],"wish_bid":0},"emitted_at":1674584140719} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.008889,"cost_per_unique_click":0.8,"cpc":0.8,"cpm":1.255887,"cpp":1.296596,"created_time":"2021-02-11","ctr":0.156986,"date_start":"2021-02-14","date_stop":"2021-02-14","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.58671,"estimated_ad_recallers":90,"frequency":1.032415,"impressions":637,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":617,"social_spend":0,"spend":0.8,"unique_clicks":1,"unique_ctr":0.162075,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584140724} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.007,"cost_per_inline_link_click":0.396667,"cost_per_inline_post_engagement":0.396667,"cost_per_unique_click":0.396667,"cost_per_unique_inline_link_click":0.396667,"cpc":0.396667,"cpm":0.902199,"cpp":0.948207,"created_time":"2021-02-09","ctr":0.227445,"date_start":"2021-02-15","date_stop":"2021-02-15","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.545817,"estimated_ad_recallers":170,"frequency":1.050996,"impressions":1319,"inline_link_click_ctr":0.227445,"inline_link_clicks":3,"inline_post_engagement":3,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":3}],"quality_ranking":"UNKNOWN","reach":1255,"social_spend":0,"spend":1.19,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3}],"unique_clicks":3,"unique_ctr":0.239044,"unique_inline_link_click_ctr":0.239044,"unique_inline_link_clicks":3,"unique_link_clicks_ctr":0.239044,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":3}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.227445}],"wish_bid":0},"emitted_at":1674584141242} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.0085,"cpm":1.177285,"cpp":1.233672,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-15","date_stop":"2021-02-15","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.513788,"estimated_ad_recallers":100,"frequency":1.047896,"impressions":722,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":689,"social_spend":0,"spend":0.85,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584141248} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.007556,"cost_per_inline_link_click":1.36,"cost_per_inline_post_engagement":1.36,"cost_per_unique_click":0.68,"cost_per_unique_inline_link_click":1.36,"cpc":0.68,"cpm":0.995608,"cpp":1.038961,"created_time":"2021-02-09","ctr":0.146413,"date_start":"2021-02-16","date_stop":"2021-02-16","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.750955,"estimated_ad_recallers":180,"frequency":1.043545,"impressions":1366,"inline_link_click_ctr":0.073206,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":1309,"social_spend":0,"spend":1.36,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":2,"unique_ctr":0.152788,"unique_inline_link_click_ctr":0.076394,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.076394,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.073206}],"wish_bid":0},"emitted_at":1674584141626} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.009857,"cpm":1.219081,"cpp":1.268382,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-16","date_stop":"2021-02-16","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.867647,"estimated_ad_recallers":70,"frequency":1.040441,"impressions":566,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":544,"social_spend":0,"spend":0.69,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584141634} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.009273,"cost_per_inline_link_click":1.02,"cost_per_inline_post_engagement":1.02,"cost_per_unique_click":1.02,"cost_per_unique_inline_link_click":1.02,"cpc":1.02,"cpm":1.143498,"cpp":1.188811,"created_time":"2021-02-09","ctr":0.112108,"date_start":"2021-02-17","date_stop":"2021-02-17","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.820513,"estimated_ad_recallers":110,"frequency":1.039627,"impressions":892,"inline_link_click_ctr":0.112108,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":858,"social_spend":0,"spend":1.02,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.11655,"unique_inline_link_click_ctr":0.11655,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.11655,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.112108}],"wish_bid":0},"emitted_at":1674584142107} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.011222,"cost_per_inline_link_click":1.01,"cost_per_inline_post_engagement":1.01,"cost_per_unique_click":0.505,"cost_per_unique_inline_link_click":1.01,"cpc":0.505,"cpm":1.339523,"cpp":1.424542,"created_time":"2021-02-11","ctr":0.265252,"date_start":"2021-02-17","date_stop":"2021-02-17","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.693935,"estimated_ad_recallers":90,"frequency":1.06347,"impressions":754,"inline_link_click_ctr":0.132626,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":709,"social_spend":0,"spend":1.01,"unique_actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":2,"unique_ctr":0.282087,"unique_inline_link_click_ctr":0.141044,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.141044,"unique_outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.132626}],"wish_bid":0},"emitted_at":1674584142115} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010778,"cost_per_inline_link_click":0.97,"cost_per_inline_post_engagement":0.97,"cost_per_unique_click":0.97,"cost_per_unique_inline_link_click":0.97,"cpc":0.97,"cpm":1.284768,"cpp":1.337931,"created_time":"2021-02-09","ctr":0.13245,"date_start":"2021-02-18","date_stop":"2021-02-18","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.413793,"estimated_ad_recallers":90,"frequency":1.041379,"impressions":755,"inline_link_click_ctr":0.13245,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":725,"social_spend":0,"spend":0.97,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.137931,"unique_inline_link_click_ctr":0.137931,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.137931,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.13245}],"wish_bid":0},"emitted_at":1674584142467} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.011444,"cpm":1.237981,"cpp":1.2875,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-18","date_stop":"2021-02-18","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":11.25,"estimated_ad_recallers":90,"frequency":1.04,"impressions":832,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":800,"social_spend":0,"spend":1.03,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584142498} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010556,"cost_per_unique_click":0.316667,"cpc":0.316667,"cpm":1.353276,"cpp":1.41369,"created_time":"2021-02-09","ctr":0.42735,"date_start":"2021-02-19","date_stop":"2021-02-19","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.392857,"estimated_ad_recallers":90,"frequency":1.044643,"impressions":702,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":672,"social_spend":0,"spend":0.95,"unique_clicks":3,"unique_ctr":0.446429,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584142880} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.0107,"cost_per_inline_link_click":1.07,"cost_per_inline_post_engagement":1.07,"cost_per_unique_click":1.07,"cost_per_unique_inline_link_click":1.07,"cpc":1.07,"cpm":1.345912,"cpp":1.406045,"created_time":"2021-02-11","ctr":0.125786,"date_start":"2021-02-19","date_stop":"2021-02-19","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.140604,"estimated_ad_recallers":100,"frequency":1.044678,"impressions":795,"inline_link_click_ctr":0.125786,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":761,"social_spend":0,"spend":1.07,"unique_actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.131406,"unique_inline_link_click_ctr":0.131406,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.131406,"unique_outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.125786}],"wish_bid":0},"emitted_at":1674584142887} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.01,"cpm":1.335113,"cpp":1.398601,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-21","date_stop":"2021-02-21","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.986014,"estimated_ad_recallers":100,"frequency":1.047552,"impressions":749,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":715,"social_spend":0,"spend":1,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584143275} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010556,"cpm":1.310345,"cpp":1.370851,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-21","date_stop":"2021-02-21","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.987013,"estimated_ad_recallers":90,"frequency":1.046176,"impressions":725,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":693,"social_spend":0,"spend":0.95,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584143282} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.0104,"cost_per_inline_link_click":1.04,"cost_per_inline_post_engagement":1.04,"cost_per_unique_click":0.346667,"cost_per_unique_inline_link_click":1.04,"cpc":0.346667,"cpm":1.438451,"cpp":1.522694,"created_time":"2021-02-09","ctr":0.414938,"date_start":"2021-02-20","date_stop":"2021-02-20","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.641288,"estimated_ad_recallers":100,"frequency":1.058565,"impressions":723,"inline_link_click_ctr":0.138313,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"quality_ranking":"UNKNOWN","reach":683,"social_spend":0,"spend":1.04,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":3,"unique_ctr":0.439239,"unique_inline_link_click_ctr":0.146413,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.146413,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.138313}],"wish_bid":0},"emitted_at":1674584144209} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010889,"cpm":1.412104,"cpp":1.484848,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-20","date_stop":"2021-02-20","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.636364,"estimated_ad_recallers":90,"frequency":1.051515,"impressions":694,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":660,"social_spend":0,"spend":0.98,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584144216} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010444,"cost_per_unique_click":0.94,"cpc":0.94,"cpm":1.289438,"cpp":1.327684,"created_time":"2021-02-09","ctr":0.137174,"date_start":"2021-02-22","date_stop":"2021-02-22","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.711864,"estimated_ad_recallers":90,"frequency":1.029661,"impressions":729,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":708,"social_spend":0,"spend":0.94,"unique_clicks":1,"unique_ctr":0.141243,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584144516} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.011125,"cpm":1.332335,"cpp":1.37558,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-22","date_stop":"2021-02-22","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.36476,"estimated_ad_recallers":80,"frequency":1.032457,"impressions":668,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":647,"social_spend":0,"spend":0.89,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584144520} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010455,"cost_per_inline_link_click":0.575,"cost_per_inline_post_engagement":0.575,"cost_per_unique_click":0.575,"cost_per_unique_inline_link_click":0.575,"cpc":0.575,"cpm":1.320321,"cpp":1.382212,"created_time":"2021-02-09","ctr":0.229621,"date_start":"2021-02-23","date_stop":"2021-02-23","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.221154,"estimated_ad_recallers":110,"frequency":1.046875,"impressions":871,"inline_link_click_ctr":0.229621,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":2}],"quality_ranking":"UNKNOWN","reach":832,"social_spend":0,"spend":1.15,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.240385,"unique_inline_link_click_ctr":0.240385,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.240385,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":2}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.229621}],"wish_bid":0},"emitted_at":1674584145012} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"post_reaction","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.011143,"cost_per_inline_post_engagement":0.78,"cpm":1.433824,"cpp":1.508704,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-23","date_stop":"2021-02-23","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.539652,"estimated_ad_recallers":70,"frequency":1.052224,"impressions":544,"inline_link_clicks":0,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":517,"social_spend":0,"spend":0.78,"unique_actions":[{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"post_reaction","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584145021} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.012222,"cost_per_unique_click":1.1,"cpc":1.1,"cpm":1.544944,"cpp":1.617647,"created_time":"2021-02-09","ctr":0.140449,"date_start":"2021-02-24","date_stop":"2021-02-24","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.235294,"estimated_ad_recallers":90,"frequency":1.047059,"impressions":712,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":680,"social_spend":0,"spend":1.1,"unique_clicks":1,"unique_ctr":0.147059,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584145480} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.0146,"cpm":1.533613,"cpp":1.593886,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-24","date_stop":"2021-02-24","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":10.917031,"estimated_ad_recallers":50,"frequency":1.039301,"impressions":476,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":458,"social_spend":0,"spend":0.73,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584145487} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.013778,"cpm":1.715076,"cpp":1.789322,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-25","date_stop":"2021-02-25","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.987013,"estimated_ad_recallers":90,"frequency":1.04329,"impressions":723,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":693,"social_spend":0,"spend":1.24,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584145991} +{"stream":"ads_insights","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.018,"cpm":1.930295,"cpp":2,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-25","date_stop":"2021-02-25","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":11.111111,"estimated_ad_recallers":40,"frequency":1.036111,"impressions":373,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":360,"social_spend":0,"spend":0.72,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584145998} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"cost_per_estimated_ad_recallers":0.006571,"cost_per_inline_link_click":0.23,"cost_per_inline_post_engagement":0.23,"cost_per_unique_click":0.23,"cost_per_unique_inline_link_click":0.23,"cpc":0.23,"cpm":0.946502,"cpp":0.964361,"created_time":"2021-02-09","ctr":0.411523,"date_start":"2021-02-11","date_stop":"2021-02-11","estimated_ad_recall_rate":14.675052,"estimated_ad_recallers":70,"frequency":1.018868,"impressions":486,"inline_link_click_ctr":0.411523,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":2}],"reach":477,"spend":0.46,"unique_actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.419287,"unique_inline_link_click_ctr":0.419287,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.419287,"unique_outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":2}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.411523}],"country":"US"},"emitted_at":1674584182831} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.008667,"cpm":1.293532,"cpp":1.381142,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-12","date_stop":"2021-02-12","estimated_ad_recall_rate":15.936255,"estimated_ad_recallers":120,"frequency":1.067729,"impressions":804,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":753,"spend":1.04,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584183202} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.007545,"cost_per_inline_link_click":0.83,"cost_per_inline_post_engagement":0.83,"cost_per_unique_click":0.83,"cost_per_unique_inline_link_click":0.83,"cpc":0.83,"cpm":1.111111,"cpp":1.173975,"created_time":"2021-02-11","ctr":0.133869,"date_start":"2021-02-12","date_stop":"2021-02-12","estimated_ad_recall_rate":15.558699,"estimated_ad_recallers":110,"frequency":1.056577,"impressions":747,"inline_link_click_ctr":0.133869,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"reach":707,"spend":0.83,"unique_actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.141443,"unique_inline_link_click_ctr":0.141443,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.141443,"unique_outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.133869}],"country":"US"},"emitted_at":1674584183214} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.010727,"cost_per_inline_link_click":1.18,"cost_per_inline_post_engagement":1.18,"cost_per_unique_click":1.18,"cost_per_unique_inline_link_click":1.18,"cpc":1.18,"cpm":1.528497,"cpp":1.620879,"created_time":"2021-02-09","ctr":0.129534,"date_start":"2021-02-13","date_stop":"2021-02-13","estimated_ad_recall_rate":15.10989,"estimated_ad_recallers":110,"frequency":1.06044,"impressions":772,"inline_link_click_ctr":0.129534,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":1}],"reach":728,"spend":1.18,"unique_actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.137363,"unique_inline_link_click_ctr":0.137363,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.137363,"unique_outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.129534}],"country":"US"},"emitted_at":1674584183629} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"cost_per_estimated_ad_recallers":0.011286,"cost_per_inline_link_click":0.395,"cost_per_inline_post_engagement":0.395,"cost_per_unique_click":0.395,"cost_per_unique_inline_link_click":0.395,"cpc":0.395,"cpm":1.519231,"cpp":1.592742,"created_time":"2021-02-11","ctr":0.384615,"date_start":"2021-02-13","date_stop":"2021-02-13","estimated_ad_recall_rate":14.112903,"estimated_ad_recallers":70,"frequency":1.048387,"impressions":520,"inline_link_click_ctr":0.384615,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":2}],"reach":496,"spend":0.79,"unique_actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.403226,"unique_inline_link_click_ctr":0.403226,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.403226,"unique_outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":2}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.384615}],"country":"US"},"emitted_at":1674584183642} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.009538,"cost_per_inline_link_click":1.24,"cost_per_inline_post_engagement":1.24,"cost_per_unique_click":1.24,"cost_per_unique_inline_link_click":1.24,"cpc":1.24,"cpm":1.27572,"cpp":1.341991,"created_time":"2021-02-09","ctr":0.102881,"date_start":"2021-02-14","date_stop":"2021-02-14","estimated_ad_recall_rate":14.069264,"estimated_ad_recallers":130,"frequency":1.051948,"impressions":972,"inline_link_click_ctr":0.102881,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":1}],"reach":924,"spend":1.24,"unique_actions":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.108225,"unique_inline_link_click_ctr":0.108225,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.108225,"unique_outbound_clicks":[{"action_destination":"241903844147365","action_target_id":"241903844147365","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.102881}],"country":"US"},"emitted_at":1674584184033} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.008889,"cost_per_unique_click":0.8,"cpc":0.8,"cpm":1.255887,"cpp":1.296596,"created_time":"2021-02-11","ctr":0.156986,"date_start":"2021-02-14","date_stop":"2021-02-14","estimated_ad_recall_rate":14.58671,"estimated_ad_recallers":90,"frequency":1.032415,"impressions":637,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":617,"spend":0.8,"unique_clicks":1,"unique_ctr":0.162075,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584184041} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"cost_per_estimated_ad_recallers":0.007,"cost_per_inline_link_click":0.396667,"cost_per_inline_post_engagement":0.396667,"cost_per_unique_click":0.396667,"cost_per_unique_inline_link_click":0.396667,"cpc":0.396667,"cpm":0.902199,"cpp":0.948207,"created_time":"2021-02-09","ctr":0.227445,"date_start":"2021-02-15","date_stop":"2021-02-15","estimated_ad_recall_rate":13.545817,"estimated_ad_recallers":170,"frequency":1.050996,"impressions":1319,"inline_link_click_ctr":0.227445,"inline_link_clicks":3,"inline_post_engagement":3,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":3}],"reach":1255,"spend":1.19,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3}],"unique_clicks":3,"unique_ctr":0.239044,"unique_inline_link_click_ctr":0.239044,"unique_inline_link_clicks":3,"unique_link_clicks_ctr":0.239044,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":3}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.227445}],"country":"US"},"emitted_at":1674584184368} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.0085,"cpm":1.177285,"cpp":1.233672,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-15","date_stop":"2021-02-15","estimated_ad_recall_rate":14.513788,"estimated_ad_recallers":100,"frequency":1.047896,"impressions":722,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":689,"spend":0.85,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584184378} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"cost_per_estimated_ad_recallers":0.007556,"cost_per_inline_link_click":1.36,"cost_per_inline_post_engagement":1.36,"cost_per_unique_click":0.68,"cost_per_unique_inline_link_click":1.36,"cpc":0.68,"cpm":0.995608,"cpp":1.038961,"created_time":"2021-02-09","ctr":0.146413,"date_start":"2021-02-16","date_stop":"2021-02-16","estimated_ad_recall_rate":13.750955,"estimated_ad_recallers":180,"frequency":1.043545,"impressions":1366,"inline_link_click_ctr":0.073206,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"reach":1309,"spend":1.36,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":2,"unique_ctr":0.152788,"unique_inline_link_click_ctr":0.076394,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.076394,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.073206}],"country":"US"},"emitted_at":1674584184782} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.009857,"cpm":1.219081,"cpp":1.268382,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-16","date_stop":"2021-02-16","estimated_ad_recall_rate":12.867647,"estimated_ad_recallers":70,"frequency":1.040441,"impressions":566,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":544,"spend":0.69,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584184798} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.009273,"cost_per_inline_link_click":1.02,"cost_per_inline_post_engagement":1.02,"cost_per_unique_click":1.02,"cost_per_unique_inline_link_click":1.02,"cpc":1.02,"cpm":1.143498,"cpp":1.188811,"created_time":"2021-02-09","ctr":0.112108,"date_start":"2021-02-17","date_stop":"2021-02-17","estimated_ad_recall_rate":12.820513,"estimated_ad_recallers":110,"frequency":1.039627,"impressions":892,"inline_link_click_ctr":0.112108,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"reach":858,"spend":1.02,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.11655,"unique_inline_link_click_ctr":0.11655,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.11655,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.112108}],"country":"US"},"emitted_at":1674584185205} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"cost_per_estimated_ad_recallers":0.011222,"cost_per_inline_link_click":1.01,"cost_per_inline_post_engagement":1.01,"cost_per_unique_click":0.505,"cost_per_unique_inline_link_click":1.01,"cpc":0.505,"cpm":1.339523,"cpp":1.424542,"created_time":"2021-02-11","ctr":0.265252,"date_start":"2021-02-17","date_stop":"2021-02-17","estimated_ad_recall_rate":12.693935,"estimated_ad_recallers":90,"frequency":1.06347,"impressions":754,"inline_link_click_ctr":0.132626,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"reach":709,"spend":1.01,"unique_actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":2,"unique_ctr":0.282087,"unique_inline_link_click_ctr":0.141044,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.141044,"unique_outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.132626}],"country":"US"},"emitted_at":1674584185218} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.010778,"cost_per_inline_link_click":0.97,"cost_per_inline_post_engagement":0.97,"cost_per_unique_click":0.97,"cost_per_unique_inline_link_click":0.97,"cpc":0.97,"cpm":1.284768,"cpp":1.337931,"created_time":"2021-02-09","ctr":0.13245,"date_start":"2021-02-18","date_stop":"2021-02-18","estimated_ad_recall_rate":12.413793,"estimated_ad_recallers":90,"frequency":1.041379,"impressions":755,"inline_link_click_ctr":0.13245,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"reach":725,"spend":0.97,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.137931,"unique_inline_link_click_ctr":0.137931,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.137931,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.13245}],"country":"US"},"emitted_at":1674584185817} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.011444,"cpm":1.237981,"cpp":1.2875,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-18","date_stop":"2021-02-18","estimated_ad_recall_rate":11.25,"estimated_ad_recallers":90,"frequency":1.04,"impressions":832,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":800,"spend":1.03,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584185835} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"cost_per_estimated_ad_recallers":0.010556,"cost_per_unique_click":0.316667,"cpc":0.316667,"cpm":1.353276,"cpp":1.41369,"created_time":"2021-02-09","ctr":0.42735,"date_start":"2021-02-19","date_stop":"2021-02-19","estimated_ad_recall_rate":13.392857,"estimated_ad_recallers":90,"frequency":1.044643,"impressions":702,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":672,"spend":0.95,"unique_clicks":3,"unique_ctr":0.446429,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584186120} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.0107,"cost_per_inline_link_click":1.07,"cost_per_inline_post_engagement":1.07,"cost_per_unique_click":1.07,"cost_per_unique_inline_link_click":1.07,"cpc":1.07,"cpm":1.345912,"cpp":1.406045,"created_time":"2021-02-11","ctr":0.125786,"date_start":"2021-02-19","date_stop":"2021-02-19","estimated_ad_recall_rate":13.140604,"estimated_ad_recallers":100,"frequency":1.044678,"impressions":795,"inline_link_click_ctr":0.125786,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"reach":761,"spend":1.07,"unique_actions":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.131406,"unique_inline_link_click_ctr":0.131406,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.131406,"unique_outbound_clicks":[{"action_destination":"243077367363346","action_target_id":"243077367363346","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.125786}],"country":"US"},"emitted_at":1674584186138} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"cost_per_estimated_ad_recallers":0.0104,"cost_per_inline_link_click":1.04,"cost_per_inline_post_engagement":1.04,"cost_per_unique_click":0.346667,"cost_per_unique_inline_link_click":1.04,"cpc":0.346667,"cpm":1.438451,"cpp":1.522694,"created_time":"2021-02-09","ctr":0.414938,"date_start":"2021-02-20","date_stop":"2021-02-20","estimated_ad_recall_rate":14.641288,"estimated_ad_recallers":100,"frequency":1.058565,"impressions":723,"inline_link_click_ctr":0.138313,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"reach":683,"spend":1.04,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":3,"unique_ctr":0.439239,"unique_inline_link_click_ctr":0.146413,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.146413,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":1}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.138313}],"country":"US"},"emitted_at":1674584186561} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.010889,"cpm":1.412104,"cpp":1.484848,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-20","date_stop":"2021-02-20","estimated_ad_recall_rate":13.636364,"estimated_ad_recallers":90,"frequency":1.051515,"impressions":694,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":660,"spend":0.98,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584186575} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.01,"cpm":1.335113,"cpp":1.398601,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-21","date_stop":"2021-02-21","estimated_ad_recall_rate":13.986014,"estimated_ad_recallers":100,"frequency":1.047552,"impressions":749,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":715,"spend":1,"unique_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584187334} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.010556,"cpm":1.310345,"cpp":1.370851,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-21","date_stop":"2021-02-21","estimated_ad_recall_rate":12.987013,"estimated_ad_recallers":90,"frequency":1.046176,"impressions":725,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":693,"spend":0.95,"unique_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584187345} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.010444,"cost_per_unique_click":0.94,"cpc":0.94,"cpm":1.289438,"cpp":1.327684,"created_time":"2021-02-09","ctr":0.137174,"date_start":"2021-02-22","date_stop":"2021-02-22","estimated_ad_recall_rate":12.711864,"estimated_ad_recallers":90,"frequency":1.029661,"impressions":729,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":708,"spend":0.94,"unique_clicks":1,"unique_ctr":0.141243,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584187759} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.011125,"cpm":1.332335,"cpp":1.37558,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-22","date_stop":"2021-02-22","estimated_ad_recall_rate":12.36476,"estimated_ad_recallers":80,"frequency":1.032457,"impressions":668,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":647,"spend":0.89,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584187771} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"cost_per_estimated_ad_recallers":0.010455,"cost_per_inline_link_click":0.575,"cost_per_inline_post_engagement":0.575,"cost_per_unique_click":0.575,"cost_per_unique_inline_link_click":0.575,"cpc":0.575,"cpm":1.320321,"cpp":1.382212,"created_time":"2021-02-09","ctr":0.229621,"date_start":"2021-02-23","date_stop":"2021-02-23","estimated_ad_recall_rate":13.221154,"estimated_ad_recallers":110,"frequency":1.046875,"impressions":871,"inline_link_click_ctr":0.229621,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":2}],"reach":832,"spend":1.15,"unique_actions":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.240385,"unique_inline_link_click_ctr":0.240385,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.240385,"unique_outbound_clicks":[{"action_destination":"244953057175777","action_target_id":"244953057175777","action_type":"outbound_click","value":2}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.229621}],"country":"US"},"emitted_at":1674584188164} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"post_reaction","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.011143,"cost_per_inline_post_engagement":0.78,"cpm":1.433824,"cpp":1.508704,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-23","date_stop":"2021-02-23","estimated_ad_recall_rate":13.539652,"estimated_ad_recallers":70,"frequency":1.052224,"impressions":544,"inline_link_clicks":0,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":517,"spend":0.78,"unique_actions":[{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"post_reaction","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_destination":"Airbyte","action_target_id":"112704783733939","action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584188176} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"cost_per_estimated_ad_recallers":0.012222,"cost_per_unique_click":1.1,"cpc":1.1,"cpm":1.544944,"cpp":1.617647,"created_time":"2021-02-09","ctr":0.140449,"date_start":"2021-02-24","date_stop":"2021-02-24","estimated_ad_recall_rate":13.235294,"estimated_ad_recallers":90,"frequency":1.047059,"impressions":712,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":680,"spend":1.1,"unique_clicks":1,"unique_ctr":0.147059,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584188400} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.0146,"cpm":1.533613,"cpp":1.593886,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-24","date_stop":"2021-02-24","estimated_ad_recall_rate":10.917031,"estimated_ad_recallers":50,"frequency":1.039301,"impressions":476,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":458,"spend":0.73,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584188411} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.013778,"cpm":1.715076,"cpp":1.789322,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-25","date_stop":"2021-02-25","estimated_ad_recall_rate":12.987013,"estimated_ad_recallers":90,"frequency":1.04329,"impressions":723,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":693,"spend":1.24,"unique_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584188850} +{"stream":"ads_insights_country","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"cost_per_estimated_ad_recallers":0.018,"cpm":1.930295,"cpp":2,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-25","date_stop":"2021-02-25","estimated_ad_recall_rate":11.111111,"estimated_ad_recallers":40,"frequency":1.036111,"impressions":373,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","reach":360,"spend":0.72,"unique_ctr":0,"updated_time":"2021-08-27","country":"US"},"emitted_at":1674584188862} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-09","date_start":"2021-02-08","date_stop":"2021-02-08","engagement_rate_ranking":"UNKNOWN","frequency":0,"impressions":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584315775} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-09","date_start":"2021-02-09","date_stop":"2021-02-09","engagement_rate_ranking":"UNKNOWN","frequency":0,"impressions":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584316128} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-09","date_start":"2021-02-10","date_stop":"2021-02-10","engagement_rate_ranking":"UNKNOWN","frequency":0,"impressions":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584316470} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-11","date_start":"2021-02-10","date_stop":"2021-02-10","engagement_rate_ranking":"UNKNOWN","frequency":0,"impressions":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584316484} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":0.23,"1d_click":0.23,"7d_click":0.23,"28d_click":0.23},{"action_type":"page_engagement","value":0.23,"1d_click":0.23,"7d_click":0.23,"28d_click":0.23},{"action_type":"post_engagement","value":0.23,"1d_click":0.23,"7d_click":0.23,"28d_click":0.23}],"cost_per_estimated_ad_recallers":0.006571,"cost_per_inline_link_click":0.23,"cost_per_inline_post_engagement":0.23,"cost_per_outbound_click":[{"action_type":"outbound_click","value":0.23}],"cost_per_unique_action_type":[{"action_type":"link_click","value":0.23,"1d_click":0.23,"7d_click":0.23,"28d_click":0.23},{"action_type":"page_engagement","value":0.23,"1d_click":0.23,"7d_click":0.23,"28d_click":0.23},{"action_type":"post_engagement","value":0.23,"1d_click":0.23,"7d_click":0.23,"28d_click":0.23}],"cost_per_unique_click":0.23,"cost_per_unique_inline_link_click":0.23,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":0.23}],"cpc":0.23,"cpm":0.946502,"cpp":0.964361,"created_time":"2021-02-09","ctr":0.411523,"date_start":"2021-02-11","date_stop":"2021-02-11","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.675052,"estimated_ad_recallers":70,"frequency":1.018868,"impressions":486,"inline_link_click_ctr":0.411523,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":2}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.411523}],"quality_ranking":"UNKNOWN","reach":477,"social_spend":0,"spend":0.46,"unique_actions":[{"action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.419287,"unique_inline_link_click_ctr":0.419287,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.419287,"unique_outbound_clicks":[{"action_type":"outbound_click","value":2}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.419287}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.411523}],"wish_bid":0},"emitted_at":1674584317006} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","created_time":"2021-02-11","date_start":"2021-02-11","date_stop":"2021-02-11","engagement_rate_ranking":"UNKNOWN","estimated_ad_recallers":0,"frequency":0,"impressions":0,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":0,"social_spend":0,"spend":0,"unique_clicks":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584317018} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.008667,"cpm":1.293532,"cpp":1.381142,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-12","date_stop":"2021-02-12","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":15.936255,"estimated_ad_recallers":120,"frequency":1.067729,"impressions":804,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":753,"social_spend":0,"spend":1.04,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584317423} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":0.83,"1d_click":0.83,"7d_click":0.83,"28d_click":0.83},{"action_type":"page_engagement","value":0.83,"1d_click":0.83,"7d_click":0.83,"28d_click":0.83},{"action_type":"post_engagement","value":0.83,"1d_click":0.83,"7d_click":0.83,"28d_click":0.83}],"cost_per_estimated_ad_recallers":0.007545,"cost_per_inline_link_click":0.83,"cost_per_inline_post_engagement":0.83,"cost_per_outbound_click":[{"action_type":"outbound_click","value":0.83}],"cost_per_unique_action_type":[{"action_type":"link_click","value":0.83,"1d_click":0.83,"7d_click":0.83,"28d_click":0.83},{"action_type":"page_engagement","value":0.83,"1d_click":0.83,"7d_click":0.83,"28d_click":0.83},{"action_type":"post_engagement","value":0.83,"1d_click":0.83,"7d_click":0.83,"28d_click":0.83}],"cost_per_unique_click":0.83,"cost_per_unique_inline_link_click":0.83,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":0.83}],"cpc":0.83,"cpm":1.111111,"cpp":1.173975,"created_time":"2021-02-11","ctr":0.133869,"date_start":"2021-02-12","date_stop":"2021-02-12","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":15.558699,"estimated_ad_recallers":110,"frequency":1.056577,"impressions":747,"inline_link_click_ctr":0.133869,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.133869}],"quality_ranking":"UNKNOWN","reach":707,"social_spend":0,"spend":0.83,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.141443,"unique_inline_link_click_ctr":0.141443,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.141443,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.141443}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.133869}],"wish_bid":0},"emitted_at":1674584317431} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":1.18,"1d_click":1.18,"7d_click":1.18,"28d_click":1.18},{"action_type":"page_engagement","value":1.18,"1d_click":1.18,"7d_click":1.18,"28d_click":1.18},{"action_type":"post_engagement","value":1.18,"1d_click":1.18,"7d_click":1.18,"28d_click":1.18}],"cost_per_estimated_ad_recallers":0.010727,"cost_per_inline_link_click":1.18,"cost_per_inline_post_engagement":1.18,"cost_per_outbound_click":[{"action_type":"outbound_click","value":1.18}],"cost_per_unique_action_type":[{"action_type":"link_click","value":1.18,"1d_click":1.18,"7d_click":1.18,"28d_click":1.18},{"action_type":"page_engagement","value":1.18,"1d_click":1.18,"7d_click":1.18,"28d_click":1.18},{"action_type":"post_engagement","value":1.18,"1d_click":1.18,"7d_click":1.18,"28d_click":1.18}],"cost_per_unique_click":1.18,"cost_per_unique_inline_link_click":1.18,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":1.18}],"cpc":1.18,"cpm":1.528497,"cpp":1.620879,"created_time":"2021-02-09","ctr":0.129534,"date_start":"2021-02-13","date_stop":"2021-02-13","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":15.10989,"estimated_ad_recallers":110,"frequency":1.06044,"impressions":772,"inline_link_click_ctr":0.129534,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.129534}],"quality_ranking":"UNKNOWN","reach":728,"social_spend":0,"spend":1.18,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.137363,"unique_inline_link_click_ctr":0.137363,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.137363,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.137363}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.129534}],"wish_bid":0},"emitted_at":1674584317931} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":0.395,"1d_click":0.395,"7d_click":0.395,"28d_click":0.395},{"action_type":"page_engagement","value":0.395,"1d_click":0.395,"7d_click":0.395,"28d_click":0.395},{"action_type":"post_engagement","value":0.395,"1d_click":0.395,"7d_click":0.395,"28d_click":0.395}],"cost_per_estimated_ad_recallers":0.011286,"cost_per_inline_link_click":0.395,"cost_per_inline_post_engagement":0.395,"cost_per_outbound_click":[{"action_type":"outbound_click","value":0.395}],"cost_per_unique_action_type":[{"action_type":"link_click","value":0.395,"1d_click":0.395,"7d_click":0.395,"28d_click":0.395},{"action_type":"page_engagement","value":0.395,"1d_click":0.395,"7d_click":0.395,"28d_click":0.395},{"action_type":"post_engagement","value":0.395,"1d_click":0.395,"7d_click":0.395,"28d_click":0.395}],"cost_per_unique_click":0.395,"cost_per_unique_inline_link_click":0.395,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":0.395}],"cpc":0.395,"cpm":1.519231,"cpp":1.592742,"created_time":"2021-02-11","ctr":0.384615,"date_start":"2021-02-13","date_stop":"2021-02-13","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.112903,"estimated_ad_recallers":70,"frequency":1.048387,"impressions":520,"inline_link_click_ctr":0.384615,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":2}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.384615}],"quality_ranking":"UNKNOWN","reach":496,"social_spend":0,"spend":0.79,"unique_actions":[{"action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.403226,"unique_inline_link_click_ctr":0.403226,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.403226,"unique_outbound_clicks":[{"action_type":"outbound_click","value":2}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.403226}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.384615}],"wish_bid":0},"emitted_at":1674584317939} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":1.24,"1d_click":1.24,"7d_click":1.24,"28d_click":1.24},{"action_type":"page_engagement","value":1.24,"1d_click":1.24,"7d_click":1.24,"28d_click":1.24},{"action_type":"post_engagement","value":1.24,"1d_click":1.24,"7d_click":1.24,"28d_click":1.24}],"cost_per_estimated_ad_recallers":0.009538,"cost_per_inline_link_click":1.24,"cost_per_inline_post_engagement":1.24,"cost_per_outbound_click":[{"action_type":"outbound_click","value":1.24}],"cost_per_unique_action_type":[{"action_type":"link_click","value":1.24,"1d_click":1.24,"7d_click":1.24,"28d_click":1.24},{"action_type":"page_engagement","value":1.24,"1d_click":1.24,"7d_click":1.24,"28d_click":1.24},{"action_type":"post_engagement","value":1.24,"1d_click":1.24,"7d_click":1.24,"28d_click":1.24}],"cost_per_unique_click":1.24,"cost_per_unique_inline_link_click":1.24,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":1.24}],"cpc":1.24,"cpm":1.27572,"cpp":1.341991,"created_time":"2021-02-09","ctr":0.102881,"date_start":"2021-02-14","date_stop":"2021-02-14","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.069264,"estimated_ad_recallers":130,"frequency":1.051948,"impressions":972,"inline_link_click_ctr":0.102881,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.102881}],"quality_ranking":"UNKNOWN","reach":924,"social_spend":0,"spend":1.24,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.108225,"unique_inline_link_click_ctr":0.108225,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.108225,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.108225}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.102881}],"wish_bid":0},"emitted_at":1674584318432} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.008889,"cost_per_unique_click":0.8,"cpc":0.8,"cpm":1.255887,"cpp":1.296596,"created_time":"2021-02-11","ctr":0.156986,"date_start":"2021-02-14","date_stop":"2021-02-14","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.58671,"estimated_ad_recallers":90,"frequency":1.032415,"impressions":637,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":617,"social_spend":0,"spend":0.8,"unique_clicks":1,"unique_ctr":0.162075,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584318443} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_type":"page_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_type":"post_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":0.396667,"1d_click":0.396667,"7d_click":0.396667,"28d_click":0.396667},{"action_type":"page_engagement","value":0.396667,"1d_click":0.396667,"7d_click":0.396667,"28d_click":0.396667},{"action_type":"post_engagement","value":0.396667,"1d_click":0.396667,"7d_click":0.396667,"28d_click":0.396667}],"cost_per_estimated_ad_recallers":0.007,"cost_per_inline_link_click":0.396667,"cost_per_inline_post_engagement":0.396667,"cost_per_outbound_click":[{"action_type":"outbound_click","value":0.396667}],"cost_per_unique_action_type":[{"action_type":"link_click","value":0.396667,"1d_click":0.396667,"7d_click":0.396667,"28d_click":0.396667},{"action_type":"page_engagement","value":0.396667,"1d_click":0.396667,"7d_click":0.396667,"28d_click":0.396667},{"action_type":"post_engagement","value":0.396667,"1d_click":0.396667,"7d_click":0.396667,"28d_click":0.396667}],"cost_per_unique_click":0.396667,"cost_per_unique_inline_link_click":0.396667,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":0.396667}],"cpc":0.396667,"cpm":0.902199,"cpp":0.948207,"created_time":"2021-02-09","ctr":0.227445,"date_start":"2021-02-15","date_stop":"2021-02-15","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.545817,"estimated_ad_recallers":170,"frequency":1.050996,"impressions":1319,"inline_link_click_ctr":0.227445,"inline_link_clicks":3,"inline_post_engagement":3,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":3}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.227445}],"quality_ranking":"UNKNOWN","reach":1255,"social_spend":0,"spend":1.19,"unique_actions":[{"action_type":"link_click","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_type":"page_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3},{"action_type":"post_engagement","value":3,"1d_click":3,"7d_click":3,"28d_click":3}],"unique_clicks":3,"unique_ctr":0.239044,"unique_inline_link_click_ctr":0.239044,"unique_inline_link_clicks":3,"unique_link_clicks_ctr":0.239044,"unique_outbound_clicks":[{"action_type":"outbound_click","value":3}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.239044}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.227445}],"wish_bid":0},"emitted_at":1674584318855} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.0085,"cpm":1.177285,"cpp":1.233672,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-15","date_stop":"2021-02-15","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.513788,"estimated_ad_recallers":100,"frequency":1.047896,"impressions":722,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":689,"social_spend":0,"spend":0.85,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584318863} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":1.36,"1d_click":1.36,"7d_click":1.36,"28d_click":1.36},{"action_type":"page_engagement","value":1.36,"1d_click":1.36,"7d_click":1.36,"28d_click":1.36},{"action_type":"post_engagement","value":1.36,"1d_click":1.36,"7d_click":1.36,"28d_click":1.36}],"cost_per_estimated_ad_recallers":0.007556,"cost_per_inline_link_click":1.36,"cost_per_inline_post_engagement":1.36,"cost_per_outbound_click":[{"action_type":"outbound_click","value":1.36}],"cost_per_unique_action_type":[{"action_type":"link_click","value":1.36,"1d_click":1.36,"7d_click":1.36,"28d_click":1.36},{"action_type":"page_engagement","value":1.36,"1d_click":1.36,"7d_click":1.36,"28d_click":1.36},{"action_type":"post_engagement","value":1.36,"1d_click":1.36,"7d_click":1.36,"28d_click":1.36}],"cost_per_unique_click":0.68,"cost_per_unique_inline_link_click":1.36,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":1.36}],"cpc":0.68,"cpm":0.995608,"cpp":1.038961,"created_time":"2021-02-09","ctr":0.146413,"date_start":"2021-02-16","date_stop":"2021-02-16","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.750955,"estimated_ad_recallers":180,"frequency":1.043545,"impressions":1366,"inline_link_click_ctr":0.073206,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.073206}],"quality_ranking":"UNKNOWN","reach":1309,"social_spend":0,"spend":1.36,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":2,"unique_ctr":0.152788,"unique_inline_link_click_ctr":0.076394,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.076394,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.076394}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.073206}],"wish_bid":0},"emitted_at":1674584319245} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.009857,"cpm":1.219081,"cpp":1.268382,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-16","date_stop":"2021-02-16","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.867647,"estimated_ad_recallers":70,"frequency":1.040441,"impressions":566,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":544,"social_spend":0,"spend":0.69,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584319257} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":1.02,"1d_click":1.02,"7d_click":1.02,"28d_click":1.02},{"action_type":"page_engagement","value":1.02,"1d_click":1.02,"7d_click":1.02,"28d_click":1.02},{"action_type":"post_engagement","value":1.02,"1d_click":1.02,"7d_click":1.02,"28d_click":1.02}],"cost_per_estimated_ad_recallers":0.009273,"cost_per_inline_link_click":1.02,"cost_per_inline_post_engagement":1.02,"cost_per_outbound_click":[{"action_type":"outbound_click","value":1.02}],"cost_per_unique_action_type":[{"action_type":"link_click","value":1.02,"1d_click":1.02,"7d_click":1.02,"28d_click":1.02},{"action_type":"page_engagement","value":1.02,"1d_click":1.02,"7d_click":1.02,"28d_click":1.02},{"action_type":"post_engagement","value":1.02,"1d_click":1.02,"7d_click":1.02,"28d_click":1.02}],"cost_per_unique_click":1.02,"cost_per_unique_inline_link_click":1.02,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":1.02}],"cpc":1.02,"cpm":1.143498,"cpp":1.188811,"created_time":"2021-02-09","ctr":0.112108,"date_start":"2021-02-17","date_stop":"2021-02-17","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.820513,"estimated_ad_recallers":110,"frequency":1.039627,"impressions":892,"inline_link_click_ctr":0.112108,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.112108}],"quality_ranking":"UNKNOWN","reach":858,"social_spend":0,"spend":1.02,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.11655,"unique_inline_link_click_ctr":0.11655,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.11655,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.11655}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.112108}],"wish_bid":0},"emitted_at":1674584319657} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":1.01,"1d_click":1.01,"7d_click":1.01,"28d_click":1.01},{"action_type":"page_engagement","value":1.01,"1d_click":1.01,"7d_click":1.01,"28d_click":1.01},{"action_type":"post_engagement","value":1.01,"1d_click":1.01,"7d_click":1.01,"28d_click":1.01}],"cost_per_estimated_ad_recallers":0.011222,"cost_per_inline_link_click":1.01,"cost_per_inline_post_engagement":1.01,"cost_per_outbound_click":[{"action_type":"outbound_click","value":1.01}],"cost_per_unique_action_type":[{"action_type":"link_click","value":1.01,"1d_click":1.01,"7d_click":1.01,"28d_click":1.01},{"action_type":"page_engagement","value":1.01,"1d_click":1.01,"7d_click":1.01,"28d_click":1.01},{"action_type":"post_engagement","value":1.01,"1d_click":1.01,"7d_click":1.01,"28d_click":1.01}],"cost_per_unique_click":0.505,"cost_per_unique_inline_link_click":1.01,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":1.01}],"cpc":0.505,"cpm":1.339523,"cpp":1.424542,"created_time":"2021-02-11","ctr":0.265252,"date_start":"2021-02-17","date_stop":"2021-02-17","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.693935,"estimated_ad_recallers":90,"frequency":1.06347,"impressions":754,"inline_link_click_ctr":0.132626,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.132626}],"quality_ranking":"UNKNOWN","reach":709,"social_spend":0,"spend":1.01,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":2,"unique_ctr":0.282087,"unique_inline_link_click_ctr":0.141044,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.141044,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.141044}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.132626}],"wish_bid":0},"emitted_at":1674584319667} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":0.97,"1d_click":0.97,"7d_click":0.97,"28d_click":0.97},{"action_type":"page_engagement","value":0.97,"1d_click":0.97,"7d_click":0.97,"28d_click":0.97},{"action_type":"post_engagement","value":0.97,"1d_click":0.97,"7d_click":0.97,"28d_click":0.97}],"cost_per_estimated_ad_recallers":0.010778,"cost_per_inline_link_click":0.97,"cost_per_inline_post_engagement":0.97,"cost_per_outbound_click":[{"action_type":"outbound_click","value":0.97}],"cost_per_unique_action_type":[{"action_type":"link_click","value":0.97,"1d_click":0.97,"7d_click":0.97,"28d_click":0.97},{"action_type":"page_engagement","value":0.97,"1d_click":0.97,"7d_click":0.97,"28d_click":0.97},{"action_type":"post_engagement","value":0.97,"1d_click":0.97,"7d_click":0.97,"28d_click":0.97}],"cost_per_unique_click":0.97,"cost_per_unique_inline_link_click":0.97,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":0.97}],"cpc":0.97,"cpm":1.284768,"cpp":1.337931,"created_time":"2021-02-09","ctr":0.13245,"date_start":"2021-02-18","date_stop":"2021-02-18","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.413793,"estimated_ad_recallers":90,"frequency":1.041379,"impressions":755,"inline_link_click_ctr":0.13245,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.13245}],"quality_ranking":"UNKNOWN","reach":725,"social_spend":0,"spend":0.97,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.137931,"unique_inline_link_click_ctr":0.137931,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.137931,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.137931}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.13245}],"wish_bid":0},"emitted_at":1674584320112} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.011444,"cpm":1.237981,"cpp":1.2875,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-18","date_stop":"2021-02-18","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":11.25,"estimated_ad_recallers":90,"frequency":1.04,"impressions":832,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":800,"social_spend":0,"spend":1.03,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584320129} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010556,"cost_per_unique_click":0.316667,"cpc":0.316667,"cpm":1.353276,"cpp":1.41369,"created_time":"2021-02-09","ctr":0.42735,"date_start":"2021-02-19","date_stop":"2021-02-19","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.392857,"estimated_ad_recallers":90,"frequency":1.044643,"impressions":702,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":672,"social_spend":0,"spend":0.95,"unique_clicks":3,"unique_ctr":0.446429,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584320498} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":1.07,"1d_click":1.07,"7d_click":1.07,"28d_click":1.07},{"action_type":"page_engagement","value":1.07,"1d_click":1.07,"7d_click":1.07,"28d_click":1.07},{"action_type":"post_engagement","value":1.07,"1d_click":1.07,"7d_click":1.07,"28d_click":1.07}],"cost_per_estimated_ad_recallers":0.0107,"cost_per_inline_link_click":1.07,"cost_per_inline_post_engagement":1.07,"cost_per_outbound_click":[{"action_type":"outbound_click","value":1.07}],"cost_per_unique_action_type":[{"action_type":"link_click","value":1.07,"1d_click":1.07,"7d_click":1.07,"28d_click":1.07},{"action_type":"page_engagement","value":1.07,"1d_click":1.07,"7d_click":1.07,"28d_click":1.07},{"action_type":"post_engagement","value":1.07,"1d_click":1.07,"7d_click":1.07,"28d_click":1.07}],"cost_per_unique_click":1.07,"cost_per_unique_inline_link_click":1.07,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":1.07}],"cpc":1.07,"cpm":1.345912,"cpp":1.406045,"created_time":"2021-02-11","ctr":0.125786,"date_start":"2021-02-19","date_stop":"2021-02-19","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.140604,"estimated_ad_recallers":100,"frequency":1.044678,"impressions":795,"inline_link_click_ctr":0.125786,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.125786}],"quality_ranking":"UNKNOWN","reach":761,"social_spend":0,"spend":1.07,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":1,"unique_ctr":0.131406,"unique_inline_link_click_ctr":0.131406,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.131406,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.131406}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.125786}],"wish_bid":0},"emitted_at":1674584320507} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":3,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":1.04,"1d_click":1.04,"7d_click":1.04,"28d_click":1.04},{"action_type":"page_engagement","value":1.04,"1d_click":1.04,"7d_click":1.04,"28d_click":1.04},{"action_type":"post_engagement","value":1.04,"1d_click":1.04,"7d_click":1.04,"28d_click":1.04}],"cost_per_estimated_ad_recallers":0.0104,"cost_per_inline_link_click":1.04,"cost_per_inline_post_engagement":1.04,"cost_per_outbound_click":[{"action_type":"outbound_click","value":1.04}],"cost_per_unique_action_type":[{"action_type":"link_click","value":1.04,"1d_click":1.04,"7d_click":1.04,"28d_click":1.04},{"action_type":"page_engagement","value":1.04,"1d_click":1.04,"7d_click":1.04,"28d_click":1.04},{"action_type":"post_engagement","value":1.04,"1d_click":1.04,"7d_click":1.04,"28d_click":1.04}],"cost_per_unique_click":0.346667,"cost_per_unique_inline_link_click":1.04,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":1.04}],"cpc":0.346667,"cpm":1.438451,"cpp":1.522694,"created_time":"2021-02-09","ctr":0.414938,"date_start":"2021-02-20","date_stop":"2021-02-20","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":14.641288,"estimated_ad_recallers":100,"frequency":1.058565,"impressions":723,"inline_link_click_ctr":0.138313,"inline_link_clicks":1,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":1}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.138313}],"quality_ranking":"UNKNOWN","reach":683,"social_spend":0,"spend":1.04,"unique_actions":[{"action_type":"link_click","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":3,"unique_ctr":0.439239,"unique_inline_link_click_ctr":0.146413,"unique_inline_link_clicks":1,"unique_link_clicks_ctr":0.146413,"unique_outbound_clicks":[{"action_type":"outbound_click","value":1}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.146413}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.138313}],"wish_bid":0},"emitted_at":1674584320915} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010889,"cpm":1.412104,"cpp":1.484848,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-20","date_stop":"2021-02-20","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.636364,"estimated_ad_recallers":90,"frequency":1.051515,"impressions":694,"inline_link_clicks":0,"inline_post_engagement":0,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":660,"social_spend":0,"spend":0.98,"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584320923} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.01,"cpm":1.335113,"cpp":1.398601,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-21","date_stop":"2021-02-21","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.986014,"estimated_ad_recallers":100,"frequency":1.047552,"impressions":749,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":715,"social_spend":0,"spend":1,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584321319} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010556,"cpm":1.310345,"cpp":1.370851,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-21","date_stop":"2021-02-21","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.987013,"estimated_ad_recallers":90,"frequency":1.046176,"impressions":725,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":693,"social_spend":0,"spend":0.95,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584321334} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.010444,"cost_per_unique_click":0.94,"cpc":0.94,"cpm":1.289438,"cpp":1.327684,"created_time":"2021-02-09","ctr":0.137174,"date_start":"2021-02-22","date_stop":"2021-02-22","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.711864,"estimated_ad_recallers":90,"frequency":1.029661,"impressions":729,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":708,"social_spend":0,"spend":0.94,"unique_clicks":1,"unique_ctr":0.141243,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584322033} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.011125,"cpm":1.332335,"cpp":1.37558,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-22","date_stop":"2021-02-22","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.36476,"estimated_ad_recallers":80,"frequency":1.032457,"impressions":668,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":647,"social_spend":0,"spend":0.89,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584322043} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":2,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"link_click","value":0.575,"1d_click":0.575,"7d_click":0.575,"28d_click":0.575},{"action_type":"page_engagement","value":0.575,"1d_click":0.575,"7d_click":0.575,"28d_click":0.575},{"action_type":"post_engagement","value":0.575,"1d_click":0.575,"7d_click":0.575,"28d_click":0.575}],"cost_per_estimated_ad_recallers":0.010455,"cost_per_inline_link_click":0.575,"cost_per_inline_post_engagement":0.575,"cost_per_outbound_click":[{"action_type":"outbound_click","value":0.575}],"cost_per_unique_action_type":[{"action_type":"link_click","value":0.575,"1d_click":0.575,"7d_click":0.575,"28d_click":0.575},{"action_type":"page_engagement","value":0.575,"1d_click":0.575,"7d_click":0.575,"28d_click":0.575},{"action_type":"post_engagement","value":0.575,"1d_click":0.575,"7d_click":0.575,"28d_click":0.575}],"cost_per_unique_click":0.575,"cost_per_unique_inline_link_click":0.575,"cost_per_unique_outbound_click":[{"action_type":"outbound_click","value":0.575}],"cpc":0.575,"cpm":1.320321,"cpp":1.382212,"created_time":"2021-02-09","ctr":0.229621,"date_start":"2021-02-23","date_stop":"2021-02-23","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.221154,"estimated_ad_recallers":110,"frequency":1.046875,"impressions":871,"inline_link_click_ctr":0.229621,"inline_link_clicks":2,"inline_post_engagement":2,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","outbound_clicks":[{"action_type":"outbound_click","value":2}],"outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.229621}],"quality_ranking":"UNKNOWN","reach":832,"social_spend":0,"spend":1.15,"unique_actions":[{"action_type":"link_click","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"page_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2},{"action_type":"post_engagement","value":2,"1d_click":2,"7d_click":2,"28d_click":2}],"unique_clicks":2,"unique_ctr":0.240385,"unique_inline_link_click_ctr":0.240385,"unique_inline_link_clicks":2,"unique_link_clicks_ctr":0.240385,"unique_outbound_clicks":[{"action_type":"outbound_click","value":2}],"unique_outbound_clicks_ctr":[{"action_type":"outbound_click","value":0.240385}],"updated_time":"2021-08-27","website_ctr":[{"action_type":"link_click","value":0.229621}],"wish_bid":0},"emitted_at":1674584322485} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","actions":[{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_reaction","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_action_type":[{"action_type":"page_engagement","value":0.78,"1d_click":0.78,"7d_click":0.78,"28d_click":0.78},{"action_type":"post_engagement","value":0.78,"1d_click":0.78,"7d_click":0.78,"28d_click":0.78}],"cost_per_estimated_ad_recallers":0.011143,"cost_per_inline_post_engagement":0.78,"cost_per_unique_action_type":[{"action_type":"page_engagement","value":0.78,"1d_click":0.78,"7d_click":0.78,"28d_click":0.78},{"action_type":"post_engagement","value":0.78,"1d_click":0.78,"7d_click":0.78,"28d_click":0.78}],"cpm":1.433824,"cpp":1.508704,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-23","date_stop":"2021-02-23","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.539652,"estimated_ad_recallers":70,"frequency":1.052224,"impressions":544,"inline_link_clicks":0,"inline_post_engagement":1,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":517,"social_spend":0,"spend":0.78,"unique_actions":[{"action_type":"page_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_engagement","value":1,"1d_click":1,"7d_click":1,"28d_click":1},{"action_type":"post_reaction","value":1,"1d_click":1,"7d_click":1,"28d_click":1}],"unique_clicks":0,"unique_ctr":0,"unique_inline_link_clicks":0,"unique_link_clicks_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584322494} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":1,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.012222,"cost_per_unique_click":1.1,"cpc":1.1,"cpm":1.544944,"cpp":1.617647,"created_time":"2021-02-09","ctr":0.140449,"date_start":"2021-02-24","date_stop":"2021-02-24","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":13.235294,"estimated_ad_recallers":90,"frequency":1.047059,"impressions":712,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":680,"social_spend":0,"spend":1.1,"unique_clicks":1,"unique_ctr":0.147059,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584322914} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.0146,"cpm":1.533613,"cpp":1.593886,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-24","date_stop":"2021-02-24","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":10.917031,"estimated_ad_recallers":50,"frequency":1.039301,"impressions":476,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":458,"social_spend":0,"spend":0.73,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584322929} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846765228310398","ad_name":"Airbyte Ad","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.013778,"cpm":1.715076,"cpp":1.789322,"created_time":"2021-02-09","ctr":0,"date_start":"2021-02-25","date_stop":"2021-02-25","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":12.987013,"estimated_ad_recallers":90,"frequency":1.04329,"impressions":723,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":693,"social_spend":0,"spend":1.24,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584323420} +{"stream":"ads_insights_action_type","data":{"account_currency":"USD","account_id":"212551616838260","account_name":"Airbyte","ad_id":"23846784938030398","ad_name":"Stock photo ad 2","adset_id":"23846765228280398","adset_name":"Vanilla awareness ad set","buying_type":"AUCTION","campaign_id":"23846765228240398","campaign_name":"Airbyte Awareness Campaign 1 (sherif)","clicks":0,"conversion_rate_ranking":"UNKNOWN","cost_per_estimated_ad_recallers":0.018,"cpm":1.930295,"cpp":2,"created_time":"2021-02-11","ctr":0,"date_start":"2021-02-25","date_stop":"2021-02-25","engagement_rate_ranking":"UNKNOWN","estimated_ad_recall_rate":11.111111,"estimated_ad_recallers":40,"frequency":1.036111,"impressions":373,"objective":"BRAND_AWARENESS","optimization_goal":"AD_RECALL_LIFT","quality_ranking":"UNKNOWN","reach":360,"social_spend":0,"spend":0.72,"unique_clicks":0,"unique_ctr":0,"updated_time":"2021-08-27","wish_bid":0},"emitted_at":1674584323423} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-02-09T15:04:11-0800","effective_status":"PAUSED","id":"23846765228240398","name":"Airbyte Awareness Campaign 1 (sherif)","objective":"BRAND_AWARENESS","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"2021-02-09T15:04:13-0800","stop_time":"2021-09-30T14:47:46-0700","updated_time":"2021-09-10T08:17:10-0700"},"emitted_at":1674584324205} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-02-08T23:56:04-0800","effective_status":"PAUSED","id":"23846756820270398","name":"integration-test-campaign1","objective":"LINK_CLICKS","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"2021-02-08T23:56:07-0800","stop_time":"2021-03-09T14:45:43-0800","updated_time":"2021-07-26T00:21:26-0700"},"emitted_at":1674584324206} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-01-18T22:16:36-0800","effective_status":"PAUSED","id":"23846542371880398","name":"Fake Campaign 0","objective":"MESSAGES","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"2021-01-18T22:16:36-0800","updated_time":"2021-02-18T00:59:48-0800"},"emitted_at":1674584324208} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-01-18T21:42:45-0800","effective_status":"PAUSED","id":"23846542151990398","name":"Fake Campaign 0","objective":"MESSAGES","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"1969-12-31T15:59:59-0800","updated_time":"2021-02-18T01:00:00-0800"},"emitted_at":1674584324209} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-01-18T21:42:21-0800","effective_status":"PAUSED","id":"23846542150540398","name":"Fake Campaign 0","objective":"MESSAGES","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"1969-12-31T15:59:59-0800","updated_time":"2021-02-18T00:59:52-0800"},"emitted_at":1674584324210} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-01-18T21:36:42-0800","effective_status":"PAUSED","id":"23846542053890398","name":"Fake Campaign 0","objective":"MESSAGES","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"1969-12-31T15:59:59-0800","updated_time":"2021-02-18T01:00:02-0800"},"emitted_at":1674584324211} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-01-18T21:36:16-0800","effective_status":"PAUSED","id":"23846542048150398","name":"Fake Campaign 0","objective":"MESSAGES","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"1969-12-31T15:59:59-0800","updated_time":"2021-02-18T01:00:04-0800"},"emitted_at":1674584324211} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-01-18T21:33:03-0800","effective_status":"PAUSED","id":"23846542041640398","name":"Fake Campaign 0","objective":"MESSAGES","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"1969-12-31T15:59:59-0800","updated_time":"2021-02-18T01:00:03-0800"},"emitted_at":1674584324212} +{"stream":"campaigns","data":{"account_id":"212551616838260","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2021-01-18T21:20:51-0800","effective_status":"PAUSED","id":"23846541931180398","name":"Fake Campaign 0","objective":"MESSAGES","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"1969-12-31T15:59:59-0800","updated_time":"2021-02-18T01:00:04-0800"},"emitted_at":1674584324213} +{"stream":"campaigns","data":{"account_id":"212551616838260","bid_strategy":"LOWEST_COST_WITHOUT_CAP","budget_rebalance_flag":false,"budget_remaining":0,"buying_type":"AUCTION","created_time":"2020-04-13T18:13:49-0700","effective_status":"PAUSED","id":"23844521599700398","lifetime_budget":3000,"name":"Dataline Test Unblock","objective":"CONVERSIONS","smart_promotion_type":"GUIDED_CREATION","source_campaign_id":0,"special_ad_category":"NONE","start_time":"2020-04-13T18:21:59-0700","stop_time":"2020-04-30T00:00:00-0700","updated_time":"2021-07-25T00:50:53-0700"},"emitted_at":1674584324213} diff --git a/airbyte-integrations/connectors/source-facebook-marketing/integration_tests/future_state.json b/airbyte-integrations/connectors/source-facebook-marketing/integration_tests/future_state.json index b722670d563b9..c57f2c3ab904a 100644 --- a/airbyte-integrations/connectors/source-facebook-marketing/integration_tests/future_state.json +++ b/airbyte-integrations/connectors/source-facebook-marketing/integration_tests/future_state.json @@ -28,6 +28,16 @@ }, "stream_descriptor": { "name": "images" } } + }, + { + "type": "STREAM", + "stream": { + "stream_state": { + "updated_time": "2121-07-25T13:34:26Z", + "include_deleted": true + }, + "stream_descriptor": { "name": "videos" } + } }, { "type": "STREAM", From 0cb8388374b35a5d6309488c7ffe458489c59e71 Mon Sep 17 00:00:00 2001 From: Sophia Wiley <106352739+sophia-wiley@users.noreply.github.com> Date: Wed, 25 Jan 2023 10:32:33 -0800 Subject: [PATCH 088/195] Added auto-detect schema info to docs (#21501) * added auto-detect schema info to docs * small edits * added info * edits * edits --- docs/cloud/managing-airbyte-cloud.md | 88 +++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 8 deletions(-) diff --git a/docs/cloud/managing-airbyte-cloud.md b/docs/cloud/managing-airbyte-cloud.md index ceb6d5d4d402a..a443764dd3425 100644 --- a/docs/cloud/managing-airbyte-cloud.md +++ b/docs/cloud/managing-airbyte-cloud.md @@ -171,6 +171,7 @@ To view the sync summary: 3. To view the full sync log, click the sync summary dropdown. ### Sync summary + | Data | Description | |--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------| | x GB (also measured in KB, MB) | Amount of data moved during the sync. If basic normalization is on, the amount of data would not change since normalization occurs in the destination. | @@ -186,17 +187,18 @@ In a successful sync, the number of emitted records and committed records should ## Edit stream configuration -1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Connections** and then click a connection in the list you want to change. +1. On the [Airbyte Cloud](http://cloud.airbyte.io) dashboard, click **Connections** and then click the connection you want to change. 2. Click the **Replication** tab. The **Transfer** and **Streams** settings include the following parameters: -| Parameter | Description | -|---------------------------|-------------------------------------------------------------------------------------------------------------------------------------------| -| Replication Frequency | How often the data syncs | -| [Destination Namespace](https://docs.airbyte.com/understanding-airbyte/namespaces/) | Where the replicated data is written | -| Destination Stream Prefix | Helps you identify streams from different connectors | +| Parameter | Description | +|--------------------------------------|-------------------------------------------------------------------------------------| +| Replication frequency | How often the data syncs | +| [Non-breaking schema updates](#review-non-breaking-schema-changes) detected | How Airbyte handles syncs when it detects non-breaking schema changes in the source | +| Destination Namespace | Where the replicated data is written | +| Destination Stream Prefix | Helps you identify streams from different connectors | :::note @@ -274,9 +276,79 @@ Airbyte recommends that you reset streams. A reset will delete data in the desti To refresh the source schema: 1. Click **Refresh source schema** to fetch the schema of your data source. -2. If there are changes to the schema, the **Refreshed source schema** dialog displays them. +2. If the schema has changed, the **Refreshed source schema** dialog displays them. + +## Manage schema changes + +Once every 24 hours, Airbyte checks for changes in your source schema and allows you to review the changes and fix breaking changes. + +:::note + +Schema changes are flagged in your connection but are not propagated to your destination. + +::: + +### Review non-breaking schema changes + +To review non-breaking schema changes: +1. On the [Airbyte Cloud](http://cloud.airbyte.com/) dashboard, click **Connections** and select the connection with non-breaking changes (indicated by a **yellow exclamation mark** icon). + +2. Click **Review changes**. + +3. The **Refreshed source schema** dialog displays the changes. + +4. Review the changes and click **OK** to close the dialog. + +5. Scroll to the bottom of the page and click **Save changes**. + +:::note + + By default, Airbyte ignores non-breaking changes and continues syncing. You can configure how Airbyte handles syncs when it detects non-breaking changes by [editing the stream configuration](#edit-stream-configuration). + +::: + +### Fix breaking schema changes + +:::note + +Breaking changes can only occur in the **Cursor** or **Primary key** fields. + +::: + +To review and fix breaking schema changes: +1. On the [Airbyte Cloud](http://cloud.airbyte.com/) dashboard, click **Connections** and select the connection with breaking changes (indicated by a **red exclamation mark** icon). + +2. Click **Review changes**. + +3. The **Refreshed source schema** dialog displays the changes. + +4. Review the changes and click **OK** to close the dialog. + +5. In the streams table, the stream with a breaking change is highlighted. + +6. Fix the breaking change by selecting a new **Cursor** or **Primary key**. + +7. Scroll to the bottom of the page and click **Save changes**. + +:::note + +If a connection’s source schema has breaking changes, it will stop syncing. You must review and fix the changes before editing the connection or resuming syncs. + +::: + +### Enable schema update notifications + +To get notified when your source schema changes: +1. Make sure you have [webhook notifications](https://docs.airbyte.com/cloud/managing-airbyte-cloud#manage-airbyte-cloud-notifications) set up. + +2. On the [Airbyte Cloud](http://cloud.airbyte.com/) dashboard, click **Connections** and select the connection you want to receive notifications for. + +3. Click the **Settings** tab on the Connection page. + +4. Toggle **Schema update notifications**. ## Display Connection State + **Connection State** provides additional information about incremental syncs. It includes the most recent values for the global or stream-level cursors, which can aid in debugging or determining which data will be included in the next syncs. To display **Connection State**: @@ -291,7 +363,7 @@ To display **Connection State**: 5. Click the **Settings** tab on the Connection page. - The **Connection State** displays. + The **Connection State** displays. ## Choose the data residency for a connection You can choose the data residency for your connection in the connection settings. You can also choose data residency when creating a [new connection](https://docs.airbyte.com/cloud/getting-started-with-airbyte-cloud#set-up-a-connection), or you can set the [default data residency](#choose-your-default-data-residency) for your workspace. From 6e373435f2999f1be4c8c5b09b4b12f8e3d2d16e Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 25 Jan 2023 19:43:26 +0100 Subject: [PATCH 089/195] Small spec fixes to make sure they work with connector form UI (#21587) --- .../resources/seed/source_definitions.yaml | 4 ++-- .../src/main/resources/seed/source_specs.yaml | 20 +++++++------------ .../connectors/source-s3/Dockerfile | 2 +- .../source-s3/acceptance-test-config.yml | 3 ++- .../source-s3/acceptance-test-docker.sh | 0 .../source-s3/integration_tests/spec.json | 9 +-------- .../source_s3/source_files_abstract/spec.py | 16 +++++++++++++++ .../connectors/source-sendgrid/Dockerfile | 2 +- .../acceptance-test-config.yml | 2 ++ .../source-sendgrid/source_sendgrid/spec.json | 2 +- .../source_sendgrid/streams.py | 4 ++-- .../source-sendgrid/unit_tests/unit_test.py | 9 +++++---- docs/integrations/sources/s3.md | 1 + docs/integrations/sources/sendgrid.md | 1 + 14 files changed, 42 insertions(+), 33 deletions(-) mode change 100644 => 100755 airbyte-integrations/connectors/source-s3/acceptance-test-docker.sh diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 93d770f597f9e..c66fd84a73f77 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1510,7 +1510,7 @@ - name: S3 sourceDefinitionId: 69589781-7828-43c5-9f63-8925b1c1ccc2 dockerRepository: airbyte/source-s3 - dockerImageTag: 0.1.29 + dockerImageTag: 0.1.30 documentationUrl: https://docs.airbyte.com/integrations/sources/s3 icon: s3.svg sourceType: file @@ -1558,7 +1558,7 @@ - name: Sendgrid sourceDefinitionId: fbb5fbe2-16ad-4cf4-af7d-ff9d9c316c87 dockerRepository: airbyte/source-sendgrid - dockerImageTag: 0.2.16 + dockerImageTag: 0.3.0 documentationUrl: https://docs.airbyte.com/integrations/sources/sendgrid icon: sendgrid.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index f77ebf642281c..87f10814efc47 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -12660,7 +12660,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-s3:0.1.29" +- dockerImage: "airbyte/source-s3:0.1.30" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/s3" changelogUrl: "https://docs.airbyte.com/integrations/sources/s3" @@ -12869,14 +12869,10 @@ - "infer" - "error" order: 1 - allOf: - - title: "UnexpectedFieldBehaviorEnum" - description: "An enumeration." - enum: - - "ignore" - - "infer" - - "error" - type: "string" + enum: + - "ignore" + - "infer" + - "error" block_size: title: "Block Size" description: "The chunk size in bytes to process at a time in memory\ @@ -13236,7 +13232,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-sendgrid:0.2.16" +- dockerImage: "airbyte/source-sendgrid:0.3.0" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/sendgrid" connectionSpecification: @@ -13256,9 +13252,7 @@ order: 0 start_time: title: "Start time" - type: - - "integer" - - "string" + type: "string" description: "Start time in ISO8601 format. Any data before this time point\ \ will not be replicated." examples: diff --git a/airbyte-integrations/connectors/source-s3/Dockerfile b/airbyte-integrations/connectors/source-s3/Dockerfile index 718d25530ed4a..0e03ad049bbca 100644 --- a/airbyte-integrations/connectors/source-s3/Dockerfile +++ b/airbyte-integrations/connectors/source-s3/Dockerfile @@ -17,5 +17,5 @@ COPY source_s3 ./source_s3 ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.29 +LABEL io.airbyte.version=0.1.30 LABEL io.airbyte.name=airbyte/source-s3 diff --git a/airbyte-integrations/connectors/source-s3/acceptance-test-config.yml b/airbyte-integrations/connectors/source-s3/acceptance-test-config.yml index 825587b33a7a3..95de536ab6f5e 100644 --- a/airbyte-integrations/connectors/source-s3/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-s3/acceptance-test-config.yml @@ -4,7 +4,8 @@ acceptance_tests: spec: tests: - backward_compatibility_tests_config: - disable_for_version: 0.1.26 + # skip because allOf gets converted into enum + disable_for_version: 0.1.29 spec_path: integration_tests/spec.json connection: diff --git a/airbyte-integrations/connectors/source-s3/acceptance-test-docker.sh b/airbyte-integrations/connectors/source-s3/acceptance-test-docker.sh old mode 100644 new mode 100755 diff --git a/airbyte-integrations/connectors/source-s3/integration_tests/spec.json b/airbyte-integrations/connectors/source-s3/integration_tests/spec.json index 8aa6266bd205d..c82b2d38c04af 100644 --- a/airbyte-integrations/connectors/source-s3/integration_tests/spec.json +++ b/airbyte-integrations/connectors/source-s3/integration_tests/spec.json @@ -186,14 +186,7 @@ "default": "infer", "examples": ["ignore", "infer", "error"], "order": 1, - "allOf": [ - { - "title": "UnexpectedFieldBehaviorEnum", - "description": "An enumeration.", - "enum": ["ignore", "infer", "error"], - "type": "string" - } - ] + "enum": ["ignore", "infer", "error"] }, "block_size": { "title": "Block Size", diff --git a/airbyte-integrations/connectors/source-s3/source_s3/source_files_abstract/spec.py b/airbyte-integrations/connectors/source-s3/source_s3/source_files_abstract/spec.py index c1ffab7077cd3..680fcbb6fec7a 100644 --- a/airbyte-integrations/connectors/source-s3/source_s3/source_files_abstract/spec.py +++ b/airbyte-integrations/connectors/source-s3/source_s3/source_files_abstract/spec.py @@ -87,6 +87,21 @@ def change_format_to_oneOf(schema: dict) -> dict: schema["properties"][prop]["oneOf"] = schema["properties"][prop].pop("anyOf") return schema + @staticmethod + def remove_enum_allOf(schema: dict) -> dict: + """ + allOfs are not supported by the UI, but pydantic is automatically writing them for enums. + Unpack them into the root + """ + objects_to_check = schema["properties"]["format"]["oneOf"] + for object in objects_to_check: + for key in object["properties"]: + property = object["properties"][key] + if "allOf" in property and "enum" in property["allOf"][0]: + property["enum"] = property["allOf"][0]["enum"] + property.pop("allOf") + return schema + @staticmethod def check_provider_added(schema: dict) -> None: if "provider" not in schema["properties"]: @@ -110,4 +125,5 @@ def schema(cls, *args: Any, **kwargs: Any) -> Dict[str, Any]: cls.check_provider_added(schema) schema = cls.change_format_to_oneOf(schema) schema = cls.resolve_refs(schema) + schema = cls.remove_enum_allOf(schema) return schema diff --git a/airbyte-integrations/connectors/source-sendgrid/Dockerfile b/airbyte-integrations/connectors/source-sendgrid/Dockerfile index 9fb8c810bb2f4..e109ca825f665 100644 --- a/airbyte-integrations/connectors/source-sendgrid/Dockerfile +++ b/airbyte-integrations/connectors/source-sendgrid/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.16 +LABEL io.airbyte.version=0.3.0 LABEL io.airbyte.name=airbyte/source-sendgrid diff --git a/airbyte-integrations/connectors/source-sendgrid/acceptance-test-config.yml b/airbyte-integrations/connectors/source-sendgrid/acceptance-test-config.yml index f2fe28771e208..6b81ae9eb11c1 100644 --- a/airbyte-integrations/connectors/source-sendgrid/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-sendgrid/acceptance-test-config.yml @@ -2,6 +2,8 @@ connector_image: airbyte/source-sendgrid:dev tests: spec: - spec_path: "source_sendgrid/spec.json" + backward_compatibility_tests_config: + disable_for_version: "0.2.16" connection: - config_path: "secrets/config.json" status: "succeed" diff --git a/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/spec.json b/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/spec.json index 214e5045dc404..cf97393ced641 100644 --- a/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/spec.json +++ b/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/spec.json @@ -16,7 +16,7 @@ }, "start_time": { "title": "Start time", - "type": ["integer", "string"], + "type": "string", "description": "Start time in ISO8601 format. Any data before this time point will not be replicated.", "examples": [ "2021-12-12", diff --git a/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/streams.py b/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/streams.py index fef1060c8ca52..74dfc9ab8f2ac 100644 --- a/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/streams.py +++ b/airbyte-integrations/connectors/source-sendgrid/source_sendgrid/streams.py @@ -5,7 +5,7 @@ import datetime import urllib from abc import ABC, abstractmethod -from typing import Any, Iterable, Mapping, MutableMapping, Optional, Union +from typing import Any, Iterable, Mapping, MutableMapping, Optional import pendulum import requests @@ -91,7 +91,7 @@ def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, class SendgridStreamIncrementalMixin(HttpStream, ABC): cursor_field = "created" - def __init__(self, start_time: Optional[Union[int, str]], **kwargs): + def __init__(self, start_time: Optional[str], **kwargs): super().__init__(**kwargs) self._start_time = start_time or 0 if isinstance(self._start_time, str): diff --git a/airbyte-integrations/connectors/source-sendgrid/unit_tests/unit_test.py b/airbyte-integrations/connectors/source-sendgrid/unit_tests/unit_test.py index cf8af51bfeb81..d322289b7a811 100644 --- a/airbyte-integrations/connectors/source-sendgrid/unit_tests/unit_test.py +++ b/airbyte-integrations/connectors/source-sendgrid/unit_tests/unit_test.py @@ -28,6 +28,7 @@ ) FAKE_NOW = pendulum.DateTime(2022, 1, 1, tzinfo=pendulum.timezone("utc")) +FAKE_NOW_ISO_STRING = FAKE_NOW.to_iso8601_string() @pytest.fixture(name="sendgrid_stream") @@ -59,7 +60,7 @@ def test_source_wrong_credentials(): def test_messages_stream_request_params(mock_pendulum_now): - start_time = 1558359830 + start_time = "2019-05-20T13:43:50.000Z" stream = Messages(start_time) state = {"last_event_time": 1558359000} request_params = stream.request_params(state) @@ -70,7 +71,7 @@ def test_messages_stream_request_params(mock_pendulum_now): def test_streams(): - streams = SourceSendgrid().streams(config={"apikey": "wrong.api.key123", "start_time": FAKE_NOW}) + streams = SourceSendgrid().streams(config={"apikey": "wrong.api.key123", "start_time": FAKE_NOW_ISO_STRING}) assert len(streams) == 15 @@ -89,10 +90,10 @@ def test_pagination(mocker): @patch.multiple(SendgridStreamIncrementalMixin, __abstractmethods__=set()) def test_stream_state(): - stream = SendgridStreamIncrementalMixin(start_time=FAKE_NOW) + stream = SendgridStreamIncrementalMixin(start_time=FAKE_NOW_ISO_STRING) state = {} request_params = stream.request_params(stream_state=state) - assert request_params == {"end_time": pendulum.now().int_timestamp, "start_time": FAKE_NOW} + assert request_params == {"end_time": pendulum.now().int_timestamp, "start_time": int(FAKE_NOW.timestamp())} @pytest.mark.parametrize( diff --git a/docs/integrations/sources/s3.md b/docs/integrations/sources/s3.md index b24070c84c757..cdd3333b720c4 100644 --- a/docs/integrations/sources/s3.md +++ b/docs/integrations/sources/s3.md @@ -209,6 +209,7 @@ The Jsonl parser uses pyarrow hence,only the line-delimited JSON format is suppo | Version | Date | Pull Request | Subject | |:--------|:-----------|:----------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------| +| 0.1.30 | 2023-01-25 | [21587](https://github.com/airbytehq/airbyte/pull/21587) | Make sure spec works as expected in UI | | 0.1.29 | 2023-01-19 | [21604](https://github.com/airbytehq/airbyte/pull/21604) | Handle OSError: skip unreachable keys and keep working on accessible ones. Warn a customer | | 0.1.28 | 2023-01-10 | [21210](https://github.com/airbytehq/airbyte/pull/21210) | Update block size for json file format | | 0.1.27 | 2022-12-08 | [20262](https://github.com/airbytehq/airbyte/pull/20262) | Check config settings for CSV file format | diff --git a/docs/integrations/sources/sendgrid.md b/docs/integrations/sources/sendgrid.md index 1d1fdf90b072a..6e6c2b5c93a05 100644 --- a/docs/integrations/sources/sendgrid.md +++ b/docs/integrations/sources/sendgrid.md @@ -78,6 +78,7 @@ The connector is restricted by normal Sendgrid [requests limitation](https://sen | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:------------------------------------------------------| +| 0.3.0 | 2023-01-25 | [21587](https://github.com/airbytehq/airbyte/pull/21587) | Make sure spec works as expected in UI - make starttime parameter an ISO string instead of a timestamp | | 0.2.16 | 2022-11-02 | [18847](https://github.com/airbytehq/airbyte/pull/18847) | Skip the stream on `400, 401 - authorization required` with log message | | 0.2.15 | 2022-10-19 | [18182](https://github.com/airbytehq/airbyte/pull/18182) | Mark the sendgrid api key secret in the spec | | 0.2.14 | 2022-09-07 | [16400](https://github.com/airbytehq/airbyte/pull/16400) | Change Start Time config parameter to datetime string | From 4ae80b035016502649524ccdf4b55add3c4a696b Mon Sep 17 00:00:00 2001 From: Denys Davydov Date: Wed, 25 Jan 2023 20:51:59 +0200 Subject: [PATCH 090/195] #19050 Source Intercom: high test strictness level (#21859) --- .../acceptance-test-config.yml | 55 +++--- .../integration_tests/catalog.json | 181 ------------------ .../integration_tests/configured_catalog.json | 62 ++++-- .../integration_tests/expected_records.jsonl | 61 +++++- .../incremental_catalog.json | 88 +++++++++ 5 files changed, 220 insertions(+), 227 deletions(-) delete mode 100644 airbyte-integrations/connectors/source-intercom/integration_tests/catalog.json create mode 100644 airbyte-integrations/connectors/source-intercom/integration_tests/incremental_catalog.json diff --git a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml index 7ef304a9e010d..fb516fe951b89 100644 --- a/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-intercom/acceptance-test-config.yml @@ -1,33 +1,40 @@ # See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-intercom:dev -tests: +test_strictness_level: high +acceptance_tests: spec: - - spec_path: "source_intercom/spec.json" + tests: + - spec_path: "source_intercom/spec.json" connection: - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + tests: + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" discovery: - - config_path: "secrets/config.json" + tests: + - config_path: "secrets/config.json" basic_read: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - expect_records: - path: "integration_tests/expected_records.jsonl" + tests: + - config_path: "secrets/config.json" + expect_records: + path: "integration_tests/expected_records.jsonl" incremental: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - future_state_path: "integration_tests/abnormal_state.json" - threshold_days: 365 - cursor_paths: - companies: ["updated_at"] - company_segments: ["updated_at"] - conversations: ["updated_at"] - conversation_parts: ["updated_at"] - contacts: ["updated_at"] - segments: ["updated_at"] + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/incremental_catalog.json" + future_state: + future_state_path: "integration_tests/abnormal_state.json" + threshold_days: 365 + cursor_paths: + companies: ["updated_at"] + company_segments: ["updated_at"] + conversations: ["updated_at"] + conversation_parts: ["updated_at"] + contacts: ["updated_at"] + segments: ["updated_at"] full_refresh: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" diff --git a/airbyte-integrations/connectors/source-intercom/integration_tests/catalog.json b/airbyte-integrations/connectors/source-intercom/integration_tests/catalog.json deleted file mode 100644 index 38ca3d8e410f5..0000000000000 --- a/airbyte-integrations/connectors/source-intercom/integration_tests/catalog.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "streams": [ - { - "name": "admins", - "json_schema": { - "properties": { - "admin_ids": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "integer" - } - }, - { - "type": "null" - } - ] - }, - "avatar": { - "properties": { - "image_url": { - "type": ["null", "string"] - } - }, - "type": ["null", "object"], - "additionalProperties": false - }, - "away_mode_enabled": { - "type": ["null", "boolean"] - }, - "away_mode_reassign": { - "type": ["null", "boolean"] - }, - "email": { - "type": ["null", "string"] - }, - "has_inbox_seat": { - "type": ["null", "boolean"] - }, - "id": { - "type": ["null", "string"] - }, - "job_title": { - "type": ["null", "string"] - }, - "name": { - "type": ["null", "string"] - }, - "team_ids": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "integer" - } - }, - { - "type": "null" - } - ] - }, - "type": { - "type": ["null", "string"] - } - }, - "type": "object", - "additionalProperties": false - } - }, - { - "name": "companies", - "json_schema": { - "properties": { - "company_id": { - "type": ["null", "string"] - }, - "created_at": { - "format": "date-time", - "type": ["null", "string"] - }, - "custom_attributes": { - "type": ["null", "object"], - "additionalProperties": true - }, - "id": { - "type": ["null", "string"] - }, - "industry": { - "type": ["null", "string"] - }, - "monthly_spend": { - "multipleOf": 1e-8, - "type": ["null", "number"] - }, - "name": { - "type": ["null", "string"] - }, - "plan": { - "properties": { - "id": { - "type": ["null", "string"] - }, - "name": { - "type": ["null", "string"] - }, - "type": { - "type": ["null", "string"] - } - }, - "type": ["null", "object"], - "additionalProperties": false - }, - "remote_created_at": { - "format": "date-time", - "type": ["null", "string"] - }, - "segments": { - "anyOf": [ - { - "type": "array", - "items": { - "type": ["null", "object"], - "additionalProperties": false, - "properties": { - "id": { - "type": ["null", "string"] - } - } - } - }, - { - "type": "null" - } - ] - }, - "session_count": { - "type": ["null", "integer"] - }, - "size": { - "type": ["null", "integer"] - }, - "tags": { - "anyOf": [ - { - "type": "array", - "items": { - "type": ["null", "object"], - "additionalProperties": false, - "properties": { - "id": { - "type": ["null", "string"] - } - } - } - }, - { - "type": "null" - } - ] - }, - "type": { - "type": ["null", "string"] - }, - "updated_at": { - "format": "date-time", - "type": ["null", "string"] - }, - "user_count": { - "type": ["null", "integer"] - }, - "website": { - "type": ["null", "string"] - } - }, - "type": "object", - "additionalProperties": false - } - } - ] -} diff --git a/airbyte-integrations/connectors/source-intercom/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-intercom/integration_tests/configured_catalog.json index 9ace395b53b07..01f694abf156a 100644 --- a/airbyte-integrations/connectors/source-intercom/integration_tests/configured_catalog.json +++ b/airbyte-integrations/connectors/source-intercom/integration_tests/configured_catalog.json @@ -4,9 +4,11 @@ "stream": { "name": "admins", "json_schema": {}, - "supported_sync_modes": ["full_refresh"] + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["id"]] }, "sync_mode": "full_refresh", + "primary_key": [["id"]], "destination_sync_mode": "append" }, { @@ -15,19 +17,23 @@ "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, - "default_cursor_field": ["updated_at"] + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] }, - "sync_mode": "incremental", + "sync_mode": "full_refresh", "cursor_field": ["updated_at"], + "primary_key": [["id"]], "destination_sync_mode": "append" }, { "stream": { "name": "company_attributes", "json_schema": {}, - "supported_sync_modes": ["full_refresh"] + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["name"]] }, "sync_mode": "full_refresh", + "primary_key": [["name"]], "destination_sync_mode": "append" }, { @@ -36,10 +42,12 @@ "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, - "default_cursor_field": ["updated_at"] + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] }, - "sync_mode": "incremental", + "sync_mode": "full_refresh", "cursor_field": ["updated_at"], + "primary_key": [["id"]], "destination_sync_mode": "append" }, { @@ -48,9 +56,11 @@ "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, - "default_cursor_field": ["updated_at"] + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] }, - "sync_mode": "incremental", + "sync_mode": "full_refresh", + "primary_key": [["id"]], "cursor_field": ["updated_at"], "destination_sync_mode": "append" }, @@ -60,19 +70,23 @@ "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, - "default_cursor_field": ["updated_at"] + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] }, - "sync_mode": "incremental", + "sync_mode": "full_refresh", "cursor_field": ["updated_at"], - "destination_sync_mode": "append" + "destination_sync_mode": "append", + "primary_key": [["id"]] }, { "stream": { "name": "contact_attributes", "json_schema": {}, - "supported_sync_modes": ["full_refresh"] + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["name"]] }, "sync_mode": "full_refresh", + "primary_key": [["name"]], "destination_sync_mode": "append" }, { @@ -81,11 +95,13 @@ "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, - "default_cursor_field": ["updated_at"] + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] }, - "sync_mode": "incremental", + "sync_mode": "full_refresh", "cursor_field": ["updated_at"], - "destination_sync_mode": "append" + "destination_sync_mode": "append", + "primary_key": [["id"]] }, { "stream": { @@ -93,28 +109,34 @@ "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, - "default_cursor_field": ["updated_at"] + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] }, - "sync_mode": "incremental", + "sync_mode": "full_refresh", "cursor_field": ["updated_at"], - "destination_sync_mode": "append" + "destination_sync_mode": "append", + "primary_key": [["id"]] }, { "stream": { "name": "tags", "json_schema": {}, - "supported_sync_modes": ["full_refresh"] + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["name"]] }, "sync_mode": "full_refresh", + "primary_key": [["name"]], "destination_sync_mode": "append" }, { "stream": { "name": "teams", "json_schema": {}, - "supported_sync_modes": ["full_refresh"] + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["name"]] }, "sync_mode": "full_refresh", + "primary_key": [["name"]], "destination_sync_mode": "append" } ] diff --git a/airbyte-integrations/connectors/source-intercom/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-intercom/integration_tests/expected_records.jsonl index 7085fa1674765..a849b1a3d6137 100644 --- a/airbyte-integrations/connectors/source-intercom/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-intercom/integration_tests/expected_records.jsonl @@ -1,2 +1,59 @@ -{"stream": "conversations", "data": {"type": "conversation", "id": "2", "created_at": 1625749234, "updated_at": 1632835061, "waiting_since": null, "snoozed_until": null, "source": {"type": "conversation", "id": "906873821", "delivered_as": "admin_initiated", "subject": "", "body": "

    Hi Jean,

    ", "author": {"type": "admin", "id": "4423433", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "url": null, "redacted": false}, "contacts": {"type": "contact.list", "contacts": [{"type": "contact", "id": "60e6f6e020ae45ce1ac86f26"}]}, "first_contact_reply": null, "admin_assignee_id": 4423433, "team_assignee_id": null, "open": false, "state": "closed", "read": true, "tags": {"type": "tag.list", "tags": []}, "priority": "not_priority", "sla_applied": null, "statistics": {"type": "conversation_statistics", "time_to_assignment": null, "time_to_admin_reply": null, "time_to_first_close": null, "time_to_last_close": null, "median_time_to_reply": null, "first_contact_reply_at": null, "first_assignment_at": null, "first_admin_reply_at": null, "first_close_at": null, "last_assignment_at": null, "last_assignment_admin_reply_at": null, "last_contact_reply_at": null, "last_admin_reply_at": null, "last_close_at": null, "last_closed_by_id": null, "count_reopens": 0, "count_assignments": 0, "count_conversation_parts": 7}, "conversation_rating": null, "teammates": {"type": "admin.list", "admins": []}, "title": null, "custom_attributes": {}, "topics": {"type": "topic.list", "topics": [], "total_count": 0}}, "emitted_at": 1674118691316} -{"stream": "conversations", "data": {"type": "conversation", "id": "1", "created_at": 1607553243, "updated_at": 1626346673, "waiting_since": null, "snoozed_until": null, "source": {"type": "conversation", "id": "701718739", "delivered_as": "customer_initiated", "subject": "", "body": "

    hey there

    ", "author": {"type": "lead", "id": "5fd150d50697b6d0bbc4a2c2", "name": null, "email": ""}, "attachments": [], "url": "http://localhost:63342/airbyte-python/airbyte-integrations/bases/base-java/build/tmp/expandedArchives/org.jacoco.agent-0.8.5.jar_6a2df60c47de373ea127d14406367999/about.html?_ijt=uosck1k6vmp2dnl4oqib2g3u9d", "redacted": false}, "contacts": {"type": "contact.list", "contacts": [{"type": "contact", "id": "5fd150d50697b6d0bbc4a2c2"}]}, "first_contact_reply": {"created_at": 1607553243, "type": "conversation", "url": "http://localhost:63342/airbyte-python/airbyte-integrations/bases/base-java/build/tmp/expandedArchives/org.jacoco.agent-0.8.5.jar_6a2df60c47de373ea127d14406367999/about.html?_ijt=uosck1k6vmp2dnl4oqib2g3u9d"}, "admin_assignee_id": null, "team_assignee_id": null, "open": true, "state": "open", "read": false, "tags": {"type": "tag.list", "tags": []}, "priority": "not_priority", "sla_applied": null, "statistics": {"type": "conversation_statistics", "time_to_assignment": null, "time_to_admin_reply": 4317957, "time_to_first_close": null, "time_to_last_close": null, "median_time_to_reply": 4317954, "first_contact_reply_at": 1607553243, "first_assignment_at": null, "first_admin_reply_at": 1625654131, "first_close_at": null, "last_assignment_at": null, "last_assignment_admin_reply_at": null, "last_contact_reply_at": 1607553246, "last_admin_reply_at": 1625656000, "last_close_at": null, "last_closed_by_id": null, "count_reopens": 0, "count_assignments": 0, "count_conversation_parts": 7}, "conversation_rating": null, "teammates": {"type": "admin.list", "admins": [{"type": "admin", "id": "4423433"}]}, "title": null, "custom_attributes": {}, "topics": {"type": "topic.list", "topics": [], "total_count": 0}}, "emitted_at": 1674118691316} \ No newline at end of file +{"stream": "admins", "data": {"type": "admin", "email": "integration-test@airbyte.io", "id": "4423433", "name": "Airbyte Team", "away_mode_enabled": false, "away_mode_reassign": false, "has_inbox_seat": false, "team_ids": [], "team_priority_level": {}}, "emitted_at": 1674662478119} +{"stream": "admins", "data": {"type": "admin", "email": "operator+wjw5eps7@intercom.io", "id": "4423434", "name": "Operator", "away_mode_enabled": false, "away_mode_reassign": false, "has_inbox_seat": false, "team_ids": [], "team_priority_level": {}}, "emitted_at": 1674662478120} +{"stream": "admins", "data": {"type": "admin", "email": "jared@daxtarity.com", "id": "4425337", "name": "Jared Rhizor", "away_mode_enabled": false, "away_mode_reassign": false, "has_inbox_seat": false, "team_ids": [], "team_priority_level": {}}, "emitted_at": 1674662478120} +{"stream": "companies", "data": {"type": "company", "company_id": "60e6f753a99f97268e85bf53-qualification-company", "id": "60e6f753a99f97268e85bf52", "app_id": "wjw5eps7", "name": "Google", "created_at": 1625749331, "updated_at": 1625749675, "monthly_spend": 0, "session_count": 0, "user_count": 1, "size": 9, "industry": "IT", "tags": {"type": "tag.list", "tags": []}, "segments": {"type": "segment.list", "segments": []}, "plan": {}, "custom_attributes": {}}, "emitted_at": 1674662479200} +{"stream": "companies", "data": {"type": "company", "company_id": "5fcf6882dd7ad35d1718ef3a-qualification-company", "id": "5fcf6882dd7ad35d1718ef39", "app_id": "wjw5eps7", "name": "Test company", "created_at": 1607428226, "updated_at": 1607428367, "monthly_spend": 0, "session_count": 0, "user_count": 2, "size": 10, "tags": {"type": "tag.list", "tags": []}, "segments": {"type": "segment.list", "segments": []}, "plan": {}, "custom_attributes": {}}, "emitted_at": 1674662479201} +{"stream": "companies", "data": {"type": "company", "company_id": "5fcf68ed2022a598936dc693-qualification-company", "id": "5fcf68ed2022a598936dc692", "app_id": "wjw5eps7", "name": "Another company", "created_at": 1607428333, "updated_at": 1607428336, "monthly_spend": 0, "session_count": 0, "user_count": 1, "size": 700, "tags": {"type": "tag.list", "tags": []}, "segments": {"type": "segment.list", "segments": []}, "plan": {}, "custom_attributes": {}}, "emitted_at": 1674662479201} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "name", "full_name": "name", "label": "Company name", "description": "The name of a company", "data_type": "string", "api_writable": true, "ui_writable": true, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480699} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "company_id", "full_name": "company_id", "label": "Company ID", "description": "A number identifying a company", "data_type": "string", "api_writable": false, "ui_writable": false, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480700} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "last_request_at", "full_name": "last_request_at", "label": "Company last seen", "description": "The last day anyone from a company visited your site or app", "data_type": "date", "api_writable": false, "ui_writable": false, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480700} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "remote_created_at", "full_name": "remote_created_at", "label": "Company created at", "description": "The day a company was added to Intercom", "data_type": "date", "api_writable": true, "ui_writable": false, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480700} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "user_count", "full_name": "user_count", "label": "People", "description": "The number of people in a company", "data_type": "integer", "api_writable": false, "ui_writable": false, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480700} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "session_count", "full_name": "session_count", "label": "Company web sessions", "description": "All visits from anyone in a company to your product's site or app", "data_type": "integer", "api_writable": false, "ui_writable": false, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480700} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "name", "full_name": "plan.name", "label": "Plan", "description": "A specific plan or level within your product that companies have signed up to", "data_type": "string", "api_writable": false, "ui_writable": false, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480700} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "monthly_spend", "full_name": "monthly_spend", "label": "Monthly Spend", "description": "The monthly revenue you receive from a company", "data_type": "float", "api_writable": true, "ui_writable": false, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480701} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "size", "full_name": "size", "label": "Company size", "description": "The number of people employed in this company, expressed as a single number", "data_type": "integer", "api_writable": true, "ui_writable": true, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480701} +{"stream": "company_attributes", "data": {"type": "data_attribute", "name": "industry", "full_name": "industry", "label": "Company industry", "description": "The category or domain this company belongs to e.g. 'ecommerce' or 'SaaS'", "data_type": "string", "api_writable": true, "ui_writable": true, "custom": false, "archived": false, "model": "company"}, "emitted_at": 1674662480701} +{"stream": "company_segments", "data": {"type": "segment", "id": "60e6f9d8f94e2a2f3a8e9e91", "name": "IT", "created_at": 1625749976, "updated_at": 1625749977, "person_type": "user"}, "emitted_at": 1674662482828} +{"stream": "company_segments", "data": {"type": "segment", "id": "60e6fa2511c1a607e5d83fe9", "name": "Small", "created_at": 1625750053, "updated_at": 1625750054, "person_type": "user"}, "emitted_at": 1674662482829} +{"stream": "company_segments", "data": {"type": "segment", "id": "6241a4c30788677d7c8a3c44", "name": "Test_2", "created_at": 1648469187, "updated_at": 1648469610, "person_type": "user"}, "emitted_at": 1674662482829} +{"stream": "company_segments", "data": {"type": "segment", "id": "6241a4c30788677d7c8a3c44", "name": "Test_2", "created_at": 1648469187, "updated_at": 1648469610, "person_type": "user"}, "emitted_at": 1674662483199} +{"stream": "company_segments", "data": {"type": "segment", "id": "6241a4c30788677d7c8a3c44", "name": "Test_2", "created_at": 1648469187, "updated_at": 1648469610, "person_type": "user"}, "emitted_at": 1674662483602} +{"stream": "conversations", "data": {"type": "conversation", "id": "1", "created_at": 1607553243, "updated_at": 1626346673, "waiting_since": null, "snoozed_until": null, "source": {"type": "conversation", "id": "701718739", "delivered_as": "customer_initiated", "subject": "", "body": "

    hey there

    ", "author": {"type": "lead", "id": "5fd150d50697b6d0bbc4a2c2", "name": null, "email": ""}, "attachments": [], "url": "http://localhost:63342/airbyte-python/airbyte-integrations/bases/base-java/build/tmp/expandedArchives/org.jacoco.agent-0.8.5.jar_6a2df60c47de373ea127d14406367999/about.html?_ijt=uosck1k6vmp2dnl4oqib2g3u9d", "redacted": false}, "contacts": {"type": "contact.list", "contacts": [{"type": "contact", "id": "5fd150d50697b6d0bbc4a2c2"}]}, "first_contact_reply": {"created_at": 1607553243, "type": "conversation", "url": "http://localhost:63342/airbyte-python/airbyte-integrations/bases/base-java/build/tmp/expandedArchives/org.jacoco.agent-0.8.5.jar_6a2df60c47de373ea127d14406367999/about.html?_ijt=uosck1k6vmp2dnl4oqib2g3u9d"}, "admin_assignee_id": null, "team_assignee_id": null, "open": true, "state": "open", "read": false, "tags": {"type": "tag.list", "tags": []}, "priority": "not_priority", "sla_applied": null, "statistics": {"type": "conversation_statistics", "time_to_assignment": null, "time_to_admin_reply": 4317957, "time_to_first_close": null, "time_to_last_close": null, "median_time_to_reply": 4317954, "first_contact_reply_at": 1607553243, "first_assignment_at": null, "first_admin_reply_at": 1625654131, "first_close_at": null, "last_assignment_at": null, "last_assignment_admin_reply_at": null, "last_contact_reply_at": 1607553246, "last_admin_reply_at": 1625656000, "last_close_at": null, "last_closed_by_id": null, "count_reopens": 0, "count_assignments": 0, "count_conversation_parts": 7}, "conversation_rating": null, "teammates": {"type": "admin.list", "admins": [{"type": "admin", "id": "4423433"}]}, "title": null, "custom_attributes": {}, "topics": {"type": "topic.list", "topics": [], "total_count": 0}}, "emitted_at": 1674662485998} +{"stream": "conversations", "data": {"type": "conversation", "id": "2", "created_at": 1625749234, "updated_at": 1632835061, "waiting_since": null, "snoozed_until": null, "source": {"type": "conversation", "id": "906873821", "delivered_as": "admin_initiated", "subject": "", "body": "

    Hi Jean,

    ", "author": {"type": "admin", "id": "4423433", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "url": null, "redacted": false}, "contacts": {"type": "contact.list", "contacts": [{"type": "contact", "id": "60e6f6e020ae45ce1ac86f26"}]}, "first_contact_reply": null, "admin_assignee_id": 4423433, "team_assignee_id": null, "open": false, "state": "closed", "read": true, "tags": {"type": "tag.list", "tags": []}, "priority": "not_priority", "sla_applied": null, "statistics": {"type": "conversation_statistics", "time_to_assignment": null, "time_to_admin_reply": null, "time_to_first_close": null, "time_to_last_close": null, "median_time_to_reply": null, "first_contact_reply_at": null, "first_assignment_at": null, "first_admin_reply_at": null, "first_close_at": null, "last_assignment_at": null, "last_assignment_admin_reply_at": null, "last_contact_reply_at": null, "last_admin_reply_at": null, "last_close_at": null, "last_closed_by_id": null, "count_reopens": 0, "count_assignments": 0, "count_conversation_parts": 7}, "conversation_rating": null, "teammates": {"type": "admin.list", "admins": []}, "title": null, "custom_attributes": {}, "topics": {"type": "topic.list", "topics": [], "total_count": 0}}, "emitted_at": 1674662485999} +{"stream": "conversations", "data": {"type": "conversation", "id": "3", "created_at": 1657296525, "updated_at": 1657296525, "waiting_since": null, "snoozed_until": null, "source": {"type": "conversation", "id": "1365286568", "delivered_as": "admin_initiated", "subject": "", "body": "

    Hi Jean, integration test intercom message to verify assignee value

    ", "author": {"type": "admin", "id": "4423433", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "url": null, "redacted": false}, "contacts": {"type": "contact.list", "contacts": [{"type": "contact", "id": "60e6f6e020ae45ce1ac86f26"}]}, "first_contact_reply": null, "admin_assignee_id": null, "team_assignee_id": null, "open": false, "state": "closed", "read": false, "tags": {"type": "tag.list", "tags": []}, "priority": "not_priority", "sla_applied": null, "statistics": {"type": "conversation_statistics", "time_to_assignment": null, "time_to_admin_reply": null, "time_to_first_close": null, "time_to_last_close": null, "median_time_to_reply": null, "first_contact_reply_at": null, "first_assignment_at": null, "first_admin_reply_at": null, "first_close_at": null, "last_assignment_at": null, "last_assignment_admin_reply_at": null, "last_contact_reply_at": null, "last_admin_reply_at": null, "last_close_at": null, "last_closed_by_id": null, "count_reopens": 0, "count_assignments": 0, "count_conversation_parts": 1}, "conversation_rating": null, "teammates": {"type": "admin.list", "admins": [{"type": "admin", "id": "4423433"}]}, "title": null, "custom_attributes": {}, "topics": {"type": "topic.list", "topics": [], "total_count": 0}}, "emitted_at": 1674662485999} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "7288120839", "part_type": "comment", "body": "

    is this showing up

    ", "created_at": 1607553246, "updated_at": 1607553246, "notified_at": 1607553246, "assigned_to": null, "author": {"id": "5fd150d50697b6d0bbc4a2c2", "type": "user", "name": null, "email": ""}, "attachments": [], "external_id": null, "redacted": false, "conversation_id": "1"}, "emitted_at": 1674662489685} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "7288121348", "part_type": "comment", "body": "

    Airbyte [DEV] will reply as soon as they can.

    ", "created_at": 1607553249, "updated_at": 1607553249, "notified_at": 1607553249, "assigned_to": null, "author": {"id": "4423434", "type": "bot", "name": "Operator", "email": "operator+wjw5eps7@intercom.io"}, "attachments": [], "external_id": null, "redacted": false, "conversation_id": "1"}, "emitted_at": 1674662489688} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "7288121392", "part_type": "comment", "body": "

    Give the team a way to reach you:

    ", "created_at": 1607553250, "updated_at": 1607553250, "notified_at": 1607553250, "assigned_to": null, "author": {"id": "4423434", "type": "bot", "name": "Operator", "email": "operator+wjw5eps7@intercom.io"}, "attachments": [], "external_id": null, "redacted": false, "conversation_id": "1"}, "emitted_at": 1674662489689} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "7288121429", "part_type": "comment", "body": null, "created_at": 1607553250, "updated_at": 1607553250, "notified_at": 1607553250, "assigned_to": null, "author": {"id": "4423434", "type": "bot", "name": "Operator", "email": "operator+wjw5eps7@intercom.io"}, "attachments": [], "external_id": null, "redacted": false, "conversation_id": "1"}, "emitted_at": 1674662489690} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "9852986065", "part_type": "comment", "body": "

    This message was deleted

    ", "created_at": 1625654131, "updated_at": 1626346672, "notified_at": 1625654131, "assigned_to": null, "author": {"id": "4423433", "type": "admin", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "external_id": null, "redacted": true, "conversation_id": "1"}, "emitted_at": 1674662489692} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "9853397844", "part_type": "comment", "body": "

    This message was deleted

    ", "created_at": 1625656000, "updated_at": 1626346669, "notified_at": 1625656000, "assigned_to": null, "author": {"id": "4423433", "type": "admin", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "external_id": null, "redacted": true, "conversation_id": "1"}, "emitted_at": 1674662489693} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "9871038696", "part_type": "message_assignment", "body": null, "created_at": 1625749234, "updated_at": 1625749234, "notified_at": 1625749234, "assigned_to": {"type": "admin", "id": "4423433"}, "author": {"id": "4423434", "type": "bot", "name": "Operator", "email": "operator+wjw5eps7@intercom.io"}, "attachments": [], "external_id": null, "redacted": false, "conversation_id": "2"}, "emitted_at": 1674662490268} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "9964427910", "part_type": "comment", "body": "

    This message was deleted

    ", "created_at": 1626345659, "updated_at": 1626346678, "notified_at": 1626345659, "assigned_to": null, "author": {"id": "4423433", "type": "admin", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "external_id": null, "redacted": true, "conversation_id": "2"}, "emitted_at": 1674662490271} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "9967676159", "part_type": "comment", "body": "

    hi

    ", "created_at": 1626358549, "updated_at": 1626358549, "notified_at": 1626358549, "assigned_to": null, "author": {"id": "4423433", "type": "admin", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "external_id": null, "redacted": false, "conversation_id": "2"}, "emitted_at": 1674662490272} +{"stream": "conversation_parts", "data": {"type": "conversation_part", "id": "11002268877", "part_type": "close", "body": null, "created_at": 1632768169, "updated_at": 1632768169, "notified_at": 1632768169, "assigned_to": null, "author": {"id": "4423433", "type": "admin", "name": "Airbyte Team", "email": "integration-test@airbyte.io"}, "attachments": [], "external_id": null, "redacted": false, "conversation_id": "2"}, "emitted_at": 1674662490274} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "role", "full_name": "role", "label": "Contact role", "description": "A person's role in their company, such as the name of their department", "data_type": "string", "api_writable": true, "ui_writable": false, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492146} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "name", "full_name": "name", "label": "Name", "description": "A person's full name", "data_type": "string", "api_writable": true, "ui_writable": true, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492146} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "owner_id", "full_name": "owner_id", "label": "Owner", "description": "The teammate that owns a lead or user in Intercom", "data_type": "integer", "api_writable": true, "ui_writable": false, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492146} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "email", "full_name": "email", "label": "Email", "description": "The email address assigned to a user or lead", "data_type": "string", "api_writable": true, "ui_writable": true, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492146} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "phone", "full_name": "phone", "label": "Phone", "description": "A person's phone number", "data_type": "string", "api_writable": true, "ui_writable": true, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492146} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "external_id", "full_name": "external_id", "label": "User ID", "description": "A number identifying a person (applies to both users and leads)", "data_type": "string", "api_writable": true, "ui_writable": false, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492146} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "created_at", "full_name": "created_at", "label": "First Seen", "description": "The first day a person visited your site or app", "data_type": "date", "api_writable": false, "ui_writable": false, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492146} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "signed_up_at", "full_name": "signed_up_at", "label": "Signed up", "description": "The day a person first signed up for your product", "data_type": "date", "api_writable": true, "ui_writable": false, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492147} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "last_seen_at", "full_name": "last_seen_at", "label": "Last seen", "description": "The last day a person visited your site or app", "data_type": "date", "api_writable": true, "ui_writable": false, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492147} +{"stream": "contact_attributes", "data": {"type": "data_attribute", "name": "last_contacted_at", "full_name": "last_contacted_at", "label": "Last contacted", "description": "The last day you or a teammate contacted a person", "data_type": "date", "api_writable": false, "ui_writable": false, "custom": false, "archived": false, "model": "contact"}, "emitted_at": 1674662492147} +{"stream": "contacts", "data": {"type": "contact", "id": "5fc95a8e04593c4947b9885f", "workspace_id": "wjw5eps7", "external_id": "2", "role": "user", "email": "test@test.com", "phone": null, "name": "Test2", "avatar": null, "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1607031438, "updated_at": 1607031438, "signed_up_at": null, "last_seen_at": null, "last_replied_at": null, "last_contacted_at": null, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": null, "browser_version": null, "browser_language": null, "os": null, "location": {"type": "location", "country": null, "region": null, "city": null, "country_code": null, "continent_code": null}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/5fc95a8e04593c4947b9885f/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/5fc95a8e04593c4947b9885f/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [], "url": "/contacts/5fc95a8e04593c4947b9885f/companies", "total_count": 0, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/5fc95a8e04593c4947b9885f/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493247} +{"stream": "contacts", "data": {"type": "contact", "id": "5fc95aaebc3d984f98d62069", "workspace_id": "wjw5eps7", "external_id": null, "role": "lead", "email": "test.lead@mail.com", "phone": null, "name": "Test Lead", "avatar": null, "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1607031470, "updated_at": 1607428234, "signed_up_at": null, "last_seen_at": null, "last_replied_at": null, "last_contacted_at": null, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": null, "browser_version": null, "browser_language": null, "os": null, "location": {"type": "location", "country": null, "region": null, "city": null, "country_code": null, "continent_code": null}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/5fc95aaebc3d984f98d62069/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/5fc95aaebc3d984f98d62069/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [{"id": "5fcf6882dd7ad35d1718ef39", "type": "company", "url": "/companies/5fcf6882dd7ad35d1718ef39"}], "url": "/contacts/5fc95aaebc3d984f98d62069/companies", "total_count": 1, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/5fc95aaebc3d984f98d62069/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493249} +{"stream": "contacts", "data": {"type": "contact", "id": "5fcf68e4a0f57b4393c7c7d1", "workspace_id": "wjw5eps7", "external_id": "3", "role": "user", "email": "user@mail.com", "phone": null, "name": "User 2", "avatar": null, "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1607428324, "updated_at": 1607428336, "signed_up_at": null, "last_seen_at": null, "last_replied_at": null, "last_contacted_at": null, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": null, "browser_version": null, "browser_language": null, "os": null, "location": {"type": "location", "country": null, "region": null, "city": null, "country_code": null, "continent_code": null}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/5fcf68e4a0f57b4393c7c7d1/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/5fcf68e4a0f57b4393c7c7d1/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [{"id": "5fcf68ed2022a598936dc692", "type": "company", "url": "/companies/5fcf68ed2022a598936dc692"}], "url": "/contacts/5fcf68e4a0f57b4393c7c7d1/companies", "total_count": 1, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/5fcf68e4a0f57b4393c7c7d1/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493250} +{"stream": "contacts", "data": {"type": "contact", "id": "5fc95aca2022a595c8670de8", "workspace_id": "wjw5eps7", "external_id": null, "role": "lead", "email": "test.lead.2@mail.com", "phone": null, "name": "Test Lead 2", "avatar": null, "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1607031498, "updated_at": 1607428367, "signed_up_at": null, "last_seen_at": null, "last_replied_at": null, "last_contacted_at": null, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": null, "browser_version": null, "browser_language": null, "os": null, "location": {"type": "location", "country": null, "region": null, "city": null, "country_code": null, "continent_code": null}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/5fc95aca2022a595c8670de8/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/5fc95aca2022a595c8670de8/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [{"id": "5fcf6882dd7ad35d1718ef39", "type": "company", "url": "/companies/5fcf6882dd7ad35d1718ef39"}], "url": "/contacts/5fc95aca2022a595c8670de8/companies", "total_count": 1, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/5fc95aca2022a595c8670de8/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493252} +{"stream": "contacts", "data": {"type": "contact", "id": "5fd150d50697b6d0bbc4a2c2", "workspace_id": "wjw5eps7", "external_id": "56f1e303-24f7-4f0a-ae18-0bafd587c894", "role": "lead", "email": null, "phone": null, "name": null, "avatar": "https://static.intercomassets.com/app/pseudonym_avatars_2019/yellow-guitar.png", "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1607553237, "updated_at": 1625656002, "signed_up_at": null, "last_seen_at": 1607553243, "last_replied_at": 1607553246, "last_contacted_at": 1625656000, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": "chrome", "browser_version": "87.0.4280.88", "browser_language": "en", "os": "OS X 10.15.6", "location": {"type": "location", "country": "United States", "region": "California", "city": "Daly City", "country_code": "USA", "continent_code": "NA"}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/5fd150d50697b6d0bbc4a2c2/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/5fd150d50697b6d0bbc4a2c2/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [], "url": "/contacts/5fd150d50697b6d0bbc4a2c2/companies", "total_count": 0, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/5fd150d50697b6d0bbc4a2c2/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493254} +{"stream": "contacts", "data": {"type": "contact", "id": "5fc95a808084cd6950bc8d9b", "workspace_id": "wjw5eps7", "external_id": "1", "role": "user", "email": "test@test.com", "phone": null, "name": "Test", "avatar": null, "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1607031424, "updated_at": 1625749675, "signed_up_at": null, "last_seen_at": null, "last_replied_at": null, "last_contacted_at": null, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": null, "browser_version": null, "browser_language": null, "os": null, "location": {"type": "location", "country": null, "region": null, "city": null, "country_code": null, "continent_code": null}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/5fc95a808084cd6950bc8d9b/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/5fc95a808084cd6950bc8d9b/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [{"id": "60e6f753a99f97268e85bf52", "type": "company", "url": "/companies/60e6f753a99f97268e85bf52"}], "url": "/contacts/5fc95a808084cd6950bc8d9b/companies", "total_count": 1, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/5fc95a808084cd6950bc8d9b/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493255} +{"stream": "contacts", "data": {"type": "contact", "id": "6241a38316049ffd7261a0dc", "workspace_id": "wjw5eps7", "external_id": "1234", "role": "user", "email": "test@gmail.com", "phone": null, "name": "Tets", "avatar": null, "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1648468867, "updated_at": 1648468867, "signed_up_at": null, "last_seen_at": null, "last_replied_at": null, "last_contacted_at": null, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": null, "browser_version": null, "browser_language": null, "os": null, "location": {"type": "location", "country": null, "region": null, "city": null, "country_code": null, "continent_code": null}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/6241a38316049ffd7261a0dc/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/6241a38316049ffd7261a0dc/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [], "url": "/contacts/6241a38316049ffd7261a0dc/companies", "total_count": 0, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/6241a38316049ffd7261a0dc/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493256} +{"stream": "contacts", "data": {"type": "contact", "id": "62de64071123272c1ff04f29", "workspace_id": "wjw5eps7", "external_id": "123", "role": "user", "email": "test@example.com", "phone": null, "name": "Fake user1", "avatar": null, "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1658741767, "updated_at": 1658741767, "signed_up_at": null, "last_seen_at": null, "last_replied_at": null, "last_contacted_at": null, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": null, "browser_version": null, "browser_language": null, "os": null, "location": {"type": "location", "country": null, "region": null, "city": null, "country_code": null, "continent_code": null}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/62de64071123272c1ff04f29/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/62de64071123272c1ff04f29/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [], "url": "/contacts/62de64071123272c1ff04f29/companies", "total_count": 0, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/62de64071123272c1ff04f29/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493257} +{"stream": "contacts", "data": {"type": "contact", "id": "60e6f6e020ae45ce1ac86f26", "workspace_id": "wjw5eps7", "external_id": null, "role": "user", "email": "integration-test@airbyte.io", "phone": null, "name": "[Sample]Joan Lambert", "avatar": null, "owner_id": null, "social_profiles": {"type": "list", "data": []}, "has_hard_bounced": false, "marked_email_as_spam": false, "unsubscribed_from_emails": false, "created_at": 1625749216, "updated_at": 1673945508, "signed_up_at": null, "last_seen_at": null, "last_replied_at": null, "last_contacted_at": 1657296523, "last_email_opened_at": null, "last_email_clicked_at": null, "language_override": null, "browser": null, "browser_version": null, "browser_language": null, "os": null, "location": {"type": "location", "country": null, "region": null, "city": null, "country_code": null, "continent_code": null}, "android_app_name": null, "android_app_version": null, "android_device": null, "android_os_version": null, "android_sdk_version": null, "android_last_seen_at": null, "ios_app_name": null, "ios_app_version": null, "ios_device": null, "ios_os_version": null, "ios_sdk_version": null, "ios_last_seen_at": null, "custom_attributes": {}, "tags": {"type": "list", "data": [], "url": "/contacts/60e6f6e020ae45ce1ac86f26/tags", "total_count": 0, "has_more": false}, "notes": {"type": "list", "data": [], "url": "/contacts/60e6f6e020ae45ce1ac86f26/notes", "total_count": 0, "has_more": false}, "companies": {"type": "list", "data": [], "url": "/contacts/60e6f6e020ae45ce1ac86f26/companies", "total_count": 0, "has_more": false}, "opted_out_subscription_types": {"type": "list", "data": [], "url": "/contacts/60e6f6e020ae45ce1ac86f26/subscriptions", "total_count": 0, "has_more": false}, "utm_campaign": null, "utm_content": null, "utm_medium": null, "utm_source": null, "utm_term": null, "referrer": null, "sms_consent": false, "unsubscribed_from_sms": false}, "emitted_at": 1674662493258} +{"stream": "segments", "data": {"type": "segment", "id": "5f8d1c6caee76458e332f238", "name": "Active", "created_at": 1603083372, "updated_at": 1603083372, "person_type": "user"}, "emitted_at": 1674662494290} +{"stream": "segments", "data": {"type": "segment", "id": "5f8d1c6caee76458e332f237", "name": "New", "created_at": 1603083372, "updated_at": 1603083372, "person_type": "user"}, "emitted_at": 1674662494290} +{"stream": "segments", "data": {"type": "segment", "id": "5f8d1c6caee76458e332f239", "name": "Slipping Away", "created_at": 1603083372, "updated_at": 1603083372, "person_type": "user"}, "emitted_at": 1674662494290} +{"stream": "segments", "data": {"type": "segment", "id": "5fcf65de5f0be4c8398c4f8f", "name": "Test segment", "created_at": 1607427550, "updated_at": 1607427550, "person_type": "user"}, "emitted_at": 1674662494290} +{"stream": "tags", "data": {"type": "tag", "id": "4849642", "name": "onboarded to feature A"}, "emitted_at": 1674662495351} +{"stream": "teams", "data": {"type": "team", "id": "5077733", "name": "test", "admin_ids": []}, "emitted_at": 1674662496385} diff --git a/airbyte-integrations/connectors/source-intercom/integration_tests/incremental_catalog.json b/airbyte-integrations/connectors/source-intercom/integration_tests/incremental_catalog.json new file mode 100644 index 0000000000000..2c4a3735e86dc --- /dev/null +++ b/airbyte-integrations/connectors/source-intercom/integration_tests/incremental_catalog.json @@ -0,0 +1,88 @@ +{ + "streams": [ + { + "stream": { + "name": "companies", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] + }, + "sync_mode": "incremental", + "cursor_field": ["updated_at"], + "primary_key": [["id"]], + "destination_sync_mode": "append" + }, + { + "stream": { + "name": "company_segments", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] + }, + "sync_mode": "incremental", + "cursor_field": ["updated_at"], + "primary_key": [["id"]], + "destination_sync_mode": "append" + }, + { + "stream": { + "name": "conversations", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] + }, + "sync_mode": "incremental", + "primary_key": [["id"]], + "cursor_field": ["updated_at"], + "destination_sync_mode": "append" + }, + { + "stream": { + "name": "conversation_parts", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] + }, + "sync_mode": "incremental", + "cursor_field": ["updated_at"], + "destination_sync_mode": "append", + "primary_key": [["id"]] + }, + { + "stream": { + "name": "contacts", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] + }, + "sync_mode": "incremental", + "cursor_field": ["updated_at"], + "destination_sync_mode": "append", + "primary_key": [["id"]] + }, + { + "stream": { + "name": "segments", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["updated_at"], + "source_defined_primary_key": [["id"]] + }, + "sync_mode": "incremental", + "cursor_field": ["updated_at"], + "destination_sync_mode": "append", + "primary_key": [["id"]] + } + ] +} From 0e3d2ba43101ab00df4d294ad1a6c06b6c2f95d2 Mon Sep 17 00:00:00 2001 From: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> Date: Wed, 25 Jan 2023 14:07:39 -0500 Subject: [PATCH 091/195] Remove z-index rule from Switch component handle (#21857) --- airbyte-webapp/src/components/ui/Switch/Switch.module.scss | 2 -- airbyte-webapp/src/scss/_z-indices.scss | 1 - 2 files changed, 3 deletions(-) diff --git a/airbyte-webapp/src/components/ui/Switch/Switch.module.scss b/airbyte-webapp/src/components/ui/Switch/Switch.module.scss index d80cde9fe1035..8b522f92fba3a 100644 --- a/airbyte-webapp/src/components/ui/Switch/Switch.module.scss +++ b/airbyte-webapp/src/components/ui/Switch/Switch.module.scss @@ -1,6 +1,5 @@ @use "scss/colors"; @use "scss/variables"; -@use "scss/z-indices"; @mixin knob-transform($position, $size) { @if $position == left { @@ -99,7 +98,6 @@ &::before { position: absolute; - z-index: z-indices.$switchSliderBefore; content: ""; background: colors.$white; transition: variables.$transition; diff --git a/airbyte-webapp/src/scss/_z-indices.scss b/airbyte-webapp/src/scss/_z-indices.scss index 752c0b00ecb38..b33a1bf73559c 100644 --- a/airbyte-webapp/src/scss/_z-indices.scss +++ b/airbyte-webapp/src/scss/_z-indices.scss @@ -6,6 +6,5 @@ $sidebar: 9999; $schemaChangesBackdropContent: 4; $schemaChangesBackdrop: 3; $dropdownMenu: 2; -$switchSliderBefore: 1; $tableScroll: 1; $panelSplitter: 0; From 6801049111f279fd8f19313da4e7fe45d2f2ccef Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi <53845333+lazebnyi@users.noreply.github.com> Date: Wed, 25 Jan 2023 20:34:13 +0100 Subject: [PATCH 092/195] Source Mixpanel: enable `high` test strictness level in SAT (#21510) * Enable high test strictness * Updated expected_records.jsonl * Updated expected records * Increased timeout * Updated abnormal state * Updated cursor_path * Updated acceptance tests config --- .../connectors/source-mixpanel/README.md | 2 +- .../acceptance-test-config.yml | 73 ++++++++++--------- .../integration_tests/abnormal_state.json | 2 +- .../integration_tests/configured_catalog.json | 55 +++++--------- .../configured_catalog_incremental.json | 52 +++++++++++++ .../integration_tests/expected_records.jsonl | 47 ++++++++++++ docs/integrations/sources/mixpanel.md | 2 +- 7 files changed, 160 insertions(+), 73 deletions(-) create mode 100644 airbyte-integrations/connectors/source-mixpanel/integration_tests/configured_catalog_incremental.json create mode 100644 airbyte-integrations/connectors/source-mixpanel/integration_tests/expected_records.jsonl diff --git a/airbyte-integrations/connectors/source-mixpanel/README.md b/airbyte-integrations/connectors/source-mixpanel/README.md index ded179f865c9c..36a2a875572e0 100644 --- a/airbyte-integrations/connectors/source-mixpanel/README.md +++ b/airbyte-integrations/connectors/source-mixpanel/README.md @@ -81,7 +81,7 @@ docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integrat Make sure to familiarize yourself with [pytest test discovery](https://docs.pytest.org/en/latest/goodpractices.html#test-discovery) to know how your test files and methods should be named. First install test dependencies into your virtual environment: ``` -pip install .[tests] +pip install .'[tests]' ``` ### Unit Tests To run unit tests locally, from the connector directory run: diff --git a/airbyte-integrations/connectors/source-mixpanel/acceptance-test-config.yml b/airbyte-integrations/connectors/source-mixpanel/acceptance-test-config.yml index 563ea4642c52f..43baaefd5f9ba 100644 --- a/airbyte-integrations/connectors/source-mixpanel/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-mixpanel/acceptance-test-config.yml @@ -1,42 +1,49 @@ # See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-mixpanel:dev -tests: +test_strictness_level: "high" +acceptance_tests: spec: - - spec_path: "source_mixpanel/spec.json" - backward_compatibility_tests_config: - disable_for_version: "0.1.23" + tests: + - spec_path: "source_mixpanel/spec.json" connection: - - config_path: "secrets/config_old.json" - status: "succeed" - - config_path: "secrets/config_project_secret.json" - status: "succeed" - - config_path: "secrets/config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" + tests: + - config_path: "secrets/config_old.json" + status: "succeed" + - config_path: "secrets/config_project_secret.json" + status: "succeed" + - config_path: "secrets/config.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" discovery: - - config_path: "secrets/config.json" - backward_compatibility_tests_config: - disable_for_version: "0.1.23" - timeout_seconds: 60 + tests: + - config_path: "secrets/config_old.json" + timeout_seconds: 60 basic_read: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - timeout_seconds: 3600 - empty_streams: ['export', 'annotations'] + tests: + - config_path: "secrets/config.json" + timeout_seconds: 9000 + expect_records: + path: "integration_tests/expected_records.jsonl" + extra_fields: no + exact_order: no + extra_records: yes full_refresh: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - timeout_seconds: 3600 + tests: + - config_path: "secrets/config_old.json" + configured_catalog_path: "integration_tests/configured_catalog.json" + timeout_seconds: 9000 incremental: - - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - future_state_path: "integration_tests/abnormal_state.json" - cursor_paths: - cohorts: ["created"] - export: ["time"] - funnels: ["8901755", "date"] - revenue: ["date"] - cohort_members": ["last_seen"] - timeout_seconds: 3600 + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog_incremental.json" + future_state: + future_state_path: "integration_tests/abnormal_state.json" + cursor_paths: + cohorts: ["created"] + export: ["time"] + funnels: ["36152117", "date"] + revenue: ["date"] + cohort_members": ["last_seen"] + timeout_seconds: 9000 diff --git a/airbyte-integrations/connectors/source-mixpanel/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-mixpanel/integration_tests/abnormal_state.json index ee368b68b2081..0d4d97a4e1aeb 100644 --- a/airbyte-integrations/connectors/source-mixpanel/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-mixpanel/integration_tests/abnormal_state.json @@ -2,7 +2,7 @@ { "type": "STREAM", "stream": { - "stream_state": { "8901755": { "date": "2030-01-01" } }, + "stream_state": { "36152117": { "date": "2030-01-01" } }, "stream_descriptor": { "name": "funnels" } } }, diff --git a/airbyte-integrations/connectors/source-mixpanel/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-mixpanel/integration_tests/configured_catalog.json index e8bf78c6703a6..4cd39b09bb349 100644 --- a/airbyte-integrations/connectors/source-mixpanel/integration_tests/configured_catalog.json +++ b/airbyte-integrations/connectors/source-mixpanel/integration_tests/configured_catalog.json @@ -4,26 +4,19 @@ "stream": { "name": "funnels", "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": true, - "default_cursor_field": ["date"], - "source_defined_primary_key": [["funnel_id"], ["date"]] + "supported_sync_modes": ["full_refresh"] }, - "sync_mode": "incremental", - "destination_sync_mode": "append" + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" }, { "stream": { "name": "engage", "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": false, - "default_cursor_field": ["last_seen"], - "source_defined_primary_key": [["distinct_id"]] + "supported_sync_modes": ["full_refresh"] }, - "sync_mode": "incremental", - "destination_sync_mode": "append", - "cursor_field": ["last_seen"] + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" }, { "stream": { @@ -38,49 +31,37 @@ "stream": { "name": "export", "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": true, - "default_cursor_field": ["time"] + "supported_sync_modes": ["full_refresh"] }, - "sync_mode": "incremental", - "destination_sync_mode": "append" + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" }, { "stream": { "name": "cohorts", "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": true, - "default_cursor_field": ["created"], - "source_defined_primary_key": [["id"]] + "supported_sync_modes": ["full_refresh"] }, - "sync_mode": "incremental", - "destination_sync_mode": "append" + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" }, { "stream": { "name": "cohort_members", "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": false, - "default_cursor_field": ["last_seen"], - "source_defined_primary_key": [["distinct_id"]] + "supported_sync_modes": ["full_refresh"] }, - "sync_mode": "incremental", - "destination_sync_mode": "append", - "cursor_field": ["last_seen"] + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" }, { "stream": { "name": "revenue", "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": true, - "default_cursor_field": ["date"], - "source_defined_primary_key": [["date"]] + "supported_sync_modes": ["full_refresh"] }, - "sync_mode": "incremental", - "destination_sync_mode": "append" + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" } ] } diff --git a/airbyte-integrations/connectors/source-mixpanel/integration_tests/configured_catalog_incremental.json b/airbyte-integrations/connectors/source-mixpanel/integration_tests/configured_catalog_incremental.json new file mode 100644 index 0000000000000..d3ae77abd5a67 --- /dev/null +++ b/airbyte-integrations/connectors/source-mixpanel/integration_tests/configured_catalog_incremental.json @@ -0,0 +1,52 @@ +{ + "streams": [ + { + "stream": { + "name": "funnels", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["date"], + "source_defined_primary_key": [["funnel_id"], ["date"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append" + }, + { + "stream": { + "name": "export", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["time"] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append" + }, + { + "stream": { + "name": "cohorts", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["created"], + "source_defined_primary_key": [["id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append" + }, + { + "stream": { + "name": "cohort_members", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": false, + "default_cursor_field": ["last_seen"], + "source_defined_primary_key": [["distinct_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["last_seen"] + } + ] +} diff --git a/airbyte-integrations/connectors/source-mixpanel/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-mixpanel/integration_tests/expected_records.jsonl new file mode 100644 index 0000000000000..13c8246b321c0 --- /dev/null +++ b/airbyte-integrations/connectors/source-mixpanel/integration_tests/expected_records.jsonl @@ -0,0 +1,47 @@ +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-05", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162835} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-06", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162836} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-07", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162837} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-08", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162837} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-09", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162837} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-01", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162838} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-02", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162838} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-03", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162838} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-04", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162839} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-10", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162839} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-11", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162839} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-12", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162840} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-13", "steps": [{"count": 1, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0.0, "step_conv_ratio": 0.0}], "analysis": {"completion": 0, "starting_amount": 1, "steps": 2, "worst": 1}}, "emitted_at": 1674078162840} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-14", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162840} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-15", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162841} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-16", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162841} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-17", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162842} +{"stream": "funnels", "data": {"funnel_id": 36152117, "name": "test", "date": "2023-01-18", "steps": [{"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "Purchase", "goal": "Purchase", "step_label": "Purchase", "overall_conv_ratio": 1, "step_conv_ratio": 1}, {"count": 0, "avg_time": null, "avg_time_from_start": null, "event": "$custom_event:1305068", "goal": "$custom_event:1305068", "step_label": "111", "custom_event": true, "custom_event_id": 1305068, "overall_conv_ratio": 0, "step_conv_ratio": 0}], "analysis": {"completion": 0, "starting_amount": 0, "steps": 2, "worst": 1}}, "emitted_at": 1674078162842} +{"stream": "engage", "data": {"distinct_id": "123@gmail.com", "email": "123@gmail.com", "name": "123", "123": "123456", "last_seen": "2023-01-01T00:00:00"}, "emitted_at": 1674078164884} +{"stream": "engage", "data": {"distinct_id": "integration-test@airbyte.io", "name": "Integration Test1", "test": "test", "email": "integration-test@airbyte.io", "last_seen": "2023-01-01T00:00:00"}, "emitted_at": 1674078164885} +{"stream": "engage", "data": {"distinct_id": "integration-test.db4415.mp-service-account", "name": "test", "test": "test", "last_seen": "2023-01-01T00:00:00"}, "emitted_at": 1674078164886} +{"stream": "annotations", "data": {"date": "2023-01-15T12:00:00+01:00", "description": "test", "id": 1138193, "project_id": 2529987, "user": {"id": 3440095, "first_name": "", "last_name": ""}}, "emitted_at": 1674078166077} +{"stream": "annotations", "data": {"date": "2023-01-13T12:00:00+01:00", "description": "test123", "id": 1138196, "project_id": 2529987, "user": {"id": 3440095, "first_name": "", "last_name": ""}}, "emitted_at": 1674078166077} +{"stream": "annotations", "data": {"date": "2023-01-13T12:00:00+01:00", "description": "test121233", "id": 1138197, "project_id": 2529987, "user": {"id": 3440095, "first_name": "", "last_name": ""}}, "emitted_at": 1674078166077} +{"stream": "export", "data": {"event": "Purchase", "import": "True", "insert_id": "935d87b1-00cd-41b7-be34-b9d98dd08b42", "mp_api_endpoint": "api.mixpanel.com", "mp_api_timestamp_ms": "1674001620825", "Amount": "5", "Item": "Coffee", "distinct_id": "91304156-cafc-4673-a237-623d1129c801", "mp_processing_time_ms": "1674001621149", "time": "2023-01-13T12:05:17Z"}, "emitted_at": 1674078168557} +{"stream": "export", "data": {"event": "Signup", "import": "True", "insert_id": "29fc2962-6d9c-455d-95ad-95b84f09b9e4", "mp_api_endpoint": "api.mixpanel.com", "mp_api_timestamp_ms": "1674001620825", "Referred by": "Friend", "URL": "mixpanel.com/signup", "distinct_id": "91304156-cafc-4673-a237-623d1129c801", "mp_processing_time_ms": "1674001621450", "time": "2023-01-13T12:05:17Z"}, "emitted_at": 1674078168559} +{"stream": "cohorts", "data": {"id": 1478097, "project_id": 2529987, "name": "Cohort1", "description": "", "data_group_id": null, "count": 2, "is_visible": 1, "created": "2021-09-14 15:57:43"}, "emitted_at": 1674078170456} +{"stream": "cohort_members", "data": {"distinct_id": "integration-test@airbyte.io", "name": "Integration Test1", "test": "test", "email": "integration-test@airbyte.io", "last_seen": "2023-01-01T00:00:00", "cohort_id": 1478097}, "emitted_at": 1674078233870} +{"stream": "cohort_members", "data": {"distinct_id": "integration-test.db4415.mp-service-account", "name": "test", "test": "test", "last_seen": "2023-01-01T00:00:00", "cohort_id": 1478097}, "emitted_at": 1674078233871} +{"stream": "revenue", "data": {"date": "2023-01-01", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235380} +{"stream": "revenue", "data": {"date": "2023-01-02", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235381} +{"stream": "revenue", "data": {"date": "2023-01-03", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235381} +{"stream": "revenue", "data": {"date": "2023-01-04", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235381} +{"stream": "revenue", "data": {"date": "2023-01-05", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235381} +{"stream": "revenue", "data": {"date": "2023-01-06", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235382} +{"stream": "revenue", "data": {"date": "2023-01-07", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235382} +{"stream": "revenue", "data": {"date": "2023-01-08", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235382} +{"stream": "revenue", "data": {"date": "2023-01-09", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235382} +{"stream": "revenue", "data": {"date": "2023-01-10", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235382} +{"stream": "revenue", "data": {"date": "2023-01-11", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235383} +{"stream": "revenue", "data": {"date": "2023-01-12", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235383} +{"stream": "revenue", "data": {"date": "2023-01-13", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235383} +{"stream": "revenue", "data": {"date": "2023-01-14", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235383} +{"stream": "revenue", "data": {"date": "2023-01-15", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235383} +{"stream": "revenue", "data": {"date": "2023-01-16", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235384} +{"stream": "revenue", "data": {"date": "2023-01-17", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235384} +{"stream": "revenue", "data": {"date": "2023-01-18", "amount": 0.0, "count": 3, "paid_count": 0}, "emitted_at": 1674078235384} diff --git a/docs/integrations/sources/mixpanel.md b/docs/integrations/sources/mixpanel.md index df8be46d181ef..8ba35055c5871 100644 --- a/docs/integrations/sources/mixpanel.md +++ b/docs/integrations/sources/mixpanel.md @@ -23,7 +23,7 @@ To set up the Harvest source connector, you'll need a Mixpanel [Service Account] 13. Click **Set up source**. ## Supported sync modes -The Mixpanel source connector supports the following[ sync modes](https://docs.airbyte.com/cloud/core-concepts#connection-sync-modes): +The Mixpanel source connector supports the following [sync modes](https://docs.airbyte.com/cloud/core-concepts#connection-sync-modes): * [Full Refresh - Overwrite](https://docs.airbyte.com/understanding-airbyte/glossary#full-refresh-sync) * [Full Refresh - Append](https://docs.airbyte.com/understanding-airbyte/connections/full-refresh-append) From fe4f37c0b6dbb0a2fad4588e5689026efed17546 Mon Sep 17 00:00:00 2001 From: Lake Mossman Date: Wed, 25 Jan 2023 12:15:36 -0800 Subject: [PATCH 093/195] =?UTF-8?q?=F0=9F=AA=9F=F0=9F=94=A7=20use=20https?= =?UTF-8?q?=20instead=20of=20http=20for=20localhost:3000=20in=20e2e=20weba?= =?UTF-8?q?pp=20tests=20(#21874)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * use https instead of http for localhost:3000 in e2e webapp tests * Undo changes to :8000 urls --- airbyte-webapp-e2e-tests/cypress.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-webapp-e2e-tests/cypress.json b/airbyte-webapp-e2e-tests/cypress.json index 474344d4272fd..83ab67ad57df2 100644 --- a/airbyte-webapp-e2e-tests/cypress.json +++ b/airbyte-webapp-e2e-tests/cypress.json @@ -1,6 +1,6 @@ { "projectId": "916nvw", - "baseUrl": "http://localhost:3000", + "baseUrl": "https://localhost:3000", "testFiles": ["**/*.spec.*"], "viewportHeight": 800, "viewportWidth": 1280, @@ -14,6 +14,6 @@ "host": "localhost", "database": "airbyte_ci_source", "password": "secret_password", - "port":5433 + "port": 5433 } } From fa2c03ab4ceb4bde6f0c34c8799b771ca4f81a14 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 25 Jan 2023 21:26:29 +0100 Subject: [PATCH 094/195] Extend SATs to capture UI limitations (#21451) * WIP SATs * adding some more tests * improve unit tests * adjustments * formatting * allow number and integer for arrays * review comments * review comments * Update test_core.py * format * format 2 * bump SAT version --- .../bases/source-acceptance-test/CHANGELOG.md | 3 + .../bases/source-acceptance-test/Dockerfile | 2 +- .../source_acceptance_test/tests/test_core.py | 154 +++++++++- .../utils/json_schema_helper.py | 11 + .../unit_tests/test_spec.py | 266 ++++++++++++++---- 5 files changed, 375 insertions(+), 61 deletions(-) diff --git a/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md b/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md index 4660fe1e2186b..edb0f51609b65 100644 --- a/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md +++ b/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.3.0 +Add various stricter checks for specs (see PR for details). [#21451](https://github.com/airbytehq/airbyte/pull/21451) + ## 0.2.26 Check `future_state` only for incremental streams. [#21248](https://github.com/airbytehq/airbyte/pull/21248) diff --git a/airbyte-integrations/bases/source-acceptance-test/Dockerfile b/airbyte-integrations/bases/source-acceptance-test/Dockerfile index af3dcd740a74a..0243f1d9fe8ba 100644 --- a/airbyte-integrations/bases/source-acceptance-test/Dockerfile +++ b/airbyte-integrations/bases/source-acceptance-test/Dockerfile @@ -33,7 +33,7 @@ COPY pytest.ini setup.py ./ COPY source_acceptance_test ./source_acceptance_test RUN pip install . -LABEL io.airbyte.version=0.2.26 +LABEL io.airbyte.version=0.3.0 LABEL io.airbyte.name=airbyte/source-acceptance-test ENTRYPOINT ["python", "-m", "pytest", "-p", "source_acceptance_test.plugin", "-r", "fEsx"] diff --git a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py index 0928b07b3db80..5cd5492c24cd2 100644 --- a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py +++ b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py @@ -76,12 +76,20 @@ def secret_property_names_fixture(): ) +DATE_PATTERN = "^[0-9]{2}-[0-9]{2}-[0-9]{4}$" +DATETIME_PATTERN = "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$" + + @pytest.mark.default_timeout(10) class TestSpec(BaseTest): spec_cache: ConnectorSpecification = None previous_spec_cache: ConnectorSpecification = None + @pytest.fixture(name="connection_specification", scope="class") + def connection_specification_fixture(self, connector_spec_dict: dict) -> dict: + return connector_spec_dict["connectionSpecification"] + @pytest.fixture(name="skip_backward_compatibility_tests") def skip_backward_compatibility_tests_fixture( self, @@ -219,22 +227,15 @@ def _property_can_store_secret(prop: dict) -> bool: Some fields can not hold a secret by design, others can. Null type as well as boolean can not hold a secret value. A string, a number or an integer type can always store secrets. - Objects and arrays can hold a secret in case they are generic, - meaning their inner structure is not described in details with properties/items. + Secret objects and arrays can not be rendered correctly in the UI: A field with a constant value can not hold a secret as well. """ unsecure_types = {"string", "integer", "number"} type_ = prop["type"] - is_property_generic_object = type_ == "object" and not any( - [prop.get("properties", {}), prop.get("anyOf", []), prop.get("oneOf", []), prop.get("allOf", [])] - ) - is_property_generic_array = type_ == "array" and not any([prop.get("items", []), prop.get("prefixItems", [])]) is_property_constant_value = bool(prop.get("const")) can_store_secret = any( [ isinstance(type_, str) and type_ in unsecure_types, - is_property_generic_object, - is_property_generic_array, isinstance(type_, list) and (set(type_) & unsecure_types), ] ) @@ -252,7 +253,7 @@ def test_secret_is_properly_marked(self, connector_spec_dict: dict, detailed_log secrets_exposed = [] non_secrets_hidden = [] spec_properties = connector_spec_dict["connectionSpecification"]["properties"] - for type_path, value in dpath.util.search(spec_properties, "**/type", yielded=True): + for type_path, type_value in dpath.util.search(spec_properties, "**/type", yielded=True): _, is_property_name_secret = self._is_spec_property_name_secret(type_path, secret_property_names) if not is_property_name_secret: continue @@ -268,7 +269,7 @@ def test_secret_is_properly_marked(self, connector_spec_dict: dict, detailed_log if non_secrets_hidden: properties = "\n".join(non_secrets_hidden) - detailed_logger.warning( + pytest.fail( f"""Some properties are marked with `airbyte_secret` although they probably should not be. Please double check them. If they're okay, please fix this test. {properties}""" @@ -280,6 +281,139 @@ def test_secret_is_properly_marked(self, connector_spec_dict: dict, detailed_log {properties}""" ) + def _fail_on_errors(self, errors: List[str]): + if len(errors) > 0: + pytest.fail("\n".join(errors)) + + def test_property_type_is_not_array(self, connector_specification: dict): + """ + Each field has one or multiple types, but the UI only supports a single type and optionally "null" as a second type. + """ + errors = [] + for type_path, type_value in dpath.util.search(connector_specification, "**/properties/*/type", yielded=True): + if isinstance(type_value, List): + number_of_types = len(type_value) + if number_of_types != 2 and number_of_types != 1: + errors.append( + f"{type_path} is not either a simple type or an array of a simple type plus null: {type_value} (for example: type: [string, null])" + ) + if number_of_types == 2 and type_value[1] != "null": + errors.append( + f"Second type of {type_path} is not null: {type_value}. Type can either be a simple type or an array of a simple type plus null (for example: type: [string, null])" + ) + self._fail_on_errors(errors) + + def test_object_not_empty(self, connector_specification: dict): + """ + Each object field needs to have at least one property as the UI won't be able to show them otherwise. + If the whole spec is empty, it's allowed to have a single empty object at the top level + """ + schema_helper = JsonSchemaHelper(connector_specification) + errors = [] + for type_path, type_value in dpath.util.search(connector_specification, "**/type", yielded=True): + if type_path == "type": + # allow empty root object + continue + if type_value == "object": + property = schema_helper.get_parent(type_path) + if "oneOf" not in property and ("properties" not in property or len(property["properties"]) == 0): + errors.append( + f"{type_path} is an empty object which will not be represented correctly in the UI. Either remove or add specific properties" + ) + self._fail_on_errors(errors) + + def test_array_type(self, connector_specification: dict): + """ + Each array has one or multiple types for its items, but the UI only supports a single type which can either be object, string or an enum + """ + schema_helper = JsonSchemaHelper(connector_specification) + errors = [] + for type_path, type_type in dpath.util.search(connector_specification, "**/type", yielded=True): + property_definition = schema_helper.get_parent(type_path) + if type_type != "array": + # unrelated "items", not an array definition + continue + items_value = property_definition.get("items", None) + if items_value is None: + continue + elif isinstance(items_value, List): + errors.append(f"{type_path} is not just a single item type: {items_value}") + elif items_value.get("type") not in ["object", "string", "number", "integer"] and "enum" not in items_value: + errors.append(f"Items of {type_path} has to be either object or string or define an enum") + self._fail_on_errors(errors) + + def test_forbidden_complex_types(self, connector_specification: dict): + """ + not, anyOf, patternProperties, prefixItems, allOf, if, then, else, dependentSchemas and dependentRequired are not allowed + """ + forbidden_keys = [ + "not", + "anyOf", + "patternProperties", + "prefixItems", + "allOf", + "if", + "then", + "else", + "dependentSchemas", + "dependentRequired", + ] + found_keys = set() + for forbidden_key in forbidden_keys: + for path, value in dpath.util.search(connector_specification, f"**/{forbidden_key}", yielded=True): + found_keys.add(path) + + for forbidden_key in forbidden_keys: + # remove forbidden keys if they are used as properties directly + for path, _value in dpath.util.search(connector_specification, f"**/properties/{forbidden_key}", yielded=True): + found_keys.remove(path) + + if len(found_keys) > 0: + key_list = ", ".join(found_keys) + pytest.fail(f"Found the following disallowed JSON schema features: {key_list}") + + def test_date_pattern(self, connector_specification: dict, detailed_logger): + """ + Properties with format date or date-time should always have a pattern defined how the date/date-time should be formatted + that corresponds with the format the datepicker component is creating. + """ + schema_helper = JsonSchemaHelper(connector_specification) + for format_path, format in dpath.util.search(connector_specification, "**/format", yielded=True): + if not isinstance(format, str): + # format is not a format definition here but a property named format + continue + property_definition = schema_helper.get_parent(format_path) + pattern = property_definition.get("pattern") + if format == "date" and not pattern == DATE_PATTERN: + detailed_logger.warning( + f"{format_path} is defining a date format without the corresponding pattern. Consider setting the pattern to {DATE_PATTERN} to make it easier for users to edit this field in the UI." + ) + if format == "date-time" and not pattern == DATETIME_PATTERN: + detailed_logger.warning( + f"{format_path} is defining a date-time format without the corresponding pattern Consider setting the pattern to {DATETIME_PATTERN} to make it easier for users to edit this field in the UI." + ) + + def test_date_format(self, connector_specification: dict, detailed_logger): + """ + Properties with a pattern that looks like a date should have their format set to date or date-time. + """ + schema_helper = JsonSchemaHelper(connector_specification) + for pattern_path, pattern in dpath.util.search(connector_specification, "**/pattern", yielded=True): + if not isinstance(pattern, str): + # pattern is not a pattern definition here but a property named pattern + continue + if pattern == DATE_PATTERN or pattern == DATETIME_PATTERN: + property_definition = schema_helper.get_parent(pattern_path) + format = property_definition.get("format") + if not format == "date" and pattern == DATE_PATTERN: + detailed_logger.warning( + f"{pattern_path} is defining a pattern that looks like a date without setting the format to `date`. Consider specifying the format to make it easier for users to edit this field in the UI." + ) + if not format == "date-time" and pattern == DATETIME_PATTERN: + detailed_logger.warning( + f"{pattern_path} is defining a pattern that looks like a date-time without setting the format to `date-time`. Consider specifying the format to make it easier for users to edit this field in the UI." + ) + def test_defined_refs_exist_in_json_spec_file(self, connector_spec_dict: dict): """Checking for the presence of unresolved `$ref`s values within each json spec file""" check_result = list(find_all_values_for_key_in_schema(connector_spec_dict, "$ref")) diff --git a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/json_schema_helper.py b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/json_schema_helper.py index 7f0c7badb7114..400b5af53b6de 100644 --- a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/json_schema_helper.py +++ b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/json_schema_helper.py @@ -6,6 +6,7 @@ from functools import reduce from typing import Any, Dict, List, Mapping, Optional, Set, Text, Union +import dpath.util import pendulum from jsonref import JsonRef @@ -121,6 +122,16 @@ def get_node(self, path: List[str]) -> Any: node = node[segment] return node + def get_parent(self, path: str) -> Any: + """ + Returns the parent dict of a given path within the `obj` dict + """ + absolute_path = f"/{path}" + parent_path, _ = absolute_path.rsplit(sep="/", maxsplit=1) + if parent_path == "": + return self._schema + return dpath.util.get(self._schema, parent_path) + def find_nodes(self, keys: List[str]) -> List[List[str]]: """Find all paths that lead to nodes with the specified keys. diff --git a/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_spec.py b/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_spec.py index 327876fec4c76..5eb4a6caca797 100644 --- a/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_spec.py +++ b/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_spec.py @@ -652,102 +652,267 @@ def test_additional_properties_is_true(connector_spec, expectation): @pytest.mark.parametrize( - "connector_spec, should_fail, is_warning_logged", + "connector_spec, should_fail", ( ( - { - "connectionSpecification": {"type": "object", "properties": {"api_token": {"type": "string", "airbyte_secret": True}}} - }, + {"type": "object", "properties": {"api_token": {"type": "string", "airbyte_secret": True}}}, False, - False ), + ({"type": "object", "properties": {"api_token": {"type": "null"}}}, False), + ({"type": "object", "properties": {"refresh_token": {"type": "boolean", "airbyte_secret": True}}}, True), + ({"type": "object", "properties": {"refresh_token": {"type": ["null", "string"]}}}, True), + ({"type": "object", "properties": {"credentials": {"type": "array", "items": {"type": "string"}}}}, True), + ({"type": "object", "properties": {"auth": {"oneOf": [{"api_token": {"type": "string"}}]}}}, True), ( { - "connectionSpecification": {"type": "object", "properties": {"api_token": {"type": "null"}}} + "type": "object", + "properties": {"credentials": {"oneOf": [{"type": "object", "properties": {"api_key": {"type": "string"}}}]}}, }, - False, - False + True, ), + ({"type": "object", "properties": {"start_date": {"type": ["null", "string"]}}}, False), + ({"type": "object", "properties": {"credentials": {"oneOf": [{"type": "string", "const": "OAuth2.0"}]}}}, False), + ), +) +def test_airbyte_secret(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + logger = mocker.Mock() + t.test_secret_is_properly_marked( + {"connectionSpecification": connector_spec}, logger, ("api_key", "api_token", "refresh_token", "jwt", "credentials") + ) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, should_fail", + ( + ({"type": "object", "properties": {"refresh_token": {"type": ["boolean", "string"]}}}, True), + ({"type": "object", "properties": {"refresh_token": {"type": []}}}, True), + ({"type": "object", "properties": {"refresh_token": {"type": ["string"]}}}, False), + ({"type": "object", "properties": {"refresh_token": {"type": "string"}}}, False), + ({"type": "object", "properties": {"refresh_token": {"type": ["boolean", "null"]}}}, False), + ), +) +def test_property_type_is_not_array(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + t.test_property_type_is_not_array(connector_spec) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, should_fail", + ( + ({"type": "object", "properties": {"refresh_token": {"type": "boolean", "airbyte_secret": True}}}, False), + ({"type": "object", "properties": {}}, False), + ({"type": "object", "properties": {"jwt": {"type": "object"}}}, True), ( { - "connectionSpecification": {"type": "object", "properties": {"refresh_token": {"type": "boolean", "airbyte_secret": True}}} + "type": "object", + "properties": { + "jwt": { + "type": "object", + "oneOf": [ + {"type": "object", "properties": {"a": {"type": "string"}}}, + {"type": "object", "properties": {"b": {"type": "string"}}}, + ], + } + }, }, False, - True ), ( { - "connectionSpecification": {"type": "object", "properties": {"jwt": {"type": "object"}}} + "type": "object", + "properties": { + "jwt": { + "type": "object", + "oneOf": [ + {"type": "object", "properties": {"a": {"type": "string"}}}, + {"type": "object", "properties": {"b": {"type": "string"}}}, + {"type": "object", "properties": {}}, + ], + } + }, }, True, - False ), + ({"type": "object", "properties": {"jwt": {"type": "object", "properties": {}}}}, True), + ), +) +def test_object_not_empty(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + t.test_object_not_empty(connector_spec) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, should_fail", + ( + ({"type": "object", "properties": {"list": {"type": "array"}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": [{"type": "string"}, {"type": "boolean"}]}}}, True), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "string"}}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "number"}}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "integer"}}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "boolean"}}}}, True), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "number", "enum": [1, 2, 3]}}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"enum": ["a", "b", "c"]}}}}, False), ( { - "connectionSpecification": {"type": "object", "properties": {"refresh_token": {"type": ["null", "string"]}}} + "type": "object", + "properties": {"list": {"type": "array", "items": {"type": "object", "properties": {"a": {"type": "string"}}}}}, }, - True, - False + False, ), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "boolean"}}}}, True), + ), +) +def test_array_type(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + t.test_array_type(connector_spec) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, should_fail", + ( + ({"type": "object", "properties": {"a": {"type": "string"}}}, False), + ({"type": "object", "properties": {"a": {"type": "string", "allOf": [{"type": "string"}, {"maxLength": 5}]}}}, True), + ({"type": "object", "properties": {"allOf": {"type": "string"}}}, False), ( { - "connectionSpecification": {"type": "object", "properties": {"credentials": {"type": "array"}}} + "type": "object", + "properties": {"allOf": {"type": "object", "patternProperties": {"^S_": {"type": "string"}, "^I_": {"type": "integer"}}}}, }, True, - False ), ( { - "connectionSpecification": {"type": "object", "properties": {"credentials": {"type": "array", "items": {"type": "string"}}}} + "type": "object", + "properties": { + "list": { + "type": "array", + "prefixItems": [{"enum": ["Street", "Avenue", "Boulevard"]}, {"enum": ["NW", "NE", "SW", "SE"]}], + } + }, }, True, - False + ), + ), +) +def test_forbidden_complex_types(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + t.test_forbidden_complex_types(connector_spec) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, is_warning_logged", + ( + ({"type": "object", "properties": {"date": {"type": "string"}}}, False), + ({"type": "object", "properties": {"date": {"type": "string", "format": "date"}}}, True), + ({"type": "object", "properties": {"date": {"type": "string", "format": "date-time"}}}, True), + ( + {"type": "object", "properties": {"date": {"type": "string", "format": "date", "pattern": "^[0-9]{2}-[0-9]{2}-[0-9]{4}$"}}}, + False, ), ( { - "connectionSpecification": {"type": "object", "properties": {"auth": {"oneOf": [{"api_token": {"type": "string"}}]}}} + "type": "object", + "properties": { + "date": { + "type": "string", + "format": "date-time", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$", + } + }, }, - True, - False + False, ), + ({"type": "object", "properties": {"date": {"type": "string", "pattern": "^[0-9]{2}-[0-9]{2}-[0-9]{4}$"}}}, False), ( { - "connectionSpecification": {"type": "object", "properties": {"credentials": {"oneOf": [{"type": "object", "properties": {"api_key": {"type": "string"}}}]}}} + "type": "object", + "properties": {"date": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$"}}, }, - True, - False + False, + ), + ), +) +def test_date_pattern(mocker, connector_spec, is_warning_logged): + mocker.patch.object(conftest.pytest, "fail") + logger = mocker.Mock() + t = _TestSpec() + t.test_date_pattern(connector_spec, logger) + conftest.pytest.fail.assert_not_called() + if is_warning_logged: + _, args, _ = logger.warning.mock_calls[0] + msg, *_ = args + assert "Consider setting the pattern" in msg + + +@pytest.mark.parametrize( + "connector_spec, is_warning_logged", + ( + ({"type": "object", "properties": {"date": {"type": "string"}}}, False), + ({"type": "object", "properties": {"format": {"type": "string"}}}, False), + ({"type": "object", "properties": {"date": {"type": "string", "pattern": "[a-z]*"}}}, False), + ( + {"type": "object", "properties": {"date": {"type": "string", "format": "date", "pattern": "^[0-9]{2}-[0-9]{2}-[0-9]{4}$"}}}, + False, ), ( { - "connectionSpecification": {"type": "object", "properties": {"start_date": {"type": ["null", "string"]}}} + "type": "object", + "properties": { + "date": { + "type": "string", + "format": "date-time", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$", + } + }, }, False, - False ), + ({"type": "object", "properties": {"date": {"type": "string", "pattern": "^[0-9]{2}-[0-9]{2}-[0-9]{4}$"}}}, True), ( { - "connectionSpecification": {"type": "object", "properties": {"credentials": {"oneOf": [{"type": "string", "const": "OAuth2.0"}]}}} + "type": "object", + "properties": {"date": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$"}}, }, - False, - False - ) + True, + ), ), ) -def test_airbyte_secret(mocker, connector_spec, should_fail, is_warning_logged): +def test_date_format(mocker, connector_spec, is_warning_logged): mocker.patch.object(conftest.pytest, "fail") - t = _TestSpec() logger = mocker.Mock() - t.test_secret_is_properly_marked(connector_spec, logger, ("api_key", "api_token", "refresh_token", "jwt", "credentials")) - if should_fail: - conftest.pytest.fail.assert_called_once() - else: - conftest.pytest.fail.assert_not_called() + t = _TestSpec() + t.test_date_format(connector_spec, logger) + conftest.pytest.fail.assert_not_called() if is_warning_logged: _, args, _ = logger.warning.mock_calls[0] msg, *_ = args - assert "Some properties are marked with `airbyte_secret` although they probably should not be" in msg - else: - logger.warning.assert_not_called() + assert "Consider specifying the format" in msg @pytest.mark.parametrize( @@ -757,12 +922,15 @@ def test_airbyte_secret(mocker, connector_spec, should_fail, is_warning_logged): ("properties/start_date/type", "start_date", False), ("properties/credentials/oneOf/1/properties/api_token/type", "api_token", True), ("properties/type", None, False), # root element - ("properties/accounts/items/2/properties/jwt/type", "jwt", True) - ) + ("properties/accounts/items/2/properties/jwt/type", "jwt", True), + ), ) def test_is_spec_property_name_secret(path, expected_name, expected_result): t = _TestSpec() - assert t._is_spec_property_name_secret(path, ("api_key", "api_token", "refresh_token", "jwt", "credentials")) == (expected_name, expected_result) + assert t._is_spec_property_name_secret(path, ("api_key", "api_token", "refresh_token", "jwt", "credentials")) == ( + expected_name, + expected_result, + ) @pytest.mark.parametrize( @@ -775,14 +943,12 @@ def test_is_spec_property_name_secret(path, expected_name, expected_result): ({"type": "number"}, True), ({"type": ["null", "string"]}, True), ({"type": ["null", "boolean"]}, False), - ({"type": "object"}, True), - # the object itself cannot hold a secret but the inner items can and will be processed separately + ({"type": "object"}, False), ({"type": "object", "properties": {"api_key": {}}}, False), - ({"type": "array"}, True), - # same as object + ({"type": "array"}, False), ({"type": "array", "items": {"type": "string"}}, False), - ({"type": "string", "const": "OAuth2.0"}, False) - ) + ({"type": "string", "const": "OAuth2.0"}, False), + ), ) def test_property_can_store_secret(property_def, can_store_secret): t = _TestSpec() From 8aa73137bd812e67d98acabf5a95b4a3e9db453b Mon Sep 17 00:00:00 2001 From: "Sherif A. Nada" Date: Wed, 25 Jan 2023 13:08:33 -0800 Subject: [PATCH 095/195] Use generic `manifest.yaml` name for manifest in generated lowcode CDK connectors(#21770) --- .../{{{snakeCase name}}.yaml.hbs => manifest.yaml.hbs} | 0 .../source_{{snakeCase name}}/source.py.hbs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/{{{snakeCase name}}.yaml.hbs => manifest.yaml.hbs} (100%) diff --git a/airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/{{snakeCase name}}.yaml.hbs b/airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/manifest.yaml.hbs similarity index 100% rename from airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/{{snakeCase name}}.yaml.hbs rename to airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/manifest.yaml.hbs diff --git a/airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/source.py.hbs b/airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/source.py.hbs index 8a9888ecbc2e0..6f34471cfd002 100644 --- a/airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/source.py.hbs +++ b/airbyte-integrations/connector-templates/source-configuration-based/source_{{snakeCase name}}/source.py.hbs @@ -15,4 +15,4 @@ WARNING: Do not modify this file. # Declarative Source class Source{{properCase name}}(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "{{snakeCase name}}.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) From 7a403bb8534ea7b6f12bfb9a86435319d0dbdb29 Mon Sep 17 00:00:00 2001 From: "Sherif A. Nada" Date: Wed, 25 Jan 2023 13:15:58 -0800 Subject: [PATCH 096/195] Rename all lowcode connector manifest files to `manifest.yaml` (#21771) --- .../{activecampaign.yaml => manifest.yaml} | 0 .../source-activecampaign/source_activecampaign/source.py | 2 +- .../source-aha/source_aha/{aha.yaml => manifest.yaml} | 0 airbyte-integrations/connectors/source-aha/source_aha/source.py | 2 +- .../source_alpha_vantage/{alpha_vantage.yaml => manifest.yaml} | 0 .../source-alpha-vantage/source_alpha_vantage/source.py | 2 +- .../source-ashby/source_ashby/{ashby.yaml => manifest.yaml} | 0 .../connectors/source-ashby/source_ashby/source.py | 2 +- .../source-braze/source_braze/{braze.yaml => manifest.yaml} | 0 .../connectors/source-braze/source_braze/source.py | 2 +- .../source_breezometer/{breezometer.yaml => manifest.yaml} | 0 .../connectors/source-breezometer/source_breezometer/source.py | 2 +- .../source_callrail/{callrail.yaml => manifest.yaml} | 0 .../connectors/source-callrail/source_callrail/source.py | 2 +- .../source_chartmogul/{chartmogul.yaml => manifest.yaml} | 0 .../connectors/source-chartmogul/source_chartmogul/source.py | 2 +- .../source_clickup_api/{clickup_api.yaml => manifest.yaml} | 0 .../connectors/source-clickup-api/source_clickup_api/source.py | 2 +- .../source_close_com/{close_com.yaml => manifest.yaml} | 0 .../connectors/source-close-com/source_close_com/source_lc.py | 2 +- .../source_coin_api/{coin_api.yaml => manifest.yaml} | 0 .../connectors/source-coin-api/source_coin_api/source.py | 2 +- .../{coingecko_coins.yaml => manifest.yaml} | 0 .../source-coingecko-coins/source_coingecko_coins/source.py | 2 +- .../source_coinmarketcap/{coinmarketcap.yaml => manifest.yaml} | 0 .../source-coinmarketcap/source_coinmarketcap/source.py | 2 +- .../source_configcat/{configcat.yaml => manifest.yaml} | 0 .../connectors/source-configcat/source_configcat/source.py | 2 +- .../source_convertkit/{convertkit.yaml => manifest.yaml} | 0 .../connectors/source-convertkit/source_convertkit/source.py | 2 +- .../source_courier/{courier.yaml => manifest.yaml} | 0 .../connectors/source-courier/source_courier/source.py | 2 +- .../source_datascope/{datascope.yaml => manifest.yaml} | 0 .../connectors/source-datascope/source_datascope/source.py | 2 +- .../source-dremio/source_dremio/{dremio.yaml => manifest.yaml} | 0 .../connectors/source-dremio/source_dremio/source.py | 2 +- .../source_emailoctopus/{emailoctopus.yaml => manifest.yaml} | 0 .../source-emailoctopus/source_emailoctopus/source.py | 2 +- .../{facebook_pages.yaml => manifest.yaml} | 0 .../source-facebook-pages/source_facebook_pages/source.py | 2 +- .../source_getlago/{getlago.yaml => manifest.yaml} | 0 .../connectors/source-getlago/source_getlago/source.py | 2 +- .../source-gnews/source_gnews/{gnews.yaml => manifest.yaml} | 0 .../connectors/source-gnews/source_gnews/source.py | 2 +- .../source_gocardless/{gocardless.yaml => manifest.yaml} | 0 .../connectors/source-gocardless/source_gocardless/source.py | 2 +- .../source-gong/source_gong/{gong.yaml => manifest.yaml} | 0 .../connectors/source-gong/source_gong/source.py | 2 +- .../{google_pagespeed_insights.yaml => manifest.yaml} | 0 .../source_google_pagespeed_insights/source.py | 2 +- .../{google_webfonts.yaml => manifest.yaml} | 0 .../source-google-webfonts/source_google_webfonts/source.py | 2 +- .../source_greenhouse/{greenhouse.yaml => manifest.yaml} | 0 .../connectors/source-greenhouse/source_greenhouse/source.py | 2 +- .../source_gutendex/{gutendex.yaml => manifest.yaml} | 0 .../connectors/source-gutendex/source_gutendex/source.py | 2 +- .../source_instatus/{instatus.yaml => manifest.yaml} | 0 .../connectors/source-instatus/source_instatus/source.py | 2 +- .../source_intruder/{intruder.yaml => manifest.yaml} | 0 .../connectors/source-intruder/source_intruder/source.py | 2 +- .../source_ip2whois/{ip2whois.yaml => manifest.yaml} | 0 .../connectors/source-ip2whois/source_ip2whois/source.py | 2 +- .../source_k6_cloud/{k6_cloud.yaml => manifest.yaml} | 0 .../connectors/source-k6-cloud/source_k6_cloud/source.py | 2 +- .../source_launchdarkly/{launchdarkly.yaml => manifest.yaml} | 0 .../source-launchdarkly/source_launchdarkly/source.py | 2 +- .../source_lokalise/{lokalise.yaml => manifest.yaml} | 0 .../connectors/source-lokalise/source_lokalise/source.py | 2 +- .../source_mailerlite/{mailerlite.yaml => manifest.yaml} | 0 .../connectors/source-mailerlite/source_mailerlite/source.py | 2 +- .../source_mailersend/{mailersend.yaml => manifest.yaml} | 0 .../connectors/source-mailersend/source_mailersend/source.py | 2 +- .../source_mailjet_mail/{mailjet_mail.yaml => manifest.yaml} | 0 .../source-mailjet-mail/source_mailjet_mail/source.py | 2 +- .../source_mailjet_sms/{mailjet_sms.yaml => manifest.yaml} | 0 .../connectors/source-mailjet-sms/source_mailjet_sms/source.py | 2 +- .../source_metabase/{metabase.yaml => manifest.yaml} | 0 .../connectors/source-metabase/source_metabase/source.py | 2 +- .../source-monday/source_monday/{monday.yaml => manifest.yaml} | 0 .../connectors/source-monday/source_monday/source.py | 2 +- .../source-n8n/source_n8n/{n8n.yaml => manifest.yaml} | 0 airbyte-integrations/connectors/source-n8n/source_n8n/source.py | 2 +- .../source_news_api/{news_api.yaml => manifest.yaml} | 0 .../connectors/source-news-api/source_news_api/source.py | 2 +- .../source_newsdata/{newsdata.yaml => manifest.yaml} | 0 .../connectors/source-newsdata/source_newsdata/source.py | 2 +- .../source_nytimes/{nytimes.yaml => manifest.yaml} | 0 .../connectors/source-nytimes/source_nytimes/source.py | 2 +- .../source_omnisend/{omnisend.yaml => manifest.yaml} | 0 .../connectors/source-omnisend/source_omnisend/source.py | 2 +- .../source-oura/source_oura/{oura.yaml => manifest.yaml} | 0 .../connectors/source-oura/source_oura/source.py | 2 +- .../source_partnerstack/{partnerstack.yaml => manifest.yaml} | 0 .../source-partnerstack/source_partnerstack/source.py | 2 +- .../source_pexels_api/{pexels_api.yaml => manifest.yaml} | 0 .../connectors/source-pexels-api/source_pexels_api/source.py | 2 +- .../source_plausible/{plausible.yaml => manifest.yaml} | 0 .../connectors/source-plausible/source_plausible/source.py | 2 +- .../source-pocket/source_pocket/{pocket.yaml => manifest.yaml} | 0 .../connectors/source-pocket/source_pocket/source.py | 2 +- .../{polygon_stock_api.yaml => manifest.yaml} | 0 .../source-polygon-stock-api/source_polygon_stock_api/source.py | 2 +- .../source_posthog/{posthog.yaml => manifest.yaml} | 0 .../connectors/source-posthog/source_posthog/source.py | 2 +- .../source_postmarkapp/{postmarkapp.yaml => manifest.yaml} | 0 .../connectors/source-postmarkapp/source_postmarkapp/source.py | 2 +- .../source_prestashop/{prestashop.yaml => manifest.yaml} | 0 .../connectors/source-prestashop/source_prestashop/source.py | 2 +- .../source_punk_api/{punk_api.yaml => manifest.yaml} | 0 .../connectors/source-punk-api/source_punk_api/source.py | 2 +- .../source-pypi/source_pypi/{pypi.yaml => manifest.yaml} | 0 .../connectors/source-pypi/source_pypi/source.py | 2 +- .../source_recreation/{recreation.yaml => manifest.yaml} | 0 .../connectors/source-recreation/source_recreation/source.py | 2 +- .../source_recruitee/{recruitee.yaml => manifest.yaml} | 0 .../connectors/source-recruitee/source_recruitee/source.py | 2 +- .../source_reply_io/{reply_io.yaml => manifest.yaml} | 0 .../connectors/source-reply-io/source_reply_io/source.py | 2 +- .../source_rocket_chat/{rocket_chat.yaml => manifest.yaml} | 0 .../connectors/source-rocket-chat/source_rocket_chat/source.py | 2 +- .../{sap_fieldglass.yaml => manifest.yaml} | 0 .../source-sap-fieldglass/source_sap_fieldglass/source.py | 2 +- .../source-secoda/source_secoda/{secoda.yaml => manifest.yaml} | 0 .../connectors/source-secoda/source_secoda/source.py | 2 +- .../source_sendinblue/{sendinblue.yaml => manifest.yaml} | 0 .../connectors/source-sendinblue/source_sendinblue/source.py | 2 +- .../source_senseforce/{senseforce.yaml => manifest.yaml} | 0 .../connectors/source-senseforce/source_senseforce/source.py | 2 +- .../source-smaily/source_smaily/{smaily.yaml => manifest.yaml} | 0 .../connectors/source-smaily/source_smaily/source.py | 2 +- .../source_smartengage/{smartengage.yaml => manifest.yaml} | 0 .../connectors/source-smartengage/source_smartengage/source.py | 2 +- .../source_sonar_cloud/{sonar_cloud.yaml => manifest.yaml} | 0 .../connectors/source-sonar-cloud/source_sonar_cloud/source.py | 2 +- .../source_spacex_api/{spacex_api.yaml => manifest.yaml} | 0 .../connectors/source-spacex-api/source_spacex_api/source.py | 2 +- .../source-square/source_square/{square.yaml => manifest.yaml} | 0 .../connectors/source-square/source_square/source.py | 2 +- .../source_statuspage/{statuspage.yaml => manifest.yaml} | 0 .../connectors/source-statuspage/source_statuspage/source.py | 2 +- .../{survey_sparrow.yaml => manifest.yaml} | 0 .../source-survey-sparrow/source_survey_sparrow/source.py | 2 +- .../{the_guardian_api.yaml => manifest.yaml} | 0 .../source-the-guardian-api/source_the_guardian_api/source.py | 2 +- .../source-tmdb/source_tmdb/{tmdb.yaml => manifest.yaml} | 0 .../connectors/source-tmdb/source_tmdb/source.py | 2 +- .../source-toggl/source_toggl/{toggl.yaml => manifest.yaml} | 0 .../connectors/source-toggl/source_toggl/source.py | 2 +- .../{tvmaze_schedule.yaml => manifest.yaml} | 0 .../source-tvmaze-schedule/source_tvmaze_schedule/source.py | 2 +- .../{twilio_taskrouter.yaml => manifest.yaml} | 0 .../source-twilio-taskrouter/source_twilio_taskrouter/source.py | 2 +- .../source_twitter/{twitter.yaml => manifest.yaml} | 0 .../connectors/source-twitter/source_twitter/source.py | 2 +- .../source_tyntec_sms/{tyntec_sms.yaml => manifest.yaml} | 0 .../connectors/source-tyntec-sms/source_tyntec_sms/source.py | 2 +- .../source_vantage/{vantage.yaml => manifest.yaml} | 0 .../connectors/source-vantage/source_vantage/source.py | 2 +- .../source_vitally/{vitally.yaml => manifest.yaml} | 0 .../connectors/source-vitally/source_vitally/source.py | 2 +- .../source_waiteraid/{waiteraid.yaml => manifest.yaml} | 0 .../connectors/source-waiteraid/source_waiteraid/source.py | 2 +- .../source_whisky_hunter/{whisky_hunter.yaml => manifest.yaml} | 0 .../source-whisky-hunter/source_whisky_hunter/source.py | 2 +- .../{wikipedia_pageviews.yaml => manifest.yaml} | 0 .../source_wikipedia_pageviews/source.py | 2 +- .../source_woocommerce/{woocommerce.yaml => manifest.yaml} | 0 .../connectors/source-woocommerce/source_woocommerce/source.py | 2 +- .../source_workable/{workable.yaml => manifest.yaml} | 0 .../connectors/source-workable/source_workable/source.py | 2 +- .../source_workramp/{workramp.yaml => manifest.yaml} | 0 .../connectors/source-workramp/source_workramp/source.py | 2 +- .../{zapier_supported_storage.yaml => manifest.yaml} | 0 .../source_zapier_supported_storage/source.py | 2 +- .../source-zoom/source_zoom/{zoom.yaml => manifest.yaml} | 0 .../connectors/source-zoom/source_zoom/source.py | 2 +- 176 files changed, 88 insertions(+), 88 deletions(-) rename airbyte-integrations/connectors/source-activecampaign/source_activecampaign/{activecampaign.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-aha/source_aha/{aha.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/{alpha_vantage.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-ashby/source_ashby/{ashby.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-braze/source_braze/{braze.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-breezometer/source_breezometer/{breezometer.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-callrail/source_callrail/{callrail.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-chartmogul/source_chartmogul/{chartmogul.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-clickup-api/source_clickup_api/{clickup_api.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-close-com/source_close_com/{close_com.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-coin-api/source_coin_api/{coin_api.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/{coingecko_coins.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/{coinmarketcap.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-configcat/source_configcat/{configcat.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-convertkit/source_convertkit/{convertkit.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-courier/source_courier/{courier.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-datascope/source_datascope/{datascope.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-dremio/source_dremio/{dremio.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/{emailoctopus.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/{facebook_pages.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-getlago/source_getlago/{getlago.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-gnews/source_gnews/{gnews.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-gocardless/source_gocardless/{gocardless.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-gong/source_gong/{gong.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/{google_pagespeed_insights.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/{google_webfonts.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-greenhouse/source_greenhouse/{greenhouse.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-gutendex/source_gutendex/{gutendex.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-instatus/source_instatus/{instatus.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-intruder/source_intruder/{intruder.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-ip2whois/source_ip2whois/{ip2whois.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/{k6_cloud.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/{launchdarkly.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-lokalise/source_lokalise/{lokalise.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-mailerlite/source_mailerlite/{mailerlite.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-mailersend/source_mailersend/{mailersend.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/{mailjet_mail.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/{mailjet_sms.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-metabase/source_metabase/{metabase.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-monday/source_monday/{monday.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-n8n/source_n8n/{n8n.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-news-api/source_news_api/{news_api.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-newsdata/source_newsdata/{newsdata.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-nytimes/source_nytimes/{nytimes.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-omnisend/source_omnisend/{omnisend.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-oura/source_oura/{oura.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-partnerstack/source_partnerstack/{partnerstack.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-pexels-api/source_pexels_api/{pexels_api.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-plausible/source_plausible/{plausible.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-pocket/source_pocket/{pocket.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/{polygon_stock_api.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-posthog/source_posthog/{posthog.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/{postmarkapp.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-prestashop/source_prestashop/{prestashop.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-punk-api/source_punk_api/{punk_api.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-pypi/source_pypi/{pypi.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-recreation/source_recreation/{recreation.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-recruitee/source_recruitee/{recruitee.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-reply-io/source_reply_io/{reply_io.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/{rocket_chat.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/{sap_fieldglass.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-secoda/source_secoda/{secoda.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-sendinblue/source_sendinblue/{sendinblue.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-senseforce/source_senseforce/{senseforce.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-smaily/source_smaily/{smaily.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-smartengage/source_smartengage/{smartengage.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/{sonar_cloud.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-spacex-api/source_spacex_api/{spacex_api.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-square/source_square/{square.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-statuspage/source_statuspage/{statuspage.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/{survey_sparrow.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/{the_guardian_api.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-tmdb/source_tmdb/{tmdb.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-toggl/source_toggl/{toggl.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/{tvmaze_schedule.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/{twilio_taskrouter.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-twitter/source_twitter/{twitter.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/{tyntec_sms.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-vantage/source_vantage/{vantage.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-vitally/source_vitally/{vitally.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-waiteraid/source_waiteraid/{waiteraid.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/{whisky_hunter.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/{wikipedia_pageviews.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-woocommerce/source_woocommerce/{woocommerce.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-workable/source_workable/{workable.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-workramp/source_workramp/{workramp.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/{zapier_supported_storage.yaml => manifest.yaml} (100%) rename airbyte-integrations/connectors/source-zoom/source_zoom/{zoom.yaml => manifest.yaml} (100%) diff --git a/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/activecampaign.yaml b/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-activecampaign/source_activecampaign/activecampaign.yaml rename to airbyte-integrations/connectors/source-activecampaign/source_activecampaign/manifest.yaml diff --git a/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/source.py b/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/source.py index 5ef118e941758..5d5d94ae7f837 100644 --- a/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/source.py +++ b/airbyte-integrations/connectors/source-activecampaign/source_activecampaign/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceActivecampaign(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "activecampaign.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-aha/source_aha/aha.yaml b/airbyte-integrations/connectors/source-aha/source_aha/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-aha/source_aha/aha.yaml rename to airbyte-integrations/connectors/source-aha/source_aha/manifest.yaml diff --git a/airbyte-integrations/connectors/source-aha/source_aha/source.py b/airbyte-integrations/connectors/source-aha/source_aha/source.py index e91575fa8cd90..427dbc05d4ab2 100644 --- a/airbyte-integrations/connectors/source-aha/source_aha/source.py +++ b/airbyte-integrations/connectors/source-aha/source_aha/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceAha(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "aha.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/alpha_vantage.yaml b/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/alpha_vantage.yaml rename to airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/manifest.yaml diff --git a/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/source.py b/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/source.py index b8e22cf0db5d2..11a6cf720195d 100644 --- a/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/source.py +++ b/airbyte-integrations/connectors/source-alpha-vantage/source_alpha_vantage/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceAlphaVantage(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "alpha_vantage.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-ashby/source_ashby/ashby.yaml b/airbyte-integrations/connectors/source-ashby/source_ashby/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-ashby/source_ashby/ashby.yaml rename to airbyte-integrations/connectors/source-ashby/source_ashby/manifest.yaml diff --git a/airbyte-integrations/connectors/source-ashby/source_ashby/source.py b/airbyte-integrations/connectors/source-ashby/source_ashby/source.py index 80b47fd139eab..b90cb178f060b 100644 --- a/airbyte-integrations/connectors/source-ashby/source_ashby/source.py +++ b/airbyte-integrations/connectors/source-ashby/source_ashby/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceAshby(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "ashby.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-braze/source_braze/braze.yaml b/airbyte-integrations/connectors/source-braze/source_braze/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-braze/source_braze/braze.yaml rename to airbyte-integrations/connectors/source-braze/source_braze/manifest.yaml diff --git a/airbyte-integrations/connectors/source-braze/source_braze/source.py b/airbyte-integrations/connectors/source-braze/source_braze/source.py index 98996555af39a..7c19af1a6a3b9 100644 --- a/airbyte-integrations/connectors/source-braze/source_braze/source.py +++ b/airbyte-integrations/connectors/source-braze/source_braze/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceBraze(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "braze.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-breezometer/source_breezometer/breezometer.yaml b/airbyte-integrations/connectors/source-breezometer/source_breezometer/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-breezometer/source_breezometer/breezometer.yaml rename to airbyte-integrations/connectors/source-breezometer/source_breezometer/manifest.yaml diff --git a/airbyte-integrations/connectors/source-breezometer/source_breezometer/source.py b/airbyte-integrations/connectors/source-breezometer/source_breezometer/source.py index 1ed8d1f8927d0..67b0e830e1bac 100644 --- a/airbyte-integrations/connectors/source-breezometer/source_breezometer/source.py +++ b/airbyte-integrations/connectors/source-breezometer/source_breezometer/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceBreezometer(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "breezometer.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-callrail/source_callrail/callrail.yaml b/airbyte-integrations/connectors/source-callrail/source_callrail/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-callrail/source_callrail/callrail.yaml rename to airbyte-integrations/connectors/source-callrail/source_callrail/manifest.yaml diff --git a/airbyte-integrations/connectors/source-callrail/source_callrail/source.py b/airbyte-integrations/connectors/source-callrail/source_callrail/source.py index 63b2db66475c7..ac2a1118166fe 100644 --- a/airbyte-integrations/connectors/source-callrail/source_callrail/source.py +++ b/airbyte-integrations/connectors/source-callrail/source_callrail/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceCallrail(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "callrail.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/chartmogul.yaml b/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-chartmogul/source_chartmogul/chartmogul.yaml rename to airbyte-integrations/connectors/source-chartmogul/source_chartmogul/manifest.yaml diff --git a/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/source.py b/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/source.py index b60e85a3a90a4..7cdeacb6f0a56 100644 --- a/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/source.py +++ b/airbyte-integrations/connectors/source-chartmogul/source_chartmogul/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceChartmogul(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "chartmogul.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/clickup_api.yaml b/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-clickup-api/source_clickup_api/clickup_api.yaml rename to airbyte-integrations/connectors/source-clickup-api/source_clickup_api/manifest.yaml diff --git a/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/source.py b/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/source.py index 43d94a1e2a852..258fc1bc85d99 100644 --- a/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/source.py +++ b/airbyte-integrations/connectors/source-clickup-api/source_clickup_api/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceClickupApi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "clickup_api.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/close_com.yaml b/airbyte-integrations/connectors/source-close-com/source_close_com/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-close-com/source_close_com/close_com.yaml rename to airbyte-integrations/connectors/source-close-com/source_close_com/manifest.yaml diff --git a/airbyte-integrations/connectors/source-close-com/source_close_com/source_lc.py b/airbyte-integrations/connectors/source-close-com/source_close_com/source_lc.py index e35e47263acb8..0ee117f81e6b8 100644 --- a/airbyte-integrations/connectors/source-close-com/source_close_com/source_lc.py +++ b/airbyte-integrations/connectors/source-close-com/source_close_com/source_lc.py @@ -15,4 +15,4 @@ # Declarative Source class SourceCloseCom(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "close_com.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-coin-api/source_coin_api/coin_api.yaml b/airbyte-integrations/connectors/source-coin-api/source_coin_api/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-coin-api/source_coin_api/coin_api.yaml rename to airbyte-integrations/connectors/source-coin-api/source_coin_api/manifest.yaml diff --git a/airbyte-integrations/connectors/source-coin-api/source_coin_api/source.py b/airbyte-integrations/connectors/source-coin-api/source_coin_api/source.py index 43fc49e48bc4c..88f81b83c09aa 100644 --- a/airbyte-integrations/connectors/source-coin-api/source_coin_api/source.py +++ b/airbyte-integrations/connectors/source-coin-api/source_coin_api/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceCoinApi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "coin_api.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/coingecko_coins.yaml b/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/coingecko_coins.yaml rename to airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/manifest.yaml diff --git a/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/source.py b/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/source.py index 9ed8e8ca9909b..1eb6aeceeca3f 100644 --- a/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/source.py +++ b/airbyte-integrations/connectors/source-coingecko-coins/source_coingecko_coins/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceCoingeckoCoins(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "coingecko_coins.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/coinmarketcap.yaml b/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/coinmarketcap.yaml rename to airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/manifest.yaml diff --git a/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/source.py b/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/source.py index a9cc2eae44dc4..a7480df3f8cc7 100644 --- a/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/source.py +++ b/airbyte-integrations/connectors/source-coinmarketcap/source_coinmarketcap/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceCoinmarketcap(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "coinmarketcap.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-configcat/source_configcat/configcat.yaml b/airbyte-integrations/connectors/source-configcat/source_configcat/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-configcat/source_configcat/configcat.yaml rename to airbyte-integrations/connectors/source-configcat/source_configcat/manifest.yaml diff --git a/airbyte-integrations/connectors/source-configcat/source_configcat/source.py b/airbyte-integrations/connectors/source-configcat/source_configcat/source.py index 840d14c60b316..c32f7f39fdb2f 100644 --- a/airbyte-integrations/connectors/source-configcat/source_configcat/source.py +++ b/airbyte-integrations/connectors/source-configcat/source_configcat/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceConfigcat(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "configcat.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-convertkit/source_convertkit/convertkit.yaml b/airbyte-integrations/connectors/source-convertkit/source_convertkit/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-convertkit/source_convertkit/convertkit.yaml rename to airbyte-integrations/connectors/source-convertkit/source_convertkit/manifest.yaml diff --git a/airbyte-integrations/connectors/source-convertkit/source_convertkit/source.py b/airbyte-integrations/connectors/source-convertkit/source_convertkit/source.py index 6fd59d24c59fb..a57d7d0a9fcab 100644 --- a/airbyte-integrations/connectors/source-convertkit/source_convertkit/source.py +++ b/airbyte-integrations/connectors/source-convertkit/source_convertkit/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceConvertkit(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "convertkit.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-courier/source_courier/courier.yaml b/airbyte-integrations/connectors/source-courier/source_courier/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-courier/source_courier/courier.yaml rename to airbyte-integrations/connectors/source-courier/source_courier/manifest.yaml diff --git a/airbyte-integrations/connectors/source-courier/source_courier/source.py b/airbyte-integrations/connectors/source-courier/source_courier/source.py index e0559ab14b7e9..26f20c0358cd7 100644 --- a/airbyte-integrations/connectors/source-courier/source_courier/source.py +++ b/airbyte-integrations/connectors/source-courier/source_courier/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceCourier(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "courier.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-datascope/source_datascope/datascope.yaml b/airbyte-integrations/connectors/source-datascope/source_datascope/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-datascope/source_datascope/datascope.yaml rename to airbyte-integrations/connectors/source-datascope/source_datascope/manifest.yaml diff --git a/airbyte-integrations/connectors/source-datascope/source_datascope/source.py b/airbyte-integrations/connectors/source-datascope/source_datascope/source.py index 44a433d095533..b5d7775e60243 100644 --- a/airbyte-integrations/connectors/source-datascope/source_datascope/source.py +++ b/airbyte-integrations/connectors/source-datascope/source_datascope/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceDatascope(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "datascope.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-dremio/source_dremio/dremio.yaml b/airbyte-integrations/connectors/source-dremio/source_dremio/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-dremio/source_dremio/dremio.yaml rename to airbyte-integrations/connectors/source-dremio/source_dremio/manifest.yaml diff --git a/airbyte-integrations/connectors/source-dremio/source_dremio/source.py b/airbyte-integrations/connectors/source-dremio/source_dremio/source.py index c8d6b38f4862b..c3dfa0dc3e13f 100644 --- a/airbyte-integrations/connectors/source-dremio/source_dremio/source.py +++ b/airbyte-integrations/connectors/source-dremio/source_dremio/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceDremio(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "dremio.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/emailoctopus.yaml b/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/emailoctopus.yaml rename to airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/manifest.yaml diff --git a/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/source.py b/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/source.py index 738ef2970b88b..9019d615ac595 100644 --- a/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/source.py +++ b/airbyte-integrations/connectors/source-emailoctopus/source_emailoctopus/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceEmailoctopus(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "emailoctopus.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/facebook_pages.yaml b/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/facebook_pages.yaml rename to airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/manifest.yaml diff --git a/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/source.py b/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/source.py index 1bfc7795a350f..7a7f03edb8218 100644 --- a/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/source.py +++ b/airbyte-integrations/connectors/source-facebook-pages/source_facebook_pages/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceFacebookPages(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "facebook_pages.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-getlago/source_getlago/getlago.yaml b/airbyte-integrations/connectors/source-getlago/source_getlago/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-getlago/source_getlago/getlago.yaml rename to airbyte-integrations/connectors/source-getlago/source_getlago/manifest.yaml diff --git a/airbyte-integrations/connectors/source-getlago/source_getlago/source.py b/airbyte-integrations/connectors/source-getlago/source_getlago/source.py index 88153da5e8331..41faac0a0dcda 100644 --- a/airbyte-integrations/connectors/source-getlago/source_getlago/source.py +++ b/airbyte-integrations/connectors/source-getlago/source_getlago/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceGetlago(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "getlago.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-gnews/source_gnews/gnews.yaml b/airbyte-integrations/connectors/source-gnews/source_gnews/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-gnews/source_gnews/gnews.yaml rename to airbyte-integrations/connectors/source-gnews/source_gnews/manifest.yaml diff --git a/airbyte-integrations/connectors/source-gnews/source_gnews/source.py b/airbyte-integrations/connectors/source-gnews/source_gnews/source.py index d22e3fb82d023..ae18cb459d37d 100644 --- a/airbyte-integrations/connectors/source-gnews/source_gnews/source.py +++ b/airbyte-integrations/connectors/source-gnews/source_gnews/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceGnews(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "gnews.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-gocardless/source_gocardless/gocardless.yaml b/airbyte-integrations/connectors/source-gocardless/source_gocardless/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-gocardless/source_gocardless/gocardless.yaml rename to airbyte-integrations/connectors/source-gocardless/source_gocardless/manifest.yaml diff --git a/airbyte-integrations/connectors/source-gocardless/source_gocardless/source.py b/airbyte-integrations/connectors/source-gocardless/source_gocardless/source.py index 01118b2bbe3e0..34e1876ac96c5 100644 --- a/airbyte-integrations/connectors/source-gocardless/source_gocardless/source.py +++ b/airbyte-integrations/connectors/source-gocardless/source_gocardless/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceGocardless(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "gocardless.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-gong/source_gong/gong.yaml b/airbyte-integrations/connectors/source-gong/source_gong/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-gong/source_gong/gong.yaml rename to airbyte-integrations/connectors/source-gong/source_gong/manifest.yaml diff --git a/airbyte-integrations/connectors/source-gong/source_gong/source.py b/airbyte-integrations/connectors/source-gong/source_gong/source.py index 7755222887f02..405524446d187 100644 --- a/airbyte-integrations/connectors/source-gong/source_gong/source.py +++ b/airbyte-integrations/connectors/source-gong/source_gong/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceGong(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "gong.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/google_pagespeed_insights.yaml b/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/google_pagespeed_insights.yaml rename to airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/manifest.yaml diff --git a/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/source.py b/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/source.py index 8c5a930baf448..e513f52462e18 100644 --- a/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/source.py +++ b/airbyte-integrations/connectors/source-google-pagespeed-insights/source_google_pagespeed_insights/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceGooglePagespeedInsights(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "google_pagespeed_insights.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/google_webfonts.yaml b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/google_webfonts.yaml rename to airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/manifest.yaml diff --git a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/source.py b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/source.py index 353c6e585164a..53d5a84310c9b 100644 --- a/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/source.py +++ b/airbyte-integrations/connectors/source-google-webfonts/source_google_webfonts/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceGoogleWebfonts(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "google_webfonts.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/greenhouse.yaml b/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-greenhouse/source_greenhouse/greenhouse.yaml rename to airbyte-integrations/connectors/source-greenhouse/source_greenhouse/manifest.yaml diff --git a/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/source.py b/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/source.py index 8bd812d2d172c..78b5f90ed1148 100644 --- a/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/source.py +++ b/airbyte-integrations/connectors/source-greenhouse/source_greenhouse/source.py @@ -14,4 +14,4 @@ # Declarative Source class SourceGreenhouse(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "greenhouse.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-gutendex/source_gutendex/gutendex.yaml b/airbyte-integrations/connectors/source-gutendex/source_gutendex/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-gutendex/source_gutendex/gutendex.yaml rename to airbyte-integrations/connectors/source-gutendex/source_gutendex/manifest.yaml diff --git a/airbyte-integrations/connectors/source-gutendex/source_gutendex/source.py b/airbyte-integrations/connectors/source-gutendex/source_gutendex/source.py index f7a5c4092cff0..6eb65751340e8 100644 --- a/airbyte-integrations/connectors/source-gutendex/source_gutendex/source.py +++ b/airbyte-integrations/connectors/source-gutendex/source_gutendex/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceGutendex(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "gutendex.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-instatus/source_instatus/instatus.yaml b/airbyte-integrations/connectors/source-instatus/source_instatus/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-instatus/source_instatus/instatus.yaml rename to airbyte-integrations/connectors/source-instatus/source_instatus/manifest.yaml diff --git a/airbyte-integrations/connectors/source-instatus/source_instatus/source.py b/airbyte-integrations/connectors/source-instatus/source_instatus/source.py index 820ccc63adaa3..94ece1ef6f738 100644 --- a/airbyte-integrations/connectors/source-instatus/source_instatus/source.py +++ b/airbyte-integrations/connectors/source-instatus/source_instatus/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceInstatus(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "instatus.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-intruder/source_intruder/intruder.yaml b/airbyte-integrations/connectors/source-intruder/source_intruder/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-intruder/source_intruder/intruder.yaml rename to airbyte-integrations/connectors/source-intruder/source_intruder/manifest.yaml diff --git a/airbyte-integrations/connectors/source-intruder/source_intruder/source.py b/airbyte-integrations/connectors/source-intruder/source_intruder/source.py index f39be55b586d8..bc32ab8329633 100644 --- a/airbyte-integrations/connectors/source-intruder/source_intruder/source.py +++ b/airbyte-integrations/connectors/source-intruder/source_intruder/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceIntruder(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "intruder.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/ip2whois.yaml b/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-ip2whois/source_ip2whois/ip2whois.yaml rename to airbyte-integrations/connectors/source-ip2whois/source_ip2whois/manifest.yaml diff --git a/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/source.py b/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/source.py index 5602b74e4df99..dda46d421aa63 100644 --- a/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/source.py +++ b/airbyte-integrations/connectors/source-ip2whois/source_ip2whois/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceIp2whois(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "ip2whois.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/k6_cloud.yaml b/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/k6_cloud.yaml rename to airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/manifest.yaml diff --git a/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/source.py b/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/source.py index cac9732cd675f..89ff99fce1a1e 100644 --- a/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/source.py +++ b/airbyte-integrations/connectors/source-k6-cloud/source_k6_cloud/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceK6Cloud(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "k6_cloud.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/launchdarkly.yaml b/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/launchdarkly.yaml rename to airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/manifest.yaml diff --git a/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/source.py b/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/source.py index 55b7ceef44f5e..89a6949b12266 100644 --- a/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/source.py +++ b/airbyte-integrations/connectors/source-launchdarkly/source_launchdarkly/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceLaunchdarkly(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "launchdarkly.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-lokalise/source_lokalise/lokalise.yaml b/airbyte-integrations/connectors/source-lokalise/source_lokalise/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-lokalise/source_lokalise/lokalise.yaml rename to airbyte-integrations/connectors/source-lokalise/source_lokalise/manifest.yaml diff --git a/airbyte-integrations/connectors/source-lokalise/source_lokalise/source.py b/airbyte-integrations/connectors/source-lokalise/source_lokalise/source.py index 704d63423d9ef..78e8221740fc9 100644 --- a/airbyte-integrations/connectors/source-lokalise/source_lokalise/source.py +++ b/airbyte-integrations/connectors/source-lokalise/source_lokalise/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceLokalise(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "lokalise.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/mailerlite.yaml b/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-mailerlite/source_mailerlite/mailerlite.yaml rename to airbyte-integrations/connectors/source-mailerlite/source_mailerlite/manifest.yaml diff --git a/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/source.py b/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/source.py index fc42b3678c9bf..304c5e64fda73 100644 --- a/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/source.py +++ b/airbyte-integrations/connectors/source-mailerlite/source_mailerlite/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceMailerlite(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "mailerlite.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-mailersend/source_mailersend/mailersend.yaml b/airbyte-integrations/connectors/source-mailersend/source_mailersend/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-mailersend/source_mailersend/mailersend.yaml rename to airbyte-integrations/connectors/source-mailersend/source_mailersend/manifest.yaml diff --git a/airbyte-integrations/connectors/source-mailersend/source_mailersend/source.py b/airbyte-integrations/connectors/source-mailersend/source_mailersend/source.py index b0b111a3883cb..f7c3d630d5f53 100644 --- a/airbyte-integrations/connectors/source-mailersend/source_mailersend/source.py +++ b/airbyte-integrations/connectors/source-mailersend/source_mailersend/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceMailersend(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "mailersend.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/mailjet_mail.yaml b/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/mailjet_mail.yaml rename to airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/manifest.yaml diff --git a/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/source.py b/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/source.py index 2f3fa93c6441e..557f59cd6ffb8 100644 --- a/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/source.py +++ b/airbyte-integrations/connectors/source-mailjet-mail/source_mailjet_mail/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceMailjetMail(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "mailjet_mail.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/mailjet_sms.yaml b/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/mailjet_sms.yaml rename to airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/manifest.yaml diff --git a/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/source.py b/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/source.py index c34b4bc06ba30..f53523b370bf1 100644 --- a/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/source.py +++ b/airbyte-integrations/connectors/source-mailjet-sms/source_mailjet_sms/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceMailjetSms(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "mailjet_sms.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-metabase/source_metabase/metabase.yaml b/airbyte-integrations/connectors/source-metabase/source_metabase/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-metabase/source_metabase/metabase.yaml rename to airbyte-integrations/connectors/source-metabase/source_metabase/manifest.yaml diff --git a/airbyte-integrations/connectors/source-metabase/source_metabase/source.py b/airbyte-integrations/connectors/source-metabase/source_metabase/source.py index 45ec25fbc0e34..b72fdfcd888e1 100644 --- a/airbyte-integrations/connectors/source-metabase/source_metabase/source.py +++ b/airbyte-integrations/connectors/source-metabase/source_metabase/source.py @@ -8,4 +8,4 @@ class SourceMetabase(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "metabase.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-monday/source_monday/monday.yaml b/airbyte-integrations/connectors/source-monday/source_monday/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-monday/source_monday/monday.yaml rename to airbyte-integrations/connectors/source-monday/source_monday/manifest.yaml diff --git a/airbyte-integrations/connectors/source-monday/source_monday/source.py b/airbyte-integrations/connectors/source-monday/source_monday/source.py index 932f5206a4b6e..0139bc49a5f21 100644 --- a/airbyte-integrations/connectors/source-monday/source_monday/source.py +++ b/airbyte-integrations/connectors/source-monday/source_monday/source.py @@ -14,4 +14,4 @@ # Declarative Source class SourceMonday(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "monday.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-n8n/source_n8n/n8n.yaml b/airbyte-integrations/connectors/source-n8n/source_n8n/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-n8n/source_n8n/n8n.yaml rename to airbyte-integrations/connectors/source-n8n/source_n8n/manifest.yaml diff --git a/airbyte-integrations/connectors/source-n8n/source_n8n/source.py b/airbyte-integrations/connectors/source-n8n/source_n8n/source.py index b4e3253134564..526b147f31d75 100644 --- a/airbyte-integrations/connectors/source-n8n/source_n8n/source.py +++ b/airbyte-integrations/connectors/source-n8n/source_n8n/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceN8n(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "n8n.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-news-api/source_news_api/news_api.yaml b/airbyte-integrations/connectors/source-news-api/source_news_api/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-news-api/source_news_api/news_api.yaml rename to airbyte-integrations/connectors/source-news-api/source_news_api/manifest.yaml diff --git a/airbyte-integrations/connectors/source-news-api/source_news_api/source.py b/airbyte-integrations/connectors/source-news-api/source_news_api/source.py index 064c0a21fbe67..2d1b8a21a6e6e 100644 --- a/airbyte-integrations/connectors/source-news-api/source_news_api/source.py +++ b/airbyte-integrations/connectors/source-news-api/source_news_api/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceNewsApi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "news_api.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-newsdata/source_newsdata/newsdata.yaml b/airbyte-integrations/connectors/source-newsdata/source_newsdata/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-newsdata/source_newsdata/newsdata.yaml rename to airbyte-integrations/connectors/source-newsdata/source_newsdata/manifest.yaml diff --git a/airbyte-integrations/connectors/source-newsdata/source_newsdata/source.py b/airbyte-integrations/connectors/source-newsdata/source_newsdata/source.py index bba2fc1793660..b33e2d7f1e643 100644 --- a/airbyte-integrations/connectors/source-newsdata/source_newsdata/source.py +++ b/airbyte-integrations/connectors/source-newsdata/source_newsdata/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceNewsdata(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "newsdata.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-nytimes/source_nytimes/nytimes.yaml b/airbyte-integrations/connectors/source-nytimes/source_nytimes/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-nytimes/source_nytimes/nytimes.yaml rename to airbyte-integrations/connectors/source-nytimes/source_nytimes/manifest.yaml diff --git a/airbyte-integrations/connectors/source-nytimes/source_nytimes/source.py b/airbyte-integrations/connectors/source-nytimes/source_nytimes/source.py index e67605caf16d6..e1c42d511d4ab 100644 --- a/airbyte-integrations/connectors/source-nytimes/source_nytimes/source.py +++ b/airbyte-integrations/connectors/source-nytimes/source_nytimes/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceNytimes(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "nytimes.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-omnisend/source_omnisend/omnisend.yaml b/airbyte-integrations/connectors/source-omnisend/source_omnisend/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-omnisend/source_omnisend/omnisend.yaml rename to airbyte-integrations/connectors/source-omnisend/source_omnisend/manifest.yaml diff --git a/airbyte-integrations/connectors/source-omnisend/source_omnisend/source.py b/airbyte-integrations/connectors/source-omnisend/source_omnisend/source.py index 0866b13192159..b240dbd014822 100644 --- a/airbyte-integrations/connectors/source-omnisend/source_omnisend/source.py +++ b/airbyte-integrations/connectors/source-omnisend/source_omnisend/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceOmnisend(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "omnisend.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-oura/source_oura/oura.yaml b/airbyte-integrations/connectors/source-oura/source_oura/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-oura/source_oura/oura.yaml rename to airbyte-integrations/connectors/source-oura/source_oura/manifest.yaml diff --git a/airbyte-integrations/connectors/source-oura/source_oura/source.py b/airbyte-integrations/connectors/source-oura/source_oura/source.py index 644f972f110a9..d230140178a99 100644 --- a/airbyte-integrations/connectors/source-oura/source_oura/source.py +++ b/airbyte-integrations/connectors/source-oura/source_oura/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceOura(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "oura.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/partnerstack.yaml b/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-partnerstack/source_partnerstack/partnerstack.yaml rename to airbyte-integrations/connectors/source-partnerstack/source_partnerstack/manifest.yaml diff --git a/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/source.py b/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/source.py index 6584be3472c77..94041c9548795 100644 --- a/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/source.py +++ b/airbyte-integrations/connectors/source-partnerstack/source_partnerstack/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourcePartnerstack(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "partnerstack.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/pexels_api.yaml b/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-pexels-api/source_pexels_api/pexels_api.yaml rename to airbyte-integrations/connectors/source-pexels-api/source_pexels_api/manifest.yaml diff --git a/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/source.py b/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/source.py index f7a5cf4eee2d8..122b3263e2f0e 100644 --- a/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/source.py +++ b/airbyte-integrations/connectors/source-pexels-api/source_pexels_api/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourcePexelsApi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "pexels_api.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-plausible/source_plausible/plausible.yaml b/airbyte-integrations/connectors/source-plausible/source_plausible/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-plausible/source_plausible/plausible.yaml rename to airbyte-integrations/connectors/source-plausible/source_plausible/manifest.yaml diff --git a/airbyte-integrations/connectors/source-plausible/source_plausible/source.py b/airbyte-integrations/connectors/source-plausible/source_plausible/source.py index b3109208e8e34..46cd6480abb8a 100644 --- a/airbyte-integrations/connectors/source-plausible/source_plausible/source.py +++ b/airbyte-integrations/connectors/source-plausible/source_plausible/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourcePlausible(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "plausible.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-pocket/source_pocket/pocket.yaml b/airbyte-integrations/connectors/source-pocket/source_pocket/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-pocket/source_pocket/pocket.yaml rename to airbyte-integrations/connectors/source-pocket/source_pocket/manifest.yaml diff --git a/airbyte-integrations/connectors/source-pocket/source_pocket/source.py b/airbyte-integrations/connectors/source-pocket/source_pocket/source.py index 0fc77fa979127..8b2f94ee818d9 100644 --- a/airbyte-integrations/connectors/source-pocket/source_pocket/source.py +++ b/airbyte-integrations/connectors/source-pocket/source_pocket/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourcePocket(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "pocket.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/polygon_stock_api.yaml b/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/polygon_stock_api.yaml rename to airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/manifest.yaml diff --git a/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/source.py b/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/source.py index e57f2f436ebb9..b767c28be330e 100644 --- a/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/source.py +++ b/airbyte-integrations/connectors/source-polygon-stock-api/source_polygon_stock_api/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourcePolygonStockApi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "polygon_stock_api.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-posthog/source_posthog/posthog.yaml b/airbyte-integrations/connectors/source-posthog/source_posthog/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-posthog/source_posthog/posthog.yaml rename to airbyte-integrations/connectors/source-posthog/source_posthog/manifest.yaml diff --git a/airbyte-integrations/connectors/source-posthog/source_posthog/source.py b/airbyte-integrations/connectors/source-posthog/source_posthog/source.py index afb33b77b92b2..2e98e253b11bc 100644 --- a/airbyte-integrations/connectors/source-posthog/source_posthog/source.py +++ b/airbyte-integrations/connectors/source-posthog/source_posthog/source.py @@ -14,4 +14,4 @@ # Declarative Source class SourcePosthog(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "posthog.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/postmarkapp.yaml b/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/postmarkapp.yaml rename to airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/manifest.yaml diff --git a/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/source.py b/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/source.py index 1b110964ac1db..f214443a3a420 100644 --- a/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/source.py +++ b/airbyte-integrations/connectors/source-postmarkapp/source_postmarkapp/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourcePostmarkapp(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "postmarkapp.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-prestashop/source_prestashop/prestashop.yaml b/airbyte-integrations/connectors/source-prestashop/source_prestashop/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-prestashop/source_prestashop/prestashop.yaml rename to airbyte-integrations/connectors/source-prestashop/source_prestashop/manifest.yaml diff --git a/airbyte-integrations/connectors/source-prestashop/source_prestashop/source.py b/airbyte-integrations/connectors/source-prestashop/source_prestashop/source.py index 1054b393c01a7..b9cf1b9daf82a 100644 --- a/airbyte-integrations/connectors/source-prestashop/source_prestashop/source.py +++ b/airbyte-integrations/connectors/source-prestashop/source_prestashop/source.py @@ -31,7 +31,7 @@ class ConfigException(Exception): # Declarative Source class SourcePrestashop(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "prestashop.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) def _validate_and_transform(self, config: Mapping[str, Any]): if not config.get("_allow_http"): diff --git a/airbyte-integrations/connectors/source-punk-api/source_punk_api/punk_api.yaml b/airbyte-integrations/connectors/source-punk-api/source_punk_api/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-punk-api/source_punk_api/punk_api.yaml rename to airbyte-integrations/connectors/source-punk-api/source_punk_api/manifest.yaml diff --git a/airbyte-integrations/connectors/source-punk-api/source_punk_api/source.py b/airbyte-integrations/connectors/source-punk-api/source_punk_api/source.py index fc86b16fae5d2..95579f004941b 100644 --- a/airbyte-integrations/connectors/source-punk-api/source_punk_api/source.py +++ b/airbyte-integrations/connectors/source-punk-api/source_punk_api/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourcePunkApi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "punk_api.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-pypi/source_pypi/pypi.yaml b/airbyte-integrations/connectors/source-pypi/source_pypi/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-pypi/source_pypi/pypi.yaml rename to airbyte-integrations/connectors/source-pypi/source_pypi/manifest.yaml diff --git a/airbyte-integrations/connectors/source-pypi/source_pypi/source.py b/airbyte-integrations/connectors/source-pypi/source_pypi/source.py index 754a3600be541..7a91036ac2dbb 100644 --- a/airbyte-integrations/connectors/source-pypi/source_pypi/source.py +++ b/airbyte-integrations/connectors/source-pypi/source_pypi/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourcePypi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "pypi.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-recreation/source_recreation/recreation.yaml b/airbyte-integrations/connectors/source-recreation/source_recreation/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-recreation/source_recreation/recreation.yaml rename to airbyte-integrations/connectors/source-recreation/source_recreation/manifest.yaml diff --git a/airbyte-integrations/connectors/source-recreation/source_recreation/source.py b/airbyte-integrations/connectors/source-recreation/source_recreation/source.py index 2b4ac4c5331ba..8addd6dee2f54 100644 --- a/airbyte-integrations/connectors/source-recreation/source_recreation/source.py +++ b/airbyte-integrations/connectors/source-recreation/source_recreation/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceRecreation(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "recreation.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-recruitee/source_recruitee/recruitee.yaml b/airbyte-integrations/connectors/source-recruitee/source_recruitee/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-recruitee/source_recruitee/recruitee.yaml rename to airbyte-integrations/connectors/source-recruitee/source_recruitee/manifest.yaml diff --git a/airbyte-integrations/connectors/source-recruitee/source_recruitee/source.py b/airbyte-integrations/connectors/source-recruitee/source_recruitee/source.py index b5bde6d0ffe55..54d37b9a0cd12 100644 --- a/airbyte-integrations/connectors/source-recruitee/source_recruitee/source.py +++ b/airbyte-integrations/connectors/source-recruitee/source_recruitee/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceRecruitee(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "recruitee.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-reply-io/source_reply_io/reply_io.yaml b/airbyte-integrations/connectors/source-reply-io/source_reply_io/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-reply-io/source_reply_io/reply_io.yaml rename to airbyte-integrations/connectors/source-reply-io/source_reply_io/manifest.yaml diff --git a/airbyte-integrations/connectors/source-reply-io/source_reply_io/source.py b/airbyte-integrations/connectors/source-reply-io/source_reply_io/source.py index 98b37e1deb955..9102e92dcc6f3 100644 --- a/airbyte-integrations/connectors/source-reply-io/source_reply_io/source.py +++ b/airbyte-integrations/connectors/source-reply-io/source_reply_io/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceReplyIo(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "reply_io.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/rocket_chat.yaml b/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/rocket_chat.yaml rename to airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/manifest.yaml diff --git a/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/source.py b/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/source.py index 9339ecbdb6ccc..03d19a031717a 100644 --- a/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/source.py +++ b/airbyte-integrations/connectors/source-rocket-chat/source_rocket_chat/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceRocketChat(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "rocket_chat.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/sap_fieldglass.yaml b/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/sap_fieldglass.yaml rename to airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/manifest.yaml diff --git a/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/source.py b/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/source.py index 2c0741158432f..613eb3cea280f 100644 --- a/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/source.py +++ b/airbyte-integrations/connectors/source-sap-fieldglass/source_sap_fieldglass/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSapFieldglass(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "sap_fieldglass.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-secoda/source_secoda/secoda.yaml b/airbyte-integrations/connectors/source-secoda/source_secoda/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-secoda/source_secoda/secoda.yaml rename to airbyte-integrations/connectors/source-secoda/source_secoda/manifest.yaml diff --git a/airbyte-integrations/connectors/source-secoda/source_secoda/source.py b/airbyte-integrations/connectors/source-secoda/source_secoda/source.py index b4cf6d6ce8617..159313cfbdcc8 100644 --- a/airbyte-integrations/connectors/source-secoda/source_secoda/source.py +++ b/airbyte-integrations/connectors/source-secoda/source_secoda/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSecoda(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "secoda.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/sendinblue.yaml b/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-sendinblue/source_sendinblue/sendinblue.yaml rename to airbyte-integrations/connectors/source-sendinblue/source_sendinblue/manifest.yaml diff --git a/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/source.py b/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/source.py index 924ae8ab35b46..8194ea23c3b06 100644 --- a/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/source.py +++ b/airbyte-integrations/connectors/source-sendinblue/source_sendinblue/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSendinblue(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "sendinblue.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-senseforce/source_senseforce/senseforce.yaml b/airbyte-integrations/connectors/source-senseforce/source_senseforce/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-senseforce/source_senseforce/senseforce.yaml rename to airbyte-integrations/connectors/source-senseforce/source_senseforce/manifest.yaml diff --git a/airbyte-integrations/connectors/source-senseforce/source_senseforce/source.py b/airbyte-integrations/connectors/source-senseforce/source_senseforce/source.py index 26d5c1ee8bd1c..6d25203941c22 100644 --- a/airbyte-integrations/connectors/source-senseforce/source_senseforce/source.py +++ b/airbyte-integrations/connectors/source-senseforce/source_senseforce/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSenseforce(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "senseforce.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-smaily/source_smaily/smaily.yaml b/airbyte-integrations/connectors/source-smaily/source_smaily/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-smaily/source_smaily/smaily.yaml rename to airbyte-integrations/connectors/source-smaily/source_smaily/manifest.yaml diff --git a/airbyte-integrations/connectors/source-smaily/source_smaily/source.py b/airbyte-integrations/connectors/source-smaily/source_smaily/source.py index 9104fe3575eed..74b3791f4dd1c 100644 --- a/airbyte-integrations/connectors/source-smaily/source_smaily/source.py +++ b/airbyte-integrations/connectors/source-smaily/source_smaily/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSmaily(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "smaily.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-smartengage/source_smartengage/smartengage.yaml b/airbyte-integrations/connectors/source-smartengage/source_smartengage/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-smartengage/source_smartengage/smartengage.yaml rename to airbyte-integrations/connectors/source-smartengage/source_smartengage/manifest.yaml diff --git a/airbyte-integrations/connectors/source-smartengage/source_smartengage/source.py b/airbyte-integrations/connectors/source-smartengage/source_smartengage/source.py index 7ba8a096b2a45..aee8241032aac 100644 --- a/airbyte-integrations/connectors/source-smartengage/source_smartengage/source.py +++ b/airbyte-integrations/connectors/source-smartengage/source_smartengage/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSmartengage(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "smartengage.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/sonar_cloud.yaml b/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/sonar_cloud.yaml rename to airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/manifest.yaml diff --git a/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/source.py b/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/source.py index 9d7d52c06e94b..0eba3b0ccc5f0 100644 --- a/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/source.py +++ b/airbyte-integrations/connectors/source-sonar-cloud/source_sonar_cloud/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSonarCloud(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "sonar_cloud.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/spacex_api.yaml b/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-spacex-api/source_spacex_api/spacex_api.yaml rename to airbyte-integrations/connectors/source-spacex-api/source_spacex_api/manifest.yaml diff --git a/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/source.py b/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/source.py index a847fc0af51c0..d67182a9254ab 100644 --- a/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/source.py +++ b/airbyte-integrations/connectors/source-spacex-api/source_spacex_api/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSpacexApi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "spacex_api.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-square/source_square/square.yaml b/airbyte-integrations/connectors/source-square/source_square/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-square/source_square/square.yaml rename to airbyte-integrations/connectors/source-square/source_square/manifest.yaml diff --git a/airbyte-integrations/connectors/source-square/source_square/source.py b/airbyte-integrations/connectors/source-square/source_square/source.py index cc56fede7b7db..986b333c631de 100644 --- a/airbyte-integrations/connectors/source-square/source_square/source.py +++ b/airbyte-integrations/connectors/source-square/source_square/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSquare(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "square.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-statuspage/source_statuspage/statuspage.yaml b/airbyte-integrations/connectors/source-statuspage/source_statuspage/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-statuspage/source_statuspage/statuspage.yaml rename to airbyte-integrations/connectors/source-statuspage/source_statuspage/manifest.yaml diff --git a/airbyte-integrations/connectors/source-statuspage/source_statuspage/source.py b/airbyte-integrations/connectors/source-statuspage/source_statuspage/source.py index 1d8d85b315ba5..fbe389d2a6645 100644 --- a/airbyte-integrations/connectors/source-statuspage/source_statuspage/source.py +++ b/airbyte-integrations/connectors/source-statuspage/source_statuspage/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceStatuspage(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "statuspage.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/survey_sparrow.yaml b/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/survey_sparrow.yaml rename to airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/manifest.yaml diff --git a/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/source.py b/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/source.py index c61cdd97176f7..dbd0b36cff8a3 100644 --- a/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/source.py +++ b/airbyte-integrations/connectors/source-survey-sparrow/source_survey_sparrow/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceSurveySparrow(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "survey_sparrow.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/the_guardian_api.yaml b/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/the_guardian_api.yaml rename to airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/manifest.yaml diff --git a/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/source.py b/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/source.py index 19ae06a52dae8..ecc2af875840a 100644 --- a/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/source.py +++ b/airbyte-integrations/connectors/source-the-guardian-api/source_the_guardian_api/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceTheGuardianApi(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "the_guardian_api.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-tmdb/source_tmdb/tmdb.yaml b/airbyte-integrations/connectors/source-tmdb/source_tmdb/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-tmdb/source_tmdb/tmdb.yaml rename to airbyte-integrations/connectors/source-tmdb/source_tmdb/manifest.yaml diff --git a/airbyte-integrations/connectors/source-tmdb/source_tmdb/source.py b/airbyte-integrations/connectors/source-tmdb/source_tmdb/source.py index be00b94482afe..62a950e4fb6f7 100644 --- a/airbyte-integrations/connectors/source-tmdb/source_tmdb/source.py +++ b/airbyte-integrations/connectors/source-tmdb/source_tmdb/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceTmdb(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "tmdb.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-toggl/source_toggl/toggl.yaml b/airbyte-integrations/connectors/source-toggl/source_toggl/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-toggl/source_toggl/toggl.yaml rename to airbyte-integrations/connectors/source-toggl/source_toggl/manifest.yaml diff --git a/airbyte-integrations/connectors/source-toggl/source_toggl/source.py b/airbyte-integrations/connectors/source-toggl/source_toggl/source.py index 30b928ef3e14f..2c5736b5e5a69 100644 --- a/airbyte-integrations/connectors/source-toggl/source_toggl/source.py +++ b/airbyte-integrations/connectors/source-toggl/source_toggl/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceToggl(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "toggl.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/tvmaze_schedule.yaml b/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/tvmaze_schedule.yaml rename to airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/manifest.yaml diff --git a/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/source.py b/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/source.py index 49dc934451b41..d684593e716c7 100644 --- a/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/source.py +++ b/airbyte-integrations/connectors/source-tvmaze-schedule/source_tvmaze_schedule/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceTvmazeSchedule(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "tvmaze_schedule.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/twilio_taskrouter.yaml b/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/twilio_taskrouter.yaml rename to airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/manifest.yaml diff --git a/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/source.py b/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/source.py index b04146f84464b..aec37062a2a5b 100644 --- a/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/source.py +++ b/airbyte-integrations/connectors/source-twilio-taskrouter/source_twilio_taskrouter/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceTwilioTaskrouter(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "twilio_taskrouter.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-twitter/source_twitter/twitter.yaml b/airbyte-integrations/connectors/source-twitter/source_twitter/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-twitter/source_twitter/twitter.yaml rename to airbyte-integrations/connectors/source-twitter/source_twitter/manifest.yaml diff --git a/airbyte-integrations/connectors/source-twitter/source_twitter/source.py b/airbyte-integrations/connectors/source-twitter/source_twitter/source.py index d5bedefc9da98..c11ea62d31147 100644 --- a/airbyte-integrations/connectors/source-twitter/source_twitter/source.py +++ b/airbyte-integrations/connectors/source-twitter/source_twitter/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceTwitter(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "twitter.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/tyntec_sms.yaml b/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/tyntec_sms.yaml rename to airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/manifest.yaml diff --git a/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/source.py b/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/source.py index bf81253de26b5..515b3854077df 100644 --- a/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/source.py +++ b/airbyte-integrations/connectors/source-tyntec-sms/source_tyntec_sms/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceTyntecSms(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "tyntec_sms.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-vantage/source_vantage/vantage.yaml b/airbyte-integrations/connectors/source-vantage/source_vantage/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-vantage/source_vantage/vantage.yaml rename to airbyte-integrations/connectors/source-vantage/source_vantage/manifest.yaml diff --git a/airbyte-integrations/connectors/source-vantage/source_vantage/source.py b/airbyte-integrations/connectors/source-vantage/source_vantage/source.py index 0d907c3358a69..7623996406d04 100644 --- a/airbyte-integrations/connectors/source-vantage/source_vantage/source.py +++ b/airbyte-integrations/connectors/source-vantage/source_vantage/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceVantage(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "vantage.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-vitally/source_vitally/vitally.yaml b/airbyte-integrations/connectors/source-vitally/source_vitally/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-vitally/source_vitally/vitally.yaml rename to airbyte-integrations/connectors/source-vitally/source_vitally/manifest.yaml diff --git a/airbyte-integrations/connectors/source-vitally/source_vitally/source.py b/airbyte-integrations/connectors/source-vitally/source_vitally/source.py index 1cb69b35a7799..84b454c5becf2 100644 --- a/airbyte-integrations/connectors/source-vitally/source_vitally/source.py +++ b/airbyte-integrations/connectors/source-vitally/source_vitally/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceVitally(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "vitally.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/waiteraid.yaml b/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-waiteraid/source_waiteraid/waiteraid.yaml rename to airbyte-integrations/connectors/source-waiteraid/source_waiteraid/manifest.yaml diff --git a/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/source.py b/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/source.py index 7e2b4027a8ed1..dbab976d1a358 100644 --- a/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/source.py +++ b/airbyte-integrations/connectors/source-waiteraid/source_waiteraid/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceWaiteraid(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "waiteraid.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/whisky_hunter.yaml b/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/whisky_hunter.yaml rename to airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/manifest.yaml diff --git a/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/source.py b/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/source.py index c0d22e785848a..0d23c829bf1a7 100644 --- a/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/source.py +++ b/airbyte-integrations/connectors/source-whisky-hunter/source_whisky_hunter/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceWhiskyHunter(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "whisky_hunter.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/wikipedia_pageviews.yaml b/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/wikipedia_pageviews.yaml rename to airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/manifest.yaml diff --git a/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/source.py b/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/source.py index 19ed7ee95fb34..0a07b1cb7e671 100755 --- a/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/source.py +++ b/airbyte-integrations/connectors/source-wikipedia-pageviews/source_wikipedia_pageviews/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceWikipediaPageviews(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "wikipedia_pageviews.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/woocommerce.yaml b/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-woocommerce/source_woocommerce/woocommerce.yaml rename to airbyte-integrations/connectors/source-woocommerce/source_woocommerce/manifest.yaml diff --git a/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/source.py b/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/source.py index 4f4b454e9bf34..36b56ae3e66db 100644 --- a/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/source.py +++ b/airbyte-integrations/connectors/source-woocommerce/source_woocommerce/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceWoocommerce(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "woocommerce.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-workable/source_workable/workable.yaml b/airbyte-integrations/connectors/source-workable/source_workable/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-workable/source_workable/workable.yaml rename to airbyte-integrations/connectors/source-workable/source_workable/manifest.yaml diff --git a/airbyte-integrations/connectors/source-workable/source_workable/source.py b/airbyte-integrations/connectors/source-workable/source_workable/source.py index cbb89faaacb73..a948b80af6726 100644 --- a/airbyte-integrations/connectors/source-workable/source_workable/source.py +++ b/airbyte-integrations/connectors/source-workable/source_workable/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceWorkable(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "workable.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-workramp/source_workramp/workramp.yaml b/airbyte-integrations/connectors/source-workramp/source_workramp/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-workramp/source_workramp/workramp.yaml rename to airbyte-integrations/connectors/source-workramp/source_workramp/manifest.yaml diff --git a/airbyte-integrations/connectors/source-workramp/source_workramp/source.py b/airbyte-integrations/connectors/source-workramp/source_workramp/source.py index 999cd736e1b12..9ec1317397602 100644 --- a/airbyte-integrations/connectors/source-workramp/source_workramp/source.py +++ b/airbyte-integrations/connectors/source-workramp/source_workramp/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceWorkramp(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "workramp.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/zapier_supported_storage.yaml b/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/zapier_supported_storage.yaml rename to airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/manifest.yaml diff --git a/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/source.py b/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/source.py index 4a2e44426b81b..c4ba64c3b1b3a 100644 --- a/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/source.py +++ b/airbyte-integrations/connectors/source-zapier-supported-storage/source_zapier_supported_storage/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceZapierSupportedStorage(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "zapier_supported_storage.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) diff --git a/airbyte-integrations/connectors/source-zoom/source_zoom/zoom.yaml b/airbyte-integrations/connectors/source-zoom/source_zoom/manifest.yaml similarity index 100% rename from airbyte-integrations/connectors/source-zoom/source_zoom/zoom.yaml rename to airbyte-integrations/connectors/source-zoom/source_zoom/manifest.yaml diff --git a/airbyte-integrations/connectors/source-zoom/source_zoom/source.py b/airbyte-integrations/connectors/source-zoom/source_zoom/source.py index f7c16e43a355b..f195857afbe7b 100644 --- a/airbyte-integrations/connectors/source-zoom/source_zoom/source.py +++ b/airbyte-integrations/connectors/source-zoom/source_zoom/source.py @@ -15,4 +15,4 @@ # Declarative Source class SourceZoom(YamlDeclarativeSource): def __init__(self): - super().__init__(**{"path_to_yaml": "zoom.yaml"}) + super().__init__(**{"path_to_yaml": "manifest.yaml"}) From e7cc08639480a2a1922ceec50b002edb37578b82 Mon Sep 17 00:00:00 2001 From: Anne <102554163+alovew@users.noreply.github.com> Date: Wed, 25 Jan 2023 13:39:15 -0800 Subject: [PATCH 097/195] Turn on auto-detect schema env variable (#21814) * Turn on auto-detect schema env variable Co-authored-by: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> --- .env | 2 +- .env.dev | 2 +- .../features/EnvVariableFeatureFlags.java | 2 +- .../java/io/airbyte/config/EnvConfigs.java | 2 +- .../CreateConnectionForm.test.tsx.snap | 130 +++++++++++++++++- .../src/hooks/services/Feature/constants.ts | 2 + .../ConnectionReplicationPage.test.tsx.snap | 130 +++++++++++++++++- ...OrchestratorPodProcessIntegrationTest.java | 2 +- charts/airbyte/templates/env-configmap.yaml | 2 +- kube/overlays/dev-integration-test/.env | 2 +- kube/overlays/dev/.env | 2 +- .../overlays/stable-with-resource-limits/.env | 2 +- kube/overlays/stable/.env | 2 +- 13 files changed, 264 insertions(+), 18 deletions(-) diff --git a/.env b/.env index d9bf9f7d2048a..f15310773da31 100644 --- a/.env +++ b/.env @@ -114,4 +114,4 @@ METRIC_CLIENT= OTEL_COLLECTOR_ENDPOINT="http://host.docker.internal:4317" USE_STREAM_CAPABLE_STATE=true -AUTO_DETECT_SCHEMA=false +AUTO_DETECT_SCHEMA=true diff --git a/.env.dev b/.env.dev index 4f25503451fc3..19480e7072f9a 100644 --- a/.env.dev +++ b/.env.dev @@ -28,7 +28,7 @@ SYNC_JOB_MAX_ATTEMPTS=3 SYNC_JOB_MAX_TIMEOUT_DAYS=3 WORKERS_MICRONAUT_ENVIRONMENTS=control-plane CRON_MICRONAUT_ENVIRONMENTS=control-plane -AUTO_DETECT_SCHEMA=false +AUTO_DETECT_SCHEMA=true # Sentry SENTRY_DSN="" diff --git a/airbyte-commons/src/main/java/io/airbyte/commons/features/EnvVariableFeatureFlags.java b/airbyte-commons/src/main/java/io/airbyte/commons/features/EnvVariableFeatureFlags.java index 248c5524ed565..b574d0a40cee6 100644 --- a/airbyte-commons/src/main/java/io/airbyte/commons/features/EnvVariableFeatureFlags.java +++ b/airbyte-commons/src/main/java/io/airbyte/commons/features/EnvVariableFeatureFlags.java @@ -41,7 +41,7 @@ public boolean useStreamCapableState() { @Override public boolean autoDetectSchema() { - return getEnvOrDefault(AUTO_DETECT_SCHEMA, false, Boolean::parseBoolean); + return getEnvOrDefault(AUTO_DETECT_SCHEMA, true, Boolean::parseBoolean); } @Override diff --git a/airbyte-config/config-models/src/main/java/io/airbyte/config/EnvConfigs.java b/airbyte-config/config-models/src/main/java/io/airbyte/config/EnvConfigs.java index b68be54b055d1..c939764eab658 100644 --- a/airbyte-config/config-models/src/main/java/io/airbyte/config/EnvConfigs.java +++ b/airbyte-config/config-models/src/main/java/io/airbyte/config/EnvConfigs.java @@ -1124,7 +1124,7 @@ public int getWorkflowFailureRestartDelaySeconds() { @Override public boolean getAutoDetectSchema() { - return getEnvOrDefault(AUTO_DETECT_SCHEMA, false); + return getEnvOrDefault(AUTO_DETECT_SCHEMA, true); } @Override diff --git a/airbyte-webapp/src/components/connection/CreateConnectionForm/__snapshots__/CreateConnectionForm.test.tsx.snap b/airbyte-webapp/src/components/connection/CreateConnectionForm/__snapshots__/CreateConnectionForm.test.tsx.snap index a590788738923..5a71248604803 100644 --- a/airbyte-webapp/src/components/connection/CreateConnectionForm/__snapshots__/CreateConnectionForm.test.tsx.snap +++ b/airbyte-webapp/src/components/connection/CreateConnectionForm/__snapshots__/CreateConnectionForm.test.tsx.snap @@ -215,6 +215,128 @@ exports[`CreateConnectionForm should render 1`] = `
    +
    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + Ignore +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + Ignore +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    portMap = Map.of( diff --git a/charts/airbyte/templates/env-configmap.yaml b/charts/airbyte/templates/env-configmap.yaml index a219395275e45..f55fd2e88e8bf 100644 --- a/charts/airbyte/templates/env-configmap.yaml +++ b/charts/airbyte/templates/env-configmap.yaml @@ -63,7 +63,7 @@ data: ACTIVITY_MAX_DELAY_BETWEEN_ATTEMPTS_SECONDS: "" WORKFLOW_FAILURE_RESTART_DELAY_SECONDS: "" USE_STREAM_CAPABLE_STATE: "true" - AUTO_DETECT_SCHEMA: "false" + AUTO_DETECT_SCHEMA: "true" CONTAINER_ORCHESTRATOR_ENABLED: {{ .Values.worker.containerOrchestrator.enabled | quote }} CONTAINER_ORCHESTRATOR_IMAGE: {{ .Values.worker.containerOrchestrator.image | quote }} WORKERS_MICRONAUT_ENVIRONMENTS: "control-plane" diff --git a/kube/overlays/dev-integration-test/.env b/kube/overlays/dev-integration-test/.env index c0d8b1754bde7..aad4911e7fda8 100644 --- a/kube/overlays/dev-integration-test/.env +++ b/kube/overlays/dev-integration-test/.env @@ -95,4 +95,4 @@ USE_STREAM_CAPABLE_STATE=true SHOULD_RUN_NOTIFY_WORKFLOWS=false MAX_NOTIFY_WORKERS=5 -AUTO_DETECT_SCHEMA=false +AUTO_DETECT_SCHEMA=true diff --git a/kube/overlays/dev/.env b/kube/overlays/dev/.env index 8762e2ea5914d..1bc8b49dfe339 100644 --- a/kube/overlays/dev/.env +++ b/kube/overlays/dev/.env @@ -96,4 +96,4 @@ WORKFLOW_FAILURE_RESTART_DELAY_SECONDS= USE_STREAM_CAPABLE_STATE=true SHOULD_RUN_NOTIFY_WORKFLOWS=false MAX_NOTIFY_WORKERS=5 -AUTO_DETECT_SCHEMA=false +AUTO_DETECT_SCHEMA=true diff --git a/kube/overlays/stable-with-resource-limits/.env b/kube/overlays/stable-with-resource-limits/.env index 63df173366caf..22203d6db585a 100644 --- a/kube/overlays/stable-with-resource-limits/.env +++ b/kube/overlays/stable-with-resource-limits/.env @@ -98,4 +98,4 @@ WORKFLOW_FAILURE_RESTART_DELAY_SECONDS= USE_STREAM_CAPABLE_STATE=true SHOULD_RUN_NOTIFY_WORKFLOWS=false MAX_NOTIFY_WORKERS=5 -AUTO_DETECT_SCHEMA=false +AUTO_DETECT_SCHEMA=true diff --git a/kube/overlays/stable/.env b/kube/overlays/stable/.env index 46400b8ceeda7..91ab84ac2d9b7 100644 --- a/kube/overlays/stable/.env +++ b/kube/overlays/stable/.env @@ -96,4 +96,4 @@ WORKFLOW_FAILURE_RESTART_DELAY_SECONDS= USE_STREAM_CAPABLE_STATE=true SHOULD_RUN_NOTIFY_WORKFLOWS=false MAX_NOTIFY_WORKERS=5 -AUTO_DETECT_SCHEMA=false +AUTO_DETECT_SCHEMA=true From 4e99b5c90627b908ebc366a49a13412e0f2b2c84 Mon Sep 17 00:00:00 2001 From: Rodi Reich Zilberman <867491+rodireich@users.noreply.github.com> Date: Wed, 25 Jan 2023 14:48:26 -0800 Subject: [PATCH 098/195] Bump postgres version in source_definitions file (#21886) * Bump postgres version in source_definitions file * Bump postgres version in source_spec file --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- airbyte-config/init/src/main/resources/seed/source_specs.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index c66fd84a73f77..dec8a0e1897ff 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1341,7 +1341,7 @@ - name: Postgres sourceDefinitionId: decd338e-5647-4c0b-adf4-da0e75f5a750 dockerRepository: airbyte/source-postgres - dockerImageTag: 1.0.39 + dockerImageTag: 1.0.40 documentationUrl: https://docs.airbyte.com/integrations/sources/postgres icon: postgresql.svg sourceType: database diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 87f10814efc47..fcdec7a94854a 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -11502,7 +11502,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-postgres:1.0.39" +- dockerImage: "airbyte/source-postgres:1.0.40" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/postgres" connectionSpecification: From 60da9e470af416fccd84af17f4eb979b6a72efa5 Mon Sep 17 00:00:00 2001 From: Lake Mossman Date: Wed, 25 Jan 2023 15:13:00 -0800 Subject: [PATCH 099/195] [Connector Builder] Add Segment event tracking (#21686) * direct connector builder to first workspace and fix routing * add connector builder namespace and actions * track connector builder start event * track api url created event * track auth method select * fix action description * track user input events * track sidebar events * track stream creation * track copying stream * track stream delete * track stream test success/failure * track download yaml and fix yaml file name * track events for switching between ui/yaml * track events for overwriting and merging schemas * fix stream test failure/success events and add tracking of test initiation * do not send schema contents in events * track when stream is selected from testing panel * fix typo * handle initial setup completed in e2e tests * add warning about not putting sensitive info into URL fields * fix before in e2e test --- .../integration/connectorBuilder.spec.ts | 12 ++++- .../Builder/AddStreamButton.tsx | 23 +++++++++- .../Builder/AuthenticationSection.tsx | 11 +++++ .../connectorBuilder/Builder/BuilderField.tsx | 7 ++- .../connectorBuilder/Builder/BuilderOneOf.tsx | 4 ++ .../Builder/BuilderSidebar.tsx | 31 +++++++++++-- .../Builder/GlobalConfigView.tsx | 23 +++++++++- .../connectorBuilder/Builder/InputsForm.tsx | 28 +++++++++++- .../Builder/StreamConfigView.tsx | 23 ++++++++-- .../Builder/UiYamlToggleButton.tsx | 17 ++++++- .../connectorBuilder/DownloadYamlButton.tsx | 16 ++++++- .../StreamTestingPanel/SchemaDiffView.tsx | 17 ++++++- .../StreamTestingPanel/StreamSelector.tsx | 7 +++ .../StreamTestingPanel/StreamTester.tsx | 44 ++++++++++++++++++- .../YamlEditor/YamlEditor.tsx | 10 +++++ airbyte-webapp/src/core/analytics/types.ts | 25 +++++++++++ .../ConnectorBuilderPage.tsx | 11 ++++- airbyte-webapp/src/pages/routes.tsx | 10 +++-- 18 files changed, 295 insertions(+), 24 deletions(-) diff --git a/airbyte-webapp-e2e-tests/cypress/integration/connectorBuilder.spec.ts b/airbyte-webapp-e2e-tests/cypress/integration/connectorBuilder.spec.ts index 059e317cfbf89..5377bb69abe7e 100644 --- a/airbyte-webapp-e2e-tests/cypress/integration/connectorBuilder.spec.ts +++ b/airbyte-webapp-e2e-tests/cypress/integration/connectorBuilder.spec.ts @@ -1,8 +1,18 @@ import { goToConnectorBuilderPage, testStream } from "pages/connectorBuilderPage"; -import { assertTestReadItems, assertTestReadAuthFailure, configureAuth, configureGlobals, configureStream, configurePagination, assertMultiPageReadItems } from "commands/connectorBuilder"; +import { + assertTestReadItems, + assertTestReadAuthFailure, + configureAuth, + configureGlobals, + configureStream, + configurePagination, + assertMultiPageReadItems, +} from "commands/connectorBuilder"; +import { initialSetupCompleted } from "commands/workspaces"; describe("Connector builder", () => { before(() => { + initialSetupCompleted(); goToConnectorBuilderPage(); }); diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/AddStreamButton.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/AddStreamButton.tsx index 5c6d685997bfd..ab9f46e53d85c 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/AddStreamButton.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/AddStreamButton.tsx @@ -9,7 +9,9 @@ import * as yup from "yup"; import { Button } from "components/ui/Button"; import { Modal, ModalBody, ModalFooter } from "components/ui/Modal"; +import { Action, Namespace } from "core/analytics"; import { FormikPatch } from "core/form/FormikPatch"; +import { useAnalyticsService } from "hooks/services/Analytics"; import { ReactComponent as PlusIcon } from "../../connection/ConnectionOnboarding/plusIcon.svg"; import { BuilderStream, DEFAULT_BUILDER_STREAM_VALUES } from "../types"; @@ -34,6 +36,7 @@ export const AddStreamButton: React.FC = ({ initialValues, "data-testid": testId, }) => { + const analyticsService = useAnalyticsService(); const { formatMessage } = useIntl(); const [isOpen, setIsOpen] = useState(false); const [streamsField, , helpers] = useField("streams"); @@ -57,17 +60,35 @@ export const AddStreamButton: React.FC = ({ { + const id = uuid(); helpers.setValue([ ...streamsField.value, merge({}, DEFAULT_BUILDER_STREAM_VALUES, { ...initialValues, name: values.streamName, urlPath: values.urlPath, - id: uuid(), + id, }), ]); setIsOpen(false); onAddStream(numStreams); + if (initialValues) { + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.STREAM_COPY, { + actionDescription: "Existing stream copied into a new stream", + existing_stream_id: initialValues.id, + existing_stream_name: initialValues.name, + new_stream_id: id, + new_stream_name: values.streamName, + new_stream_url_path: values.urlPath, + }); + } else { + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.STREAM_CREATE, { + actionDescription: "New stream created from the Add Stream button", + stream_id: id, + stream_name: values.streamName, + url_path: values.urlPath, + }); + } }} validationSchema={yup.object().shape({ streamName: yup.string().required("form.empty.error"), diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/AuthenticationSection.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/AuthenticationSection.tsx index 5abfe0d0a85d6..a846658635bb2 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/AuthenticationSection.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/AuthenticationSection.tsx @@ -1,3 +1,6 @@ +import { Action, Namespace } from "core/analytics"; +import { useAnalyticsService } from "hooks/services/Analytics"; + import { inferredAuthValues } from "../types"; import { BuilderCard } from "./BuilderCard"; import { BuilderField } from "./BuilderField"; @@ -7,12 +10,20 @@ import { BuilderOptional } from "./BuilderOptional"; import { KeyValueListField } from "./KeyValueListField"; export const AuthenticationSection: React.FC = () => { + const analyticsService = useAnalyticsService(); + return ( + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.AUTHENTICATION_METHOD_SELECT, { + actionDescription: "Authentication method selected", + auth_type: type, + }) + } options={[ { label: "No Auth", typeValue: "NoAuth" }, { diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderField.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderField.tsx index 497523e3a9b09..ae7bf7fa1909b 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderField.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderField.tsx @@ -30,7 +30,7 @@ interface BaseFieldProps { // path to the location in the Connector Manifest schema which should be set by this component path: string; label: string; - tooltip?: string; + tooltip?: React.ReactNode; readOnly?: boolean; optional?: boolean; pattern?: RegExp; @@ -40,7 +40,7 @@ interface BaseFieldProps { export type BuilderFieldProps = BaseFieldProps & ( - | { type: "string" | "number" | "integer"; onChange?: (newValue: string) => void } + | { type: "string" | "number" | "integer"; onChange?: (newValue: string) => void; onBlur?: (value: string) => void } | { type: "boolean"; onChange?: (newValue: boolean) => void } | { type: "array"; onChange?: (newValue: string[]) => void } | { type: "enum"; onChange?: (newValue: string) => void; options: string[] } @@ -116,6 +116,9 @@ const InnerBuilderField: React.FC> = error={hasError} readOnly={readOnly} adornment={adornment} + onBlur={(e) => { + props.onBlur?.(e.target.value); + }} /> )} {props.type === "array" && ( diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderOneOf.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderOneOf.tsx index d8046b0e4c974..9204cff3866ec 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderOneOf.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderOneOf.tsx @@ -23,6 +23,7 @@ interface BuilderOneOfProps { path: string; // path to the oneOf component in the json schema label: string; tooltip: string; + onSelect?: (type: string) => void; } const InnerBuilderOneOf: React.FC> = ({ @@ -32,6 +33,7 @@ const InnerBuilderOneOf: React.FC> = field: typePathField, path, form, + onSelect, }) => { const value = typePathField.value; @@ -56,6 +58,8 @@ const InnerBuilderOneOf: React.FC> = type: selectedOption.value, ...selectedOption.default, }); + + onSelect?.(selectedOption.value); }} /> } diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderSidebar.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderSidebar.tsx index 2ee753a208be6..b35661eedfef7 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderSidebar.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/BuilderSidebar.tsx @@ -10,6 +10,8 @@ import { Button } from "components/ui/Button"; import { Heading } from "components/ui/Heading"; import { Text } from "components/ui/Text"; +import { Action, Namespace } from "core/analytics"; +import { useAnalyticsService } from "hooks/services/Analytics"; import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; import { BuilderView, useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService"; @@ -57,6 +59,7 @@ interface BuilderSidebarProps { } export const BuilderSidebar: React.FC = React.memo(({ className, toggleYamlEditor }) => { + const analyticsService = useAnalyticsService(); const { formatMessage } = useIntl(); const { hasErrors } = useBuilderErrors(); const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); @@ -71,6 +74,9 @@ export const BuilderSidebar: React.FC = React.memo(({ class setValues(DEFAULT_BUILDER_FORM_VALUES); setSelectedView("global"); closeConfirmationModal(); + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.RESET_ALL, { + actionDescription: "Connector Builder UI reset back to blank slate", + }); }, }); }; @@ -100,7 +106,12 @@ export const BuilderSidebar: React.FC = React.memo(({ class className={styles.globalConfigButton} selected={selectedView === "global"} showErrorIndicator={hasErrors(true, ["global"])} - onClick={() => handleViewSelect("global")} + onClick={() => { + handleViewSelect("global"); + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.GLOBAL_CONFIGURATION_SELECT, { + actionDescription: "Global Configuration view selected", + }); + }} > @@ -111,7 +122,12 @@ export const BuilderSidebar: React.FC = React.memo(({ class showErrorIndicator={false} className={styles.globalConfigButton} selected={selectedView === "inputs"} - onClick={() => handleViewSelect("inputs")} + onClick={() => { + handleViewSelect("inputs"); + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.USER_INPUTS_SELECT, { + actionDescription: "User Inputs view selected", + }); + }} > = React.memo(({ class
    - {values.streams.map(({ name }, num) => ( + {values.streams.map(({ name, id }, num) => ( handleViewSelect(num)} + onClick={() => { + handleViewSelect(num); + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.STREAM_SELECT, { + actionDescription: "Stream view selected", + stream_id: id, + stream_name: name, + }); + }} > {name && name.trim() ? ( {name} diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/GlobalConfigView.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/GlobalConfigView.tsx index bc8e29a532a55..72a89aed91d9f 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/GlobalConfigView.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/GlobalConfigView.tsx @@ -1,5 +1,10 @@ import { useIntl } from "react-intl"; +import { TextWithHTML } from "components/ui/TextWithHTML"; + +import { Action, Namespace } from "core/analytics"; +import { useAnalyticsService } from "hooks/services/Analytics"; + import { AuthenticationSection } from "./AuthenticationSection"; import { BuilderCard } from "./BuilderCard"; import { BuilderConfigView } from "./BuilderConfigView"; @@ -9,13 +14,29 @@ import styles from "./GlobalConfigView.module.scss"; export const GlobalConfigView: React.FC = () => { const { formatMessage } = useIntl(); + const analyticsService = useAnalyticsService(); return ( {/* Not using intl for the labels and tooltips in this component in order to keep maintainence simple */} - + + } + onBlur={(value: string) => { + if (value) { + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.API_URL_CREATE, { + actionDescription: "Base API URL filled in", + api_url: value, + }); + } + }} + /> diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.tsx index 2ab7c5415aa77..af5173424d138 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.tsx @@ -1,5 +1,4 @@ import { Form, Formik, useField, useFormikContext } from "formik"; -import { JSONSchema7 } from "json-schema"; import { useMemo } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { useEffectOnce } from "react-use"; @@ -9,7 +8,10 @@ import { Button } from "components/ui/Button"; import { Callout } from "components/ui/Callout"; import { Modal, ModalBody, ModalFooter } from "components/ui/Modal"; +import { Action, Namespace } from "core/analytics"; import { FormikPatch } from "core/form/FormikPatch"; +import { AirbyteJSONSchema } from "core/jsonSchema/types"; +import { useAnalyticsService } from "hooks/services/Analytics"; import { BuilderFormInput, BuilderFormValues, getInferredInputs } from "../types"; import { BuilderField } from "./BuilderField"; @@ -19,7 +21,7 @@ const supportedTypes = ["string", "integer", "number", "array", "boolean", "enum export interface InputInEditing { key: string; - definition: JSONSchema7; + definition: AirbyteJSONSchema; required: boolean; isNew?: boolean; showDefaultValueField: boolean; @@ -68,6 +70,7 @@ export const InputForm = ({ inputInEditing: InputInEditing; onClose: (newInput?: BuilderFormInput) => void; }) => { + const analyticsService = useAnalyticsService(); const { values, setFieldValue } = useFormikContext(); const [inputs, , helpers] = useField("inputs"); const inferredInputs = useMemo( @@ -112,6 +115,22 @@ export const InputForm = ({ ); onClose(newInput); } + analyticsService.track( + Namespace.CONNECTOR_BUILDER, + values.isNew ? Action.USER_INPUT_CREATE : Action.USER_INPUT_EDIT, + { + actionDescription: values.isNew ? "New user input created" : "Existing user input edited", + user_input_id: values.key, + user_input_name: values.definition.title, + hint: values.definition.description, + type: values.type, + allowed_enum_values: values.definition.enum, + secret_field: values.definition.airbyte_secret, + required_field: values.definition.required, + enable_default_value: values.showDefaultValueField, + default_value: values.definition.default, + } + ); }} > <> @@ -121,6 +140,11 @@ export const InputForm = ({ onDelete={() => { helpers.setValue(inputs.value.filter((input) => input.key !== inputInEditing.key)); onClose(); + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.USER_INPUT_DELETE, { + actionDescription: "User input deleted", + user_input_id: inputInEditing.key, + user_input_name: inputInEditing.definition.title, + }); }} onClose={() => { onClose(); diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/StreamConfigView.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/StreamConfigView.tsx index 9fa3cf43ff112..270c9b4c5acf3 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/StreamConfigView.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/StreamConfigView.tsx @@ -10,7 +10,10 @@ import Indicator from "components/Indicator"; import { Button } from "components/ui/Button"; import { CodeEditor } from "components/ui/CodeEditor"; import { Text } from "components/ui/Text"; +import { TextWithHTML } from "components/ui/TextWithHTML"; +import { Action, Namespace } from "core/analytics"; +import { useAnalyticsService } from "hooks/services/Analytics"; import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; import { BuilderView, @@ -64,7 +67,9 @@ export const StreamConfigView: React.FC = React.memo(({ s type="string" path={streamFieldPath("urlPath")} label="Path URL" - tooltip="Path of the endpoint that this stream represents." + tooltip={ + + } /> void; selectedTab: "configuration" | "schema"; }) => { + const analyticsService = useAnalyticsService(); const { formatMessage } = useIntl(); const [field, , helpers] = useField("streams"); const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); @@ -151,6 +157,11 @@ const StreamControls = ({ helpers.setValue(updatedStreams); setSelectedView(viewToSelect); closeConfirmationModal(); + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.STREAM_DELETE, { + actionDescription: "New stream created from the Add Stream button", + stream_id: field.value[streamNum].id, + stream_name: field.value[streamNum].name, + }); }, }); }; @@ -207,8 +218,9 @@ const StreamTab = ({ ); const SchemaEditor = ({ streamFieldPath }: { streamFieldPath: (fieldPath: string) => string }) => { + const analyticsService = useAnalyticsService(); const [field, meta, helpers] = useField(streamFieldPath("schema")); - const { streamRead } = useConnectorBuilderTestState(); + const { streamRead, streams, testStreamIndex } = useConnectorBuilderTestState(); const showImportButton = !field.value && streamRead.data?.inferred_schema; @@ -219,7 +231,12 @@ const SchemaEditor = ({ streamFieldPath }: { streamFieldPath: (fieldPath: string full variant="secondary" onClick={() => { - helpers.setValue(formatJson(streamRead.data?.inferred_schema, true)); + const formattedJson = formatJson(streamRead.data?.inferred_schema, true); + helpers.setValue(formattedJson); + analyticsService.track(Namespace.CONNECTOR_BUILDER, Action.OVERWRITE_SCHEMA, { + actionDescription: "Declared schema overwritten by detected schema", + stream_name: streams[testStreamIndex]?.name, + }); }} > diff --git a/airbyte-webapp/src/components/connectorBuilder/Builder/UiYamlToggleButton.tsx b/airbyte-webapp/src/components/connectorBuilder/Builder/UiYamlToggleButton.tsx index e92f1cb251261..1ca0692d9dd56 100644 --- a/airbyte-webapp/src/components/connectorBuilder/Builder/UiYamlToggleButton.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/Builder/UiYamlToggleButton.tsx @@ -3,6 +3,9 @@ import { FormattedMessage } from "react-intl"; import { Text } from "components/ui/Text"; +import { Action, Namespace } from "core/analytics"; +import { useAnalyticsService } from "hooks/services/Analytics"; + import styles from "./UiYamlToggleButton.module.scss"; interface UiYamlToggleButtonProps { @@ -12,8 +15,20 @@ interface UiYamlToggleButtonProps { } export const UiYamlToggleButton: React.FC = ({ className, yamlSelected, onClick }) => { + const analyticsService = useAnalyticsService(); + return ( -
    -
    - - )} + )} - - - - - - {renderHeaderControls("available")} + + + + + + + + {renderHeaderControls("available")} + +
    -
    - - + + ); }; diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsViewContext.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsViewContext.tsx new file mode 100644 index 0000000000000..6396c032d8bb3 --- /dev/null +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsViewContext.tsx @@ -0,0 +1,18 @@ +import React, { useContext } from "react"; + +interface Context { + updatingAll: boolean; + updatingDefinitionId?: string; + feedbackList: Record; +} + +export const useUpdatingState = (): Context => { + const updatingState = useContext(ConnectorsViewContext); + if (!updatingState) { + throw new Error("useUpdatingState must be used within a ConnectorsViewContext."); + } + + return updatingState; +}; + +export const ConnectorsViewContext = React.createContext(null); diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/CreateConnectorModal.module.scss b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/CreateConnectorModal.module.scss index c1e94076bed6d..bb16f4688ddd1 100644 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/CreateConnectorModal.module.scss +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/CreateConnectorModal.module.scss @@ -1,5 +1,10 @@ -@use "scss/variables"; +@use "scss/colors"; -.buttonWithMargin { - margin: 0 variables.$spacing-md; +.errorMessage { + color: colors.$red; +} + +.docLink { + text-decoration: none; + display: inline-block; } diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/CreateConnectorModal.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/CreateConnectorModal.tsx index dcb33b8787ed9..e3219209729d9 100644 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/CreateConnectorModal.tsx +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/CreateConnectorModal.tsx @@ -1,13 +1,12 @@ import { Field, FieldProps, Form, Formik } from "formik"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; -import styled from "styled-components"; import * as yup from "yup"; -import { LabeledInput, Link } from "components"; +import { LabeledInput } from "components"; import { Button } from "components/ui/Button"; -import { Modal } from "components/ui/Modal"; -import { StatusIcon } from "components/ui/StatusIcon"; +import { FlexContainer } from "components/ui/Flex"; +import { Modal, ModalBody, ModalFooter } from "components/ui/Modal"; import { Text } from "components/ui/Text"; import { isCloudApp } from "utils/app"; @@ -25,60 +24,6 @@ export interface CreateConnectorModalProps { dockerRepository: string; }) => Promise; } - -const Content = styled.div` - width: 585px; - padding: 19px 41px 30px 36px; -`; - -const ButtonContent = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - min-height: 40px; -`; - -const FieldContainer = styled.div` - margin-bottom: 21px; -`; - -const Subtitle = styled.div` - margin-bottom: 26px; - font-size: 14px; - line-height: 21px; - color: ${({ theme }) => theme.darkPrimaryColor}; -`; - -const DocLink = styled(Link).attrs({ as: "a" })` - text-decoration: none; - display: inline-block; -`; - -const Error = styled(StatusIcon)` - padding-top: 4px; - padding-left: 1px; - font-size: 17px; - width: 26px; - min-width: 26px; - height: 26px; -`; - -const ErrorBlock = styled.div` - display: flex; - justify-content: right; - align-items: center; - font-weight: 600; - font-size: 12px; - line-height: 18px; - color: ${({ theme }) => theme.darkPrimaryColor}; - max-width: 320px; -`; - -const ErrorText = styled.div` - font-weight: normal; - color: ${({ theme }) => theme.dangerColor}; - max-width: 400px; -`; const validationSchema = yup.object().shape({ name: yup.string().trim().required("form.empty.error"), documentationUrl: yup.string().trim().url("form.url.error").notRequired(), @@ -98,167 +43,149 @@ const CreateConnectorModal: React.FC = ({ onClose, on const { formatMessage } = useIntl(); return ( - }> - - - ( - - {lnk} - - ), - }} - /> - - { - await onSubmit(values); - setSubmitting(false); - }} - > - {({ isSubmitting, isValid, dirty }) => ( - - - - {({ field, meta }: FieldProps) => ( - - - - } - error={meta.touched && !!meta.error} - message={ - meta.touched && meta.error ? ( - - ) : ( - - ) - } - /> - )} - - - - - {({ field, meta }: FieldProps) => ( - - - - } - error={meta.touched && !!meta.error} - message={ - meta.touched && meta.error ? ( - - ) : ( - - ) - } - /> - )} - - - - - {({ field, meta }: FieldProps) => ( - - - - } - error={!!meta.error && meta.touched} - message={ - meta.touched && meta.error ? ( - - ) : ( - - ) - } - /> - )} - - - - - {({ field, meta }: FieldProps) => ( - - - - } - error={meta.touched && !!meta.error} - message={meta.error && } - /> - )} - - - - {errorMessage ? ( - - - {errorMessage} - - ) : ( -
    - )} -
    - - -
    - - - )} - - - + { + await onSubmit(values); + setSubmitting(false); + }} + > + {({ isSubmitting, isValid, dirty }) => ( + }> +
    + + + + ( + + {lnk} + + ), + }} + /> + + + + {({ field, meta }: FieldProps) => ( + + + + } + error={meta.touched && !!meta.error} + message={ + meta.touched && meta.error ? ( + + ) : ( + + ) + } + /> + )} + + + {({ field, meta }: FieldProps) => ( + + + + } + error={meta.touched && !!meta.error} + message={ + meta.touched && meta.error ? ( + + ) : ( + + ) + } + /> + )} + + + {({ field, meta }: FieldProps) => ( + + + + } + error={!!meta.error && meta.touched} + message={ + meta.touched && meta.error ? ( + + ) : ( + + ) + } + /> + )} + + + {({ field, meta }: FieldProps) => ( + + + + } + error={meta.touched && !!meta.error} + message={meta.error && } + /> + )} + + + {errorMessage &&
    {errorMessage}
    } +
    +
    +
    + + + + + +
    + )} +
    ); }; diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/PageComponents.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/PageComponents.tsx deleted file mode 100644 index ef7827175dd42..0000000000000 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/PageComponents.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import styled from "styled-components"; - -export const FormContent = styled.div` - width: 253px; - margin: -10px 0 -10px 200px; - position: relative; -`; - -export const FormContentTitle = styled(FormContent)` - margin: 0 0 0 200px; -`; diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/UpgradeAllButton.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/UpgradeAllButton.tsx index 9c6e1a990917f..c0cbaaa8b013e 100644 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/UpgradeAllButton.tsx +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/UpgradeAllButton.tsx @@ -35,9 +35,10 @@ interface UpdateAllButtonProps { isLoading: boolean; hasError: boolean; hasSuccess: boolean; + disabled: boolean; } -const UpgradeAllButton: React.FC = ({ onUpdate, isLoading, hasError, hasSuccess }) => { +const UpgradeAllButton: React.FC = ({ onUpdate, isLoading, hasError, hasSuccess, disabled }) => { return ( {hasError && ( @@ -50,6 +51,7 @@ const UpgradeAllButton: React.FC = ({ onUpdate, isLoading, className={styles.updateButton} onClick={onUpdate} isLoading={isLoading} + disabled={disabled} icon={hasSuccess ? undefined : } > {hasSuccess ? : } diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/VersionCell.module.scss b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/VersionCell.module.scss new file mode 100644 index 0000000000000..9cdcb2d1f495b --- /dev/null +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/VersionCell.module.scss @@ -0,0 +1,35 @@ +@use "scss/colors"; + +.errorMessage { + color: colors.$red; +} + +.versionCell { + width: 450px; +} + +.versionInput { + max-width: 145px; + margin-right: 19px; +} + +.inputField { + display: inline-block; + position: relative; + background: colors.$white; + + &::before { + position: absolute; + display: block; + pointer-events: none; + content: attr(data-before); + color: colors.$grey-400; + top: 10px; + right: 22px; + z-index: 3; + } + + &:focus-within::before { + display: none; + } +} diff --git a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/VersionCell.tsx b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/VersionCell.tsx index 69c0ffcad4837..51dd6b5de898a 100644 --- a/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/VersionCell.tsx +++ b/airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/VersionCell.tsx @@ -1,83 +1,35 @@ import { Field, FieldProps, Form, Formik } from "formik"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; -import styled from "styled-components"; import { Button } from "components/ui/Button"; +import { FlexContainer, FlexItem } from "components/ui/Flex"; import { Input } from "components/ui/Input"; import { DEV_IMAGE_TAG } from "core/domain/connector/constants"; -import { FormContent } from "./PageComponents"; +import { useUpdatingState } from "./ConnectorsViewContext"; +import styles from "./VersionCell.module.scss"; interface VersionCellProps { version: string; currentVersion: string; id: string; onChange: ({ version, id }: { version: string; id: string }) => void; - feedback?: "success" | string; - updating: boolean; } -const VersionInput = styled(Input)` - max-width: 145px; - margin-right: 19px; -`; - -const InputField = styled.div<{ showNote?: boolean }>` - display: inline-block; - position: relative; - background: ${({ theme }) => theme.whiteColor}; - - &:before { - position: absolute; - display: ${({ showNote }) => (showNote ? "block" : "none")}; - content: attr(data-before); - color: ${({ theme }) => theme.greyColor40}; - top: 10px; - right: 22px; - z-index: 3; - } - - &:focus-within:before { - display: none; - } -`; - -const SuccessMessage = styled.div` - color: ${({ theme }) => theme.successColor}; - font-size: 12px; - line-height: 18px; - position: absolute; - text-align: right; - width: 205px; - left: -208px; - height: 100%; - display: flex; - align-items: center; - justify-content: flex-end; - white-space: break-spaces; -`; - -const ErrorMessage = styled(SuccessMessage)` - color: ${({ theme }) => theme.dangerColor}; - font-size: 11px; - line-height: 14px; -`; - -const VersionCell: React.FC = ({ id, version, onChange, feedback, currentVersion, updating }) => { +const VersionCell: React.FC = ({ id, version, onChange, currentVersion }) => { + const { updatingAll, updatingDefinitionId, feedbackList } = useUpdatingState(); + const feedback = feedbackList[id]; + const updatingCurrent = id === updatingDefinitionId; const { formatMessage } = useIntl(); const renderFeedback = (dirty: boolean, feedback?: string) => { - if (feedback && !dirty) { - if (feedback === "success") { - return ( - - - - ); - } - return {feedback}; + if (feedback === "success" && !dirty) { + return ; + } + if (feedback && feedback !== "success") { + return {feedback}; } return null; @@ -86,40 +38,44 @@ const VersionCell: React.FC = ({ id, version, onChange, feedba const isConnectorUpdatable = currentVersion !== version || currentVersion === DEV_IMAGE_TAG; return ( - - onChange({ id, version: values.version })} - > - {({ isSubmitting, dirty }) => ( -
    - {renderFeedback(dirty, feedback)} + onChange({ id, version: values.version })} + > + {({ isSubmitting, dirty }) => ( + + + {renderFeedback(dirty, feedback)} {({ field }: FieldProps) => ( - - - + +
    )} - - )} -
    - + + + )} + ); }; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/__snapshots__/FrequentlyUsedConnectorsCard.test.tsx.snap b/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/__snapshots__/FrequentlyUsedConnectorsCard.test.tsx.snap index 970d2ef7d5569..18dc706aac276 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/__snapshots__/FrequentlyUsedConnectorsCard.test.tsx.snap +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/__snapshots__/FrequentlyUsedConnectorsCard.test.tsx.snap @@ -247,6 +247,15 @@ exports[` should renders with mock data without > MongoDB + +
    + Custom +
    +
    From ca8151ec68b6b5d0691d5e787372a4c6f9091701 Mon Sep 17 00:00:00 2001 From: Evan Tahler Date: Thu, 26 Jan 2023 08:37:21 -0800 Subject: [PATCH 112/195] Revert allowedHosts missing value checks (#21923) --- .../airbyte/workers/utils/ConfigReplacer.java | 4 ---- .../workers/utils/ConfigReplacerTest.java | 19 ------------------- 2 files changed, 23 deletions(-) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java b/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java index 356ad5fadec8c..791b8f80e9556 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java @@ -48,10 +48,6 @@ public AllowedHosts getAllowedHosts(AllowedHosts allowedHosts, JsonNode config) final List hosts = allowedHosts.getHosts(); for (String host : hosts) { final String replacedString = sub.replace(host); - if (replacedString.contains("${")) { - throw new IOException( - "The allowed host value, '" + host + "', is expecting an interpolation value from the connector's configuration, but none is present"); - } resolvedHosts.add(replacedString); } diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java index 4ef50ebb48a33..511c0dd98df27 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java @@ -42,23 +42,4 @@ void getAllowedHostsGeneralTest() throws IOException { assertThat(response.getHosts()).isEqualTo(expected); } - @Test() - void getAllowedHostsMissingValue() throws IOException { - final AllowedHosts allowedHosts = new AllowedHosts(); - final List hosts = new ArrayList(); - hosts.add("${subdomain}.vendor.com"); - allowedHosts.setHosts(hosts); - - final String configJson = "{\"password\": \"abc123\"}"; - final JsonNode config = mapper.readValue(configJson, JsonNode.class); - - try { - replacer.getAllowedHosts(allowedHosts, config); - throw new RuntimeException("should not get here"); - } catch (Exception e) { - assertThat(e).hasMessage( - "The allowed host value, '${subdomain}.vendor.com', is expecting an interpolation value from the connector's configuration, but none is present"); - } - } - } From ec934ad957b92266c77f9ec2d9f693d51fcc1774 Mon Sep 17 00:00:00 2001 From: Serhii Lazebnyi <53845333+lazebnyi@users.noreply.github.com> Date: Thu, 26 Jan 2023 17:49:57 +0100 Subject: [PATCH 113/195] =?UTF-8?q?=F0=9F=90=9BSource=20Titktok=20Marketin?= =?UTF-8?q?g:=20Fix=20schema=20types=20(#20415)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updated schema types * Updated version * Updated acceptance test config to high strictness * Updated SAT to high strictness * skip comprehensive incremental tests * Fixed SAT * disable high strictness * updated unittest config * auto-bump connector version Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../source-tiktok-marketing/Dockerfile | 2 +- .../source-tiktok-marketing/README.md | 2 +- .../acceptance-test-config.yml | 211 ++++++++++-------- .../source-tiktok-marketing/bootstrap.md | 47 ++++ .../integration_tests/abnormal_state.json | 16 +- .../configured_catalog.json | 169 ++++++++++++++ .../configured_catalog_incremental.json | 158 +++++++++++++ .../{ => configured_catalogs}/streams.json | 0 .../streams_all.json | 2 - .../streams_all_incremental.json | 0 .../streams_audience_incremental.json | 0 .../streams_basic.json | 0 .../streams_reports_daily.json | 0 .../streams_reports_lifetime.json | 0 .../streams_with_day_granularity.json | 0 .../streams_with_lifetime_granularity.json | 0 .../schemas/audience_reports.json | 42 ++-- .../schemas/basic_reports.json | 52 ++--- .../unit_tests/unit_test.py | 2 +- docs/integrations/sources/tiktok-marketing.md | 1 + 22 files changed, 557 insertions(+), 151 deletions(-) create mode 100644 airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/configured_catalog.json create mode 100644 airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/configured_catalog_incremental.json rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams.json (100%) rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams_all.json (99%) rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams_all_incremental.json (100%) rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams_audience_incremental.json (100%) rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams_basic.json (100%) rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams_reports_daily.json (100%) rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams_reports_lifetime.json (100%) rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams_with_day_granularity.json (100%) rename airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/{ => configured_catalogs}/streams_with_lifetime_granularity.json (100%) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 308b63c11004e..d1230378d454f 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1742,7 +1742,7 @@ - name: TikTok Marketing sourceDefinitionId: 4bfac00d-ce15-44ff-95b9-9e3c3e8fbd35 dockerRepository: airbyte/source-tiktok-marketing - dockerImageTag: 1.0.1 + dockerImageTag: 2.0.0 documentationUrl: https://docs.airbyte.com/integrations/sources/tiktok-marketing icon: tiktok.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 51e04cb4fe40f..358937a8c7672 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -14909,7 +14909,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-tiktok-marketing:1.0.1" +- dockerImage: "airbyte/source-tiktok-marketing:2.0.0" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/tiktok-marketing" changelogUrl: "https://docs.airbyte.com/integrations/sources/tiktok-marketing" diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/Dockerfile b/airbyte-integrations/connectors/source-tiktok-marketing/Dockerfile index 2e453506445a0..4602f3494a6f0 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/Dockerfile +++ b/airbyte-integrations/connectors/source-tiktok-marketing/Dockerfile @@ -32,5 +32,5 @@ COPY source_tiktok_marketing ./source_tiktok_marketing ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=1.0.1 +LABEL io.airbyte.version=2.0.0 LABEL io.airbyte.name=airbyte/source-tiktok-marketing diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/README.md b/airbyte-integrations/connectors/source-tiktok-marketing/README.md index a3864e25fcf47..09f3a7b0f733a 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/README.md +++ b/airbyte-integrations/connectors/source-tiktok-marketing/README.md @@ -79,7 +79,7 @@ docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integrat Make sure to familiarize yourself with [pytest test discovery](https://docs.pytest.org/en/latest/goodpractices.html#test-discovery) to know how your test files and methods should be named. First install test dependencies into your virtual environment: ``` -pip install .[tests] +pip install .'[tests]' ``` ### Unit Tests To run unit tests locally, from the connector directory run: diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/acceptance-test-config.yml b/airbyte-integrations/connectors/source-tiktok-marketing/acceptance-test-config.yml index 3f3067b67b13d..41d5419702846 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-tiktok-marketing/acceptance-test-config.yml @@ -3,97 +3,130 @@ connector_image: airbyte/source-tiktok-marketing:dev cache_discovered_catalog: False -tests: +acceptance_tests: spec: - - spec_path: "integration_tests/spec.json" - + tests: + - spec_path: "integration_tests/spec.json" connection: - - config_path: "secrets/prod_config.json" - status: "succeed" - - config_path: "secrets/prod_config_with_day_granularity.json" - status: "succeed" - - config_path: "secrets/prod_config_with_lifetime_granularity.json" - status: "succeed" - - config_path: "secrets/new_config_prod.json" - status: "succeed" - - config_path: "secrets/config_oauth.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" - - config_path: "integration_tests/invalid_config_access_token.json" - status: "failed" - - config_path: "integration_tests/invalid_config_oauth.json" - status: "failed" - + tests: + - config_path: "secrets/prod_config.json" + status: "succeed" + - config_path: "secrets/prod_config_with_day_granularity.json" + status: "succeed" + - config_path: "secrets/prod_config_with_lifetime_granularity.json" + status: "succeed" + - config_path: "secrets/new_config_prod.json" + status: "succeed" + - config_path: "secrets/config_oauth.json" + status: "succeed" + - config_path: "integration_tests/invalid_config.json" + status: "failed" + - config_path: "integration_tests/invalid_config_access_token.json" + status: "failed" + - config_path: "integration_tests/invalid_config_oauth.json" + status: "failed" discovery: - - config_path: "secrets/prod_config.json" - backward_compatibility_tests_config: - disable_for_version: "1.0.0" - - config_path: "secrets/prod_config_with_day_granularity.json" - backward_compatibility_tests_config: - disable_for_version: "1.0.0" - - config_path: "secrets/prod_config_with_lifetime_granularity.json" - backward_compatibility_tests_config: - disable_for_version: "1.0.0" - - config_path: "secrets/config.json" - backward_compatibility_tests_config: - disable_for_version: "1.0.0" - - config_path: "secrets/new_config_prod.json" - backward_compatibility_tests_config: - disable_for_version: "1.0.0" - - config_path: "secrets/config_oauth.json" - backward_compatibility_tests_config: - disable_for_version: "1.0.0" - + tests: + - config_path: "secrets/prod_config.json" + backward_compatibility_tests_config: + disable_for_version: "1.0.1" + - config_path: "secrets/prod_config_with_day_granularity.json" + backward_compatibility_tests_config: + disable_for_version: "1.0.1" + - config_path: "secrets/prod_config_with_lifetime_granularity.json" + backward_compatibility_tests_config: + disable_for_version: "1.0.1" + - config_path: "secrets/config.json" + backward_compatibility_tests_config: + disable_for_version: "1.0.1" + - config_path: "secrets/new_config_prod.json" + backward_compatibility_tests_config: + disable_for_version: "1.0.1" + - config_path: "secrets/config_oauth.json" + backward_compatibility_tests_config: + disable_for_version: "1.0.1" basic_read: - # New style streams (for >= 0.1.13): - - config_path: "secrets/prod_config.json" - configured_catalog_path: "integration_tests/streams_basic.json" - timeout_seconds: 1200 - - config_path: "secrets/prod_config.json" - configured_catalog_path: "integration_tests/streams_reports_daily.json" - timeout_seconds: 1200 - - config_path: "secrets/prod_config.json" - configured_catalog_path: "integration_tests/streams_reports_lifetime.json" - timeout_seconds: 1200 - # Old style streams with granularity config (for < 0.1.13) - # Note: not needed to be tested separately in full and incremental tests, because code of - # these streams is called directly in new style streams - - config_path: "secrets/prod_config_with_day_granularity.json" - configured_catalog_path: "integration_tests/streams_with_day_granularity.json" - timeout_seconds: 1200 - - config_path: "secrets/prod_config_with_lifetime_granularity.json" - configured_catalog_path: "integration_tests/streams_with_lifetime_granularity.json" - timeout_seconds: 1200 - - incremental: - - config_path: "secrets/prod_config.json" - configured_catalog_path: "integration_tests/streams_basic.json" - timeout_seconds: 7200 - future_state_path: "integration_tests/abnormal_state.json" - - config_path: "secrets/prod_config.json" - configured_catalog_path: "integration_tests/streams_reports_daily.json" - timeout_seconds: 7200 - future_state_path: "integration_tests/abnormal_state.json" - # LIFETIME granularity: does not support incremental sync - + tests: + - config_path: "secrets/config.json" + timeout_seconds: 1200 + empty_streams: + - name: ads_reports_hourly + bypass_reason: "Tested with daily granularity." + - name: ad_groups_reports_hourly + bypass_reason: "Tested with daily granularity." + - name: advertisers_reports_hourly + bypass_reason: "Tested with daily granularity." + - name: campaigns_reports_hourly + bypass_reason: "Tested with daily granularity." + - name: advertisers_reports + bypass_reason: "Stream was added during discover with granularity config. Will be tested below." + - name: advertisers_audience_reports + bypass_reason: "Stream was added during discover with granularity config. Will be tested below." + - name: campaigns_audience_reports_by_country + bypass_reason: "Stream was added during discover with granularity config. Will be tested below." + - name: ad_group_audience_reports + bypass_reason: "Stream was added during discover with granularity config. Will be tested below." + - name: ads_audience_reports + bypass_reason: "Stream was added during discover with granularity config. Will be tested below." + - name: ad_groups_reports + bypass_reason: "Stream was added during discover with granularity config. Will be tested below." + - name: ads_reports + bypass_reason: "Stream was added during discover with granularity config. Will be tested below." + - name: campaigns_reports + bypass_reason: "Stream was added during discover with granularity config. Will be tested below." + # Old style streams with granularity config (for < 0.1.13) + # Note: not needed to be tested separately in full and incremental tests, because code of + # these streams is called directly in new style streams + - config_path: "secrets/prod_config_with_day_granularity.json" + timeout_seconds: 1200 + empty_streams: + - name: ads_reports_lifetime + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: ad_groups_reports_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: advertisers_audience_reports_lifetime + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: campaigns_reports_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: ads_reports_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: advertisers_reports_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: ad_groups_reports_lifetime + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: campaigns_reports_hourly + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: ads_audience_reports_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: ads_audience_reports_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: ad_group_audience_reports_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: campaigns_reports_lifetime + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: ad_groups_reports_hourly + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: advertisers_reports_lifetime + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: campaigns_audience_reports_by_country_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: advertisers_audience_reports_daily + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: advertisers_reports_hourly + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." + - name: ads_reports_hourly + bypass_reason: "Stream was added during discover without granularity config. Was tested abowe." full_refresh: - - config_path: "secrets/prod_config.json" - configured_catalog_path: "integration_tests/streams_basic.json" - timeout_seconds: 7200 - ignored_fields: # Important: sometimes some streams does not return the same records in subsequent syncs - "ad_groups": - [ - "dayparting", - "enable_search_result", - "display_mode", - "schedule_infos", - "feed_type", - "status", - ] - - config_path: "secrets/prod_config.json" - configured_catalog_path: "integration_tests/streams_reports_daily.json" - timeout_seconds: 7200 - - config_path: "secrets/prod_config.json" - configured_catalog_path: "integration_tests/streams_reports_lifetime.json" - timeout_seconds: 7200 + tests: + - config_path: "secrets/prod_config_with_day_granularity.json" + configured_catalog_path: "integration_tests/configured_catalogs/configured_catalog.json" + timeout_seconds: 7200 + incremental: + tests: + - config_path: "secrets/prod_config_with_day_granularity.json" + configured_catalog_path: "integration_tests/configured_catalogs/configured_catalog_incremental.json" + timeout_seconds: 7200 + skip_comprehensive_incremental_tests: true + future_state: + future_state_path: "integration_tests/abnormal_state.json" + # LIFETIME granularity: does not support incremental sync diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/bootstrap.md b/airbyte-integrations/connectors/source-tiktok-marketing/bootstrap.md index 95bf87a6de807..0f295dea239f6 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/bootstrap.md +++ b/airbyte-integrations/connectors/source-tiktok-marketing/bootstrap.md @@ -11,3 +11,50 @@ The basic entity is 'advertiser'. All other streams use this required parameter Dependent streams have required parameter advertiser_id. As cursor field this connector uses "modify_time" values. But endpoints don't provide any mechanism for correct data filtering and sorting thus for incremental sync this connector tries to load all data and to validate a cursor field value on own side. + + + +`stream` method has granularity condition depend on that report streams supports by different connector version: +- For all version: + basic streams list: + * ad_groups + * ads + * campaigns + * advertisers +- for < 0.1.13 - expose report streams initialized with 'report_granularity' argument, like: + Example: + - AdsReports(report_granularity='DAILY') + - AdsReports(report_granularity='LIFETIME') + streams list: + * advertisers_reports + * advertisers_audience_reports + * campaigns_audience_reports_by_country + * ad_group_audience_reports + * ads_audience_reports + * ad_groups_reports + * ads_reports + * campaigns_reports + +- for >= 0.1.13 - expose report streams in format: _, like: + Example: + - AdsReportsDaily(Daily, AdsReports) + - AdsReportsLifetime(Lifetime, AdsReports) + streams: + * campaigns_audience_reports_by_country_daily + * campaigns_reports_daily + * advertisers_audience_reports_daily + * advertisers_reports_daily + * ad_group_audience_reports_daily + * ads_reports_lifetime + * advertiser_ids + * campaigns_reports_lifetime + * advertisers_audience_reports_lifetime + * ad_groups_reports_lifetime + * ad_groups_reports_daily + * advertisers_reports_lifetime + * ads_reports_daily + * ads_audience_reports_daily + * ads_reports_hourly + * ad_groups_reports_hourly + * advertisers_reports_hourly + * campaigns_reports_hourly diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/abnormal_state.json index a4cd2bd35c2e0..150067dcfcade 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/abnormal_state.json @@ -27,7 +27,7 @@ "stat_time_day": "2030-01-01", "dimensions": { "stat_time_day": "2030-01-01" } }, - "stream_descriptor": { "name": "ads_reports_daily" } + "stream_descriptor": { "name": "ads_reports" } } }, { @@ -37,7 +37,7 @@ "stat_time_day": "2030-01-01", "dimensions": { "stat_time_day": "2030-01-01" } }, - "stream_descriptor": { "name": "advertisers_reports_daily" } + "stream_descriptor": { "name": "advertisers_reports" } } }, { @@ -47,7 +47,7 @@ "stat_time_day": "2030-01-01", "dimensions": { "stat_time_day": "2030-01-01" } }, - "stream_descriptor": { "name": "ad_groups_reports_daily" } + "stream_descriptor": { "name": "ad_groups_reports" } } }, { @@ -57,7 +57,7 @@ "stat_time_day": "2030-01-01", "dimensions": { "stat_time_day": "2030-01-01" } }, - "stream_descriptor": { "name": "campaigns_reports_daily" } + "stream_descriptor": { "name": "campaigns_reports" } } }, { @@ -67,7 +67,7 @@ "stat_time_day": "2030-01-01", "dimensions": { "stat_time_day": "2030-01-01" } }, - "stream_descriptor": { "name": "ads_audience_reports_daily" } + "stream_descriptor": { "name": "ads_audience_reports" } } }, { @@ -77,7 +77,7 @@ "stat_time_day": "2030-01-01", "dimensions": { "stat_time_day": "2030-01-01" } }, - "stream_descriptor": { "name": "advertisers_audience_reports_daily" } + "stream_descriptor": { "name": "advertisers_audience_reports" } } }, { @@ -87,7 +87,7 @@ "stat_time_day": "2030-01-01", "dimensions": { "stat_time_day": "2030-01-01" } }, - "stream_descriptor": { "name": "ad_group_audience_reports_daily" } + "stream_descriptor": { "name": "ad_group_audience_reports" } } }, { @@ -98,7 +98,7 @@ "dimensions": { "stat_time_day": "2030-01-01" } }, "stream_descriptor": { - "name": "campaigns_audience_reports_by_country_daily" + "name": "campaigns_audience_reports_by_country" } } } diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/configured_catalog.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/configured_catalog.json new file mode 100644 index 0000000000000..60d68d22ee2d8 --- /dev/null +++ b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/configured_catalog.json @@ -0,0 +1,169 @@ +{ + "streams": [ + { + "stream": { + "name": "advertisers", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["id"]] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "append", + "primary_key": [["id"]] + }, + { + "stream": { + "name": "ads", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["modify_time"], + "source_defined_primary_key": [["ad_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["modify_time"], + "primary_key": [["ad_id"]] + }, + { + "stream": { + "name": "ad_groups", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["modify_time"], + "source_defined_primary_key": [["adgroup_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["modify_time"], + "primary_key": [["adgroup_id"]] + }, + { + "stream": { + "name": "campaigns", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["modify_time"], + "source_defined_primary_key": [["campaign_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "primary_key": [["campaign_id"]], + "cursor_field": ["modify_time"] + }, + { + "stream": { + "name": "ads_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["ad_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["ad_id"]] + }, + { + "stream": { + "name": "advertisers_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["advertiser_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["advertiser_id"]] + }, + { + "stream": { + "name": "ad_groups_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["adgroup_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["adgroup_id"]] + }, + { + "stream": { + "name": "campaigns_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["campaign_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["campaign_id"]] + }, + { + "stream": { + "name": "campaigns_audience_reports_by_country", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["campaign_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["campaign_id"]] + }, + { + "stream": { + "name": "ad_group_audience_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["adgroup_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["adgroup_id"]] + }, + { + "stream": { + "name": "ads_audience_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["ad_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["ad_id"]] + }, + { + "stream": { + "name": "advertisers_audience_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["advertiser_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["advertiser_id"]] + } + ] +} diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/configured_catalog_incremental.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/configured_catalog_incremental.json new file mode 100644 index 0000000000000..dfa741a1b48ba --- /dev/null +++ b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/configured_catalog_incremental.json @@ -0,0 +1,158 @@ +{ + "streams": [ + { + "stream": { + "name": "ads", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["modify_time"], + "source_defined_primary_key": [["ad_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["modify_time"], + "primary_key": [["ad_id"]] + }, + { + "stream": { + "name": "ad_groups", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["modify_time"], + "source_defined_primary_key": [["adgroup_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["modify_time"], + "primary_key": [["adgroup_id"]] + }, + { + "stream": { + "name": "campaigns", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["modify_time"], + "source_defined_primary_key": [["campaign_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "primary_key": [["campaign_id"]], + "cursor_field": ["modify_time"] + }, + { + "stream": { + "name": "ads_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["ad_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["ad_id"]] + }, + { + "stream": { + "name": "advertisers_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["advertiser_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["advertiser_id"]] + }, + { + "stream": { + "name": "ad_groups_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["adgroup_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["adgroup_id"]] + }, + { + "stream": { + "name": "campaigns_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["campaign_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["campaign_id"]] + }, + { + "stream": { + "name": "campaigns_audience_reports_by_country", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["campaign_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["campaign_id"]] + }, + { + "stream": { + "name": "ad_group_audience_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["adgroup_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["adgroup_id"]] + }, + { + "stream": { + "name": "ads_audience_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["ad_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["ad_id"]] + }, + { + "stream": { + "name": "advertisers_audience_reports", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["stat_time_day"], + "source_defined_primary_key": [["advertiser_id"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["stat_time_day"], + "primary_key": [["advertiser_id"]] + } + ] +} diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams.json similarity index 100% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams.json diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_all.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_all.json similarity index 99% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_all.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_all.json index dd4dbb4bc3b68..ec7b882e6234d 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_all.json +++ b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_all.json @@ -10,7 +10,6 @@ "sync_mode": "full_refresh", "destination_sync_mode": "append" }, - { "stream": { "name": "ads", @@ -47,7 +46,6 @@ "sync_mode": "full_refresh", "destination_sync_mode": "append" }, - { "stream": { "name": "ads_reports_daily", diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_all_incremental.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_all_incremental.json similarity index 100% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_all_incremental.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_all_incremental.json diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_audience_incremental.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_audience_incremental.json similarity index 100% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_audience_incremental.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_audience_incremental.json diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_basic.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_basic.json similarity index 100% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_basic.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_basic.json diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_reports_daily.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_reports_daily.json similarity index 100% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_reports_daily.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_reports_daily.json diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_reports_lifetime.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_reports_lifetime.json similarity index 100% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_reports_lifetime.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_reports_lifetime.json diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_with_day_granularity.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_with_day_granularity.json similarity index 100% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_with_day_granularity.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_with_day_granularity.json diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_with_lifetime_granularity.json b/airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_with_lifetime_granularity.json similarity index 100% rename from airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/streams_with_lifetime_granularity.json rename to airbyte-integrations/connectors/source-tiktok-marketing/integration_tests/configured_catalogs/streams_with_lifetime_granularity.json diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/schemas/audience_reports.json b/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/schemas/audience_reports.json index fcd9525995328..5c80cc93575b7 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/schemas/audience_reports.json +++ b/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/schemas/audience_reports.json @@ -47,7 +47,7 @@ "type": ["null", "string"] }, "tt_app_id": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "tt_app_name": { "type": ["null", "string"] @@ -62,64 +62,64 @@ "type": ["null", "string"] }, "spend": { - "type": ["null", "number"] + "type": ["null", "string"] }, "cpc": { - "type": ["null", "number"] + "type": ["null", "string"] }, "cpm": { - "type": ["null", "number"] + "type": ["null", "string"] }, "impressions": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "clicks": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "ctr": { - "type": ["null", "number"] + "type": ["null", "string"] }, "reach": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "cost_per_1000_reached": { - "type": ["null", "number"] + "type": ["null", "string"] }, "conversion": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "cost_per_conversion": { - "type": ["null", "number"] + "type": ["null", "string"] }, "conversion_rate": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_conversion": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "real_time_cost_per_conversion": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_conversion_rate": { - "type": ["null", "number"] + "type": ["null", "string"] }, "result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "cost_per_result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "result_rate": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_cost_per_result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_result_rate": { - "type": ["null", "number"] + "type": ["null", "string"] } } }, diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/schemas/basic_reports.json b/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/schemas/basic_reports.json index d09e10309a914..aa21b173b8b65 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/schemas/basic_reports.json +++ b/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/schemas/basic_reports.json @@ -62,82 +62,82 @@ "type": ["null", "string"] }, "spend": { - "type": ["null", "number"] + "type": ["null", "string"] }, "cash_spend": { - "type": ["null", "number"] + "type": ["null", "string"] }, "voucher_spend": { - "type": ["null", "number"] + "type": ["null", "string"] }, "cpc": { - "type": ["null", "number"] + "type": ["null", "string"] }, "cpm": { - "type": ["null", "number"] + "type": ["null", "string"] }, "impressions": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "clicks": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "ctr": { - "type": ["null", "number"] + "type": ["null", "string"] }, "reach": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "cost_per_1000_reached": { - "type": ["null", "number"] + "type": ["null", "string"] }, "conversion": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "cost_per_conversion": { - "type": ["null", "number"] + "type": ["null", "string"] }, "conversion_rate": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_conversion": { - "type": ["null", "integer"] + "type": ["null", "string"] }, "real_time_cost_per_conversion": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_conversion_rate": { - "type": ["null", "number"] + "type": ["null", "string"] }, "result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "cost_per_result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "result_rate": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_cost_per_result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "real_time_result_rate": { - "type": ["null", "number"] + "type": ["null", "string"] }, "secondary_goal_result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "cost_per_secondary_goal_result": { - "type": ["null", "number"] + "type": ["null", "string"] }, "secondary_goal_result_rate": { - "type": ["null", "number"] + "type": ["null", "string"] }, "frequency": { - "type": ["null", "number"] + "type": ["null", "string"] } } }, diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/unit_tests/unit_test.py b/airbyte-integrations/connectors/source-tiktok-marketing/unit_tests/unit_test.py index 41c3ef34391df..ec992b7f890b1 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/unit_tests/unit_test.py +++ b/airbyte-integrations/connectors/source-tiktok-marketing/unit_tests/unit_test.py @@ -16,7 +16,7 @@ from source_tiktok_marketing import SourceTiktokMarketing from source_tiktok_marketing.streams import Ads, Advertisers, JsonUpdatedState -SANDBOX_CONFIG_FILE = "secrets/config.json" +SANDBOX_CONFIG_FILE = "secrets/sandbox_config.json" PROD_CONFIG_FILE = "secrets/prod_config.json" diff --git a/docs/integrations/sources/tiktok-marketing.md b/docs/integrations/sources/tiktok-marketing.md index e648e19e30101..4eecbd41ee6fc 100644 --- a/docs/integrations/sources/tiktok-marketing.md +++ b/docs/integrations/sources/tiktok-marketing.md @@ -550,6 +550,7 @@ The connector is restricted by [requests limitation](https://ads.tiktok.com/mark | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------------------------------------------------| +| 2.0.0 | 2022-12-20 | [20415](https://github.com/airbytehq/airbyte/pull/20415) | Update schema types for `AudienceReports` and `BasicReports` streams. | | 1.0.1 | 2022-12-16 | [20598](https://github.com/airbytehq/airbyte/pull/20598) | Remove Audience Reports with Hourly granularity due to deprecated dimension. | | 1.0.0 | 2022-12-05 | [19758](https://github.com/airbytehq/airbyte/pull/19758) | Convert `mobile_app_id` from integer to string in AudienceReport streams. | | 0.1.17 | 2022-10-04 | [17557](https://github.com/airbytehq/airbyte/pull/17557) | Retry error 50002 | From 6a7410676941e26613592dd48c52a9f1cde33e29 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 26 Jan 2023 11:56:17 -0500 Subject: [PATCH 114/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=A7=B9=20Round=20c?= =?UTF-8?q?redits=20values=20on=20credit=20consumption=20page=20(#21873)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Round credits values in table and chart * round to two decimal places * get rid of styled component --- .../src/components/ui/BarChart/BarChart.tsx | 8 +++++- .../components/RemainingCredits.tsx | 6 ++++- .../UsagePerConnectionTable.module.scss | 10 +++++++ .../components/UsagePerConnectionTable.tsx | 27 +++++++------------ 4 files changed, 32 insertions(+), 19 deletions(-) create mode 100644 airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/UsagePerConnectionTable.module.scss diff --git a/airbyte-webapp/src/components/ui/BarChart/BarChart.tsx b/airbyte-webapp/src/components/ui/BarChart/BarChart.tsx index 10fee6ad8c71a..aa5d02d782da1 100644 --- a/airbyte-webapp/src/components/ui/BarChart/BarChart.tsx +++ b/airbyte-webapp/src/components/ui/BarChart/BarChart.tsx @@ -1,4 +1,5 @@ import React, { useMemo } from "react"; +import { FormattedNumber } from "react-intl"; import { Bar, BarChart as BasicBarChart, @@ -63,7 +64,12 @@ export const BarChart: React.FC = React.memo(({ data, legendLabel >
    - + ); }; From b7e3894fd70dc1a7bd58ac574a1c2d1629fff91e Mon Sep 17 00:00:00 2001 From: Cole Snodgrass Date: Thu, 26 Jan 2023 08:59:48 -0800 Subject: [PATCH 115/195] add perf feature-flag; ensure compatability with LaunchDarkly (LDv5) users (#21534) * init commit of flags.yml * add PerfBackgroundJsonValidation flag * update Multi contexts to support LDv5 * add test for no context behavior * allow ConfigFileClient to support a null Path * add comment * remove test that no longer applies * change factory to always return one of the implementations * add flags.yml config; quote ports * replace @Requires annotations with hand-checking * make the code easier to read --- airbyte-featureflag/src/main/kotlin/Client.kt | 44 +++++++++---- .../src/main/kotlin/Context.kt | 20 +++++- airbyte-featureflag/src/main/kotlin/Flags.kt | 2 + .../src/main/kotlin/config/Factory.kt | 31 +++++---- .../src/test/kotlin/ClientTest.kt | 32 +++++----- .../src/test/kotlin/ContextTest.kt | 63 ++++++++++++++++++- configs/flags.yml | 3 + docker-compose.yaml | 21 +++++-- 8 files changed, 158 insertions(+), 58 deletions(-) create mode 100644 configs/flags.yml diff --git a/airbyte-featureflag/src/main/kotlin/Client.kt b/airbyte-featureflag/src/main/kotlin/Client.kt index ddf92f665fc3d..c9a7758c7b20c 100644 --- a/airbyte-featureflag/src/main/kotlin/Client.kt +++ b/airbyte-featureflag/src/main/kotlin/Client.kt @@ -33,26 +33,30 @@ sealed interface FeatureFlagClient { } /** - * Config file based feature-flag client. Feature-flag are derived from a yaml config file. - * Also supports flags defined via environment-variables via the [EnvVar] class. + * Config file based feature-flag client. + * + * If no [config] is provided, will return the default state for each [Flag] requested. + * Supports [EnvVar] flags as well. * - * @param [config] the location of the yaml config file that contains the feature-flag definitions. - * The [config] will be watched for changes and the internal representation of the [config] will be updated to match. + * @param [config] optional location of the yaml config file that contains the feature-flag definitions. + * If the [config] is provided, it will be watched for changes and the internal representation of the [config] will be updated to match. */ -class ConfigFileClient(config: Path) : FeatureFlagClient { +class ConfigFileClient(config: Path?) : FeatureFlagClient { /** [flags] holds the mappings of the flag-name to the flag properties */ - private var flags: Map = readConfig(config) + private var flags: Map = config?.let { readConfig(it) } ?: mapOf() /** lock is used for ensuring access to the flags map is handled correctly when the map is being updated. */ private val lock = ReentrantReadWriteLock() init { - if (!config.isRegularFile()) { - throw IllegalArgumentException("config must reference a file") - } + config?.also { + if (!it.isRegularFile()) { + throw IllegalArgumentException("config must reference a file") + } - config.onChange { - lock.write { flags = readConfig(config) } + it.onChange { + lock.write { flags = readConfig(config) } + } } } @@ -175,9 +179,23 @@ private fun Path.onChange(block: () -> Unit) { * Once v6 is GA, this method would be removed and replaced with toLDContext. */ private fun Context.toLDUser(): LDUser = when (this) { - is Multi -> throw IllegalArgumentException("LDv5 does not support multiple contexts") - else -> { + is Multi -> { val builder = LDUser.Builder(key) + with(contexts) { + // Add each individual context's value as an attribute on the LDUser. + // This allows for more granular targeting of feature-flag rules that target LDUser types. + forEach { builder.custom(it.kind, it.key) } + + if (all { it.key == ANONYMOUS.toString() }) { + builder.anonymous(true) + } + } + builder.build() + } + + else -> { + // for LDv5 Users, add the context type and valid as a custom attribute + val builder = LDUser.Builder(key).apply { custom(kind, key) } if (this.key == ANONYMOUS.toString()) { builder.anonymous(true) } diff --git a/airbyte-featureflag/src/main/kotlin/Context.kt b/airbyte-featureflag/src/main/kotlin/Context.kt index 490e32580422b..236120aa85646 100644 --- a/airbyte-featureflag/src/main/kotlin/Context.kt +++ b/airbyte-featureflag/src/main/kotlin/Context.kt @@ -39,8 +39,24 @@ data class Multi(val contexts: List) : Context { /** This value MUST be "multi" to properly sync with the LaunchDarkly client. */ override val kind = "multi" - /** Multi contexts don't have a key */ - override val key = "" + /** + * Multi contexts don't have a key, however for LDv5 reasons, a key must exist. + * + * Determine what the key should be based on the priority order of: + * workspace -> connection -> source -> destination -> user + * taking the first value + * + * When LDv5 support is dropped replace this with: override vale key = "" + */ + override val key = when { + /** Intellij is going to recommend replacing .sortedBy with .minByOrNull, ignore this recommendation. */ + fetchContexts().isNotEmpty() -> fetchContexts().sortedBy { it.key }.first().key + fetchContexts().isNotEmpty() -> fetchContexts().sortedBy { it.key }.first().key + fetchContexts().isNotEmpty() -> fetchContexts().sortedBy { it.key }.first().key + fetchContexts().isNotEmpty() -> fetchContexts().sortedBy { it.key }.first().key + fetchContexts().isNotEmpty() -> fetchContexts().sortedBy { it.key }.first().key + else -> throw IllegalArgumentException("unsupported context: ${contexts.joinToString { it.kind }}") + } init { // ensure there are no nested contexts (i.e. this Multi does not contain another Multi) diff --git a/airbyte-featureflag/src/main/kotlin/Flags.kt b/airbyte-featureflag/src/main/kotlin/Flags.kt index bfc1dd0a6a820..db1f57184d023 100644 --- a/airbyte-featureflag/src/main/kotlin/Flags.kt +++ b/airbyte-featureflag/src/main/kotlin/Flags.kt @@ -16,6 +16,8 @@ object AutoDetectSchema : EnvVar(envVar = "AUTO_DETECT_SCHEMA") object NeedStateValidation : EnvVar(envVar = "NEED_STATE_VALIDATION") object ApplyFieldSelection : EnvVar(envVar = "APPLY_FIELD_SELECTION") +object PerfBackgroundJsonValidation : Temporary(key = "performance.backgroundJsonSchemaValidation") + object FieldSelectionWorkspaces : EnvVar(envVar = "FIELD_SELECTION_WORKSPACES") { override fun enabled(ctx: Context): Boolean { val enabledWorkspaceIds: List = fetcher(key) diff --git a/airbyte-featureflag/src/main/kotlin/config/Factory.kt b/airbyte-featureflag/src/main/kotlin/config/Factory.kt index d80a4673a13e7..8cf81ed5f6734 100644 --- a/airbyte-featureflag/src/main/kotlin/config/Factory.kt +++ b/airbyte-featureflag/src/main/kotlin/config/Factory.kt @@ -10,8 +10,6 @@ import io.airbyte.featureflag.FeatureFlagClient import io.airbyte.featureflag.LaunchDarklyClient import io.micronaut.context.annotation.Factory import io.micronaut.context.annotation.Property -import io.micronaut.context.annotation.Requirements -import io.micronaut.context.annotation.Requires import jakarta.inject.Singleton import java.nio.file.Path @@ -20,22 +18,23 @@ internal const val CONFIG_OSS_KEY = "airbyte.feature-flag.path" @Factory class Factory { - @Requirements( - Requires(property = CONFIG_LD_KEY), - Requires(missingProperty = CONFIG_OSS_KEY), - ) @Singleton - fun Cloud(@Property(name = CONFIG_LD_KEY) apiKey: String): FeatureFlagClient { - val client = LDClient(apiKey) - return LaunchDarklyClient(client) - } + fun featureFlagClient( + @Property(name = CONFIG_LD_KEY) apiKey: String, + @Property(name = CONFIG_OSS_KEY) configPath: String, + ): FeatureFlagClient { + // I cannot get the @Requires annotation to work to load one instance if a property is set and another instance if unset. + // Combined both cases together here instead resulting to manually doing the is-set check via the isNotBlank function. + if (apiKey.isNotBlank()) { + val client = LDClient(apiKey) + return LaunchDarklyClient(client) + } - @Requirements( - Requires(property = CONFIG_OSS_KEY), - Requires(missingProperty = CONFIG_LD_KEY), - ) - fun Platform(@Property(name = CONFIG_OSS_KEY) configPath: String): FeatureFlagClient { - val path = Path.of(configPath) + val path: Path? = if (configPath.isNotBlank()) { + Path.of(configPath) + } else { + null + } return ConfigFileClient(path) } } diff --git a/airbyte-featureflag/src/test/kotlin/ClientTest.kt b/airbyte-featureflag/src/test/kotlin/ClientTest.kt index dbbfc8ad55d34..4a538da7d5091 100644 --- a/airbyte-featureflag/src/test/kotlin/ClientTest.kt +++ b/airbyte-featureflag/src/test/kotlin/ClientTest.kt @@ -10,7 +10,6 @@ import io.airbyte.featureflag.EnvVar import io.airbyte.featureflag.FeatureFlagClient import io.airbyte.featureflag.Flag import io.airbyte.featureflag.LaunchDarklyClient -import io.airbyte.featureflag.Multi import io.airbyte.featureflag.Temporary import io.airbyte.featureflag.TestClient import io.airbyte.featureflag.User @@ -32,7 +31,7 @@ import kotlin.test.assertTrue class ConfigFileClient { @Test - fun `verify platform functionality`() { + fun `verify config-file functionality`() { val cfg = Path.of("src", "test", "resources", "feature-flags.yml") val client: FeatureFlagClient = ConfigFileClient(cfg) @@ -57,6 +56,19 @@ class ConfigFileClient { * * TODO: move this to a different test suite */ + @Test + fun `verify no-config file returns default flag state`() { + val client: FeatureFlagClient = ConfigFileClient(null) + val defaultFalse = Temporary(key = "default-false") + val defaultTrue = Temporary(key = "default-true", default = true) + + val ctx = Workspace("workspace") + with(client) { + assertTrue { enabled(defaultTrue, ctx) } + assertFalse { enabled(defaultFalse, ctx) } + } + } + @Test @Ignore fun `verify platform reload capabilities`() { @@ -161,22 +173,6 @@ class LaunchDarklyClient { } } - @Test - fun `verify multi-context is not supported`() { - /** - * TODO replace this test once LDv6 is being used and Context.toLDUser no longer exists, to verify Multi support - */ - val ldClient: LDClient = mockk() - every { ldClient.boolVariation(any(), any(), any()) } returns false - - val client: FeatureFlagClient = LaunchDarklyClient(ldClient) - val multiCtx = Multi(listOf(User("test"))) - - assertFailsWith { - client.enabled(Temporary(key = "test"), multiCtx) - } - } - @Test fun `verify env-var flag support`() { val ldClient: LDClient = mockk() diff --git a/airbyte-featureflag/src/test/kotlin/ContextTest.kt b/airbyte-featureflag/src/test/kotlin/ContextTest.kt index 042104d9d2207..d9f2c2ae9f928 100644 --- a/airbyte-featureflag/src/test/kotlin/ContextTest.kt +++ b/airbyte-featureflag/src/test/kotlin/ContextTest.kt @@ -9,18 +9,75 @@ import io.airbyte.featureflag.Source import io.airbyte.featureflag.User import io.airbyte.featureflag.Workspace import org.junit.jupiter.api.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith class MultiTest { @Test fun `verify data`() { - val user = User("user-id") + val source = Source("source") val workspace = Workspace("workspace") - Multi(listOf(user, workspace)).also { + Multi(listOf(source, workspace)).also { assert(it.kind == "multi") - assert(it.key == "") } } + + @Test + fun `Multi cannot contain another Multi`() { + val source = Source("source") + val workspace = Workspace("workspace") + val multi = Multi(listOf(source, workspace)) + + assertFailsWith { + Multi(listOf(source, workspace, multi)) + } + } + + @Test + fun `fetchContexts returns correct results`() { + val source1 = Source("source1") + val source2 = Source("source2") + val workspace = Workspace("workspace") + val multi = Multi(listOf(source1, source2, workspace)) + + assertEquals(listOf(source1, source2), multi.fetchContexts(), "two source contexts") + assertEquals(listOf(workspace), multi.fetchContexts(), "one workspace context") + assertEquals(listOf(), multi.fetchContexts(), "should be empty as no connection context was provided") + } + + @Test + fun `key set correctly based on contexts`() { + val workspace = Workspace("workspace") + val connection = Connection("connection") + val source = Source("source") + val destination = Destination("destination") + val user = User("user") + + Multi(listOf(user, destination, source, connection, workspace)).also { + assert(it.key == workspace.key) + } + Multi(listOf(user, destination, source, connection)).also { + assert(it.key == connection.key) + } + Multi(listOf(user, destination, source)).also { + assert(it.key == source.key) + } + Multi(listOf(user, destination)).also { + assert(it.key == destination.key) + } + Multi(listOf(user)).also { + assert(it.key == user.key) + } + } + + @Test + fun `no contexts is an exception`() { + assertFailsWith { + Multi(listOf()) + } + } + } class WorkspaceTest { diff --git a/configs/flags.yml b/configs/flags.yml new file mode 100644 index 0000000000000..b5cc273ca2706 --- /dev/null +++ b/configs/flags.yml @@ -0,0 +1,3 @@ +flags: + - name: performance.backgroundJsonSchemaValidation + enabled: true diff --git a/docker-compose.yaml b/docker-compose.yaml index f01aef60365f9..bc26a92668389 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -109,12 +109,14 @@ services: - MICRONAUT_ENVIRONMENTS=${WORKERS_MICRONAUT_ENVIRONMENTS} - APPLY_FIELD_SELECTION=${APPLY_FIELD_SELECTION} - FIELD_SELECTION_WORKSPACES=${FIELD_SELECTION_WORKSPACES} + configs: + - flags volumes: - /var/run/docker.sock:/var/run/docker.sock - workspace:${WORKSPACE_ROOT} - ${LOCAL_ROOT}:${LOCAL_ROOT} ports: - - 9000 + - "9000" networks: - airbyte_internal depends_on: @@ -155,7 +157,9 @@ services: - MICRONAUT_ENVIRONMENTS=${WORKERS_MICRONAUT_ENVIRONMENTS} - AUTO_DETECT_SCHEMA=${AUTO_DETECT_SCHEMA} ports: - - 8001 + - "8001" + configs: + - flags volumes: - workspace:${WORKSPACE_ROOT} - data:${CONFIG_ROOT} @@ -171,7 +175,7 @@ services: container_name: airbyte-webapp restart: unless-stopped ports: - - 80 + - "80" environment: - AIRBYTE_ROLE=${AIRBYTE_ROLE:-} - AIRBYTE_VERSION=${VERSION} @@ -222,6 +226,8 @@ services: - UPDATE_DEFINITIONS_CRON_ENABLED=${UPDATE_DEFINITIONS_CRON_ENABLED} - WORKSPACE_ROOT=${WORKSPACE_ROOT} - MICRONAUT_ENVIRONMENTS=${CRON_MICRONAUT_ENVIRONMENTS} + configs: + - flags volumes: - workspace:${WORKSPACE_ROOT} networks: @@ -248,9 +254,9 @@ services: container_name: airbyte-proxy restart: unless-stopped ports: - - 8000:8000 - - 8001:8001 - - 8003:8003 + - "8000:8000" + - "8001:8001" + - "8003:8003" environment: - BASIC_AUTH_USERNAME=${BASIC_AUTH_USERNAME} - BASIC_AUTH_PASSWORD=${BASIC_AUTH_PASSWORD} @@ -271,6 +277,9 @@ volumes: name: ${DATA_DOCKER_MOUNT} db: name: ${DB_DOCKER_MOUNT} +configs: + flags: + file: ./configs/flags.yml networks: airbyte_public: airbyte_internal: From 1475d6edeb8001998fcb54b861c915ff1364f61f Mon Sep 17 00:00:00 2001 From: Michael Siega <109092231+mfsiega-airbyte@users.noreply.github.com> Date: Thu, 26 Jan 2023 18:55:36 +0100 Subject: [PATCH 116/195] Msiega/log unexpected fields (#21922) * add logic to detect and log unexpected fields during a sync * include the list of unexpected fields with the logging * tolerate malformed records when we are checking for unexpected fields --- .../general/DefaultReplicationWorker.java | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DefaultReplicationWorker.java b/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DefaultReplicationWorker.java index fafacc8c42c81..a1ba66f544b6f 100644 --- a/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DefaultReplicationWorker.java +++ b/airbyte-commons-worker/src/main/java/io/airbyte/workers/general/DefaultReplicationWorker.java @@ -50,6 +50,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; @@ -336,9 +338,12 @@ private static Runnable readFromSrcAndWriteToDstRunnable(final AirbyteSource sou long recordsRead = 0L; final Map, Integer>> validationErrors = new HashMap<>(); final Map> streamToSelectedFields = new HashMap<>(); + final Map> streamToAllFields = new HashMap<>(); + final Map> unexpectedFields = new HashMap<>(); if (fieldSelectionEnabled) { populatedStreamToSelectedFields(catalog, streamToSelectedFields); } + populateStreamToAllFields(catalog, streamToAllFields); try { while (!cancelled.get() && !source.isFinished()) { final Optional messageOptional; @@ -353,7 +358,7 @@ private static Runnable readFromSrcAndWriteToDstRunnable(final AirbyteSource sou if (fieldSelectionEnabled) { filterSelectedFields(streamToSelectedFields, airbyteMessage); } - validateSchema(recordSchemaValidator, validationErrors, airbyteMessage); + validateSchema(recordSchemaValidator, streamToAllFields, unexpectedFields, validationErrors, airbyteMessage); final AirbyteMessage message = mapper.mapMessage(airbyteMessage); messageTracker.acceptFromSource(message); @@ -396,6 +401,12 @@ private static Runnable readFromSrcAndWriteToDstRunnable(final AirbyteSource sou metricReporter.trackSchemaValidationError(stream); }); } + unexpectedFields.forEach((stream, unexpectedFieldNames) -> { + if (!unexpectedFieldNames.isEmpty()) { + LOGGER.warn("Source {} has unexpected fields [{}] in stream {}", sourceId, String.join(", ", unexpectedFieldNames), stream); + // TODO(mfsiega-airbyte): publish this as a metric. + } + }); try { destination.notifyEndOfInput(); @@ -595,6 +606,8 @@ private List getFailureReasons(final AtomicReference> streamToAllFields, + Map> unexpectedFields, final Map, Integer>> validationErrors, final AirbyteMessage message) { if (message.getRecord() == null) { @@ -609,6 +622,9 @@ private static void validateSchema(final RecordSchemaValidator recordSchemaValid if (streamHasLessThenTenErrs) { try { recordSchemaValidator.validateSchema(record, messageStream); + final Set unexpectedFieldNames = unexpectedFields.getOrDefault(messageStream, new HashSet<>()); + populateUnexpectedFieldNames(record, streamToAllFields.get(messageStream), unexpectedFieldNames); + unexpectedFields.put(messageStream, unexpectedFieldNames); } catch (final RecordSchemaValidationException e) { final ImmutablePair, Integer> exceptionWithCount = validationErrors.get(messageStream); if (exceptionWithCount == null) { @@ -620,8 +636,22 @@ private static void validateSchema(final RecordSchemaValidator recordSchemaValid validationErrors.put(messageStream, new ImmutablePair<>(updatedErrorMessages, currentCount + 1)); } } + } + } + private static void populateUnexpectedFieldNames(AirbyteRecordMessage record, Set fieldsInCatalog, Set unexpectedFieldNames) { + final JsonNode data = record.getData(); + if (data.isObject()) { + Iterator fieldNamesInRecord = data.fieldNames(); + while (fieldNamesInRecord.hasNext()) { + final String fieldName = fieldNamesInRecord.next(); + if (!fieldsInCatalog.contains(fieldName)) { + unexpectedFieldNames.add(fieldName); + } + } } + // If it's not an object it's malformed, but we tolerate it here - it will be logged as an error by + // the validation. } /** @@ -646,6 +676,27 @@ private static void populatedStreamToSelectedFields(final ConfiguredAirbyteCatal } } + /** + * Populates a map for stream -> all the top-level fields in the catalog. Used to identify any + * unexpected top-level fields in the records. + * + * @param catalog + * @param streamToAllFields + */ + private static void populateStreamToAllFields(final ConfiguredAirbyteCatalog catalog, + final Map> streamToAllFields) { + for (final var s : catalog.getStreams()) { + final Set fields = new HashSet<>(); + final JsonNode propertiesNode = s.getStream().getJsonSchema().findPath("properties"); + if (propertiesNode.isObject()) { + propertiesNode.fieldNames().forEachRemaining((fieldName) -> fields.add(fieldName)); + } else { + throw new RuntimeException("No properties node in stream schema"); + } + streamToAllFields.put(AirbyteStreamNameNamespacePair.fromConfiguredAirbyteSteam(s), fields); + } + } + private static void filterSelectedFields(final Map> streamToSelectedFields, final AirbyteMessage airbyteMessage) { final AirbyteRecordMessage record = airbyteMessage.getRecord(); From 4068bbed7ec65ad19cbd7d509bc5e48f6296042b Mon Sep 17 00:00:00 2001 From: Alex Birdsall Date: Thu, 26 Jan 2023 10:20:12 -0800 Subject: [PATCH 117/195] :window: :art: Display free tag on release stage pills for users enrolled in the free connectors program (#21892) * Add FeatureItem.FreeConnectorProgram This is distinct from the LaunchDarkly-backed experiment we're referencing within `cloud/components/experiments/FreeConnectorProgram`: it's primary use is to prevent triggering cloud-only API calls in the OSS build. * Extract shareable FreeTag for various release stage pills It does seem as though we should consolidate on a single release stage pill implementation! That will have to wait for a follow-up, though. * Fix typo (s/inheret/inherit/) * Prefer useFeature to useFreeConnectorProgram in OSS components * Use TestWrapper for more future-proof test renders --- .../EntityTable/components/ConnectorCell.tsx | 2 +- .../ReleaseStageBadge.module.scss | 12 ---------- .../ReleaseStageBadge/ReleaseStageBadge.tsx | 19 +++++----------- .../src/hooks/services/Feature/constants.ts | 1 + .../src/hooks/services/Feature/types.tsx | 1 + .../FreeConnectorProgram/FreeTag.module.scss | 13 +++++++++++ .../FreeConnectorProgram/FreeTag.tsx | 22 +++++++++++++++++++ .../InlineEnrollmentCallout.tsx | 9 ++++++-- .../LargeEnrollmentCallout.tsx | 9 ++++++-- .../experiments/FreeConnectorProgram/index.ts | 2 ++ .../views/credits/CreditsPage/CreditsPage.tsx | 7 +++--- .../ConnectionPage/ConnectionPageTitle.tsx | 9 ++++---- .../ConnectorDefinitionTypeControl.tsx | 5 +++++ .../FrequentlyUsedConnectorsCard.test.tsx | 8 +++---- 14 files changed, 75 insertions(+), 44 deletions(-) create mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/FreeTag.module.scss create mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/FreeTag.tsx create mode 100644 airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/index.ts diff --git a/airbyte-webapp/src/components/EntityTable/components/ConnectorCell.tsx b/airbyte-webapp/src/components/EntityTable/components/ConnectorCell.tsx index c9515c835984d..d46b22afd559b 100644 --- a/airbyte-webapp/src/components/EntityTable/components/ConnectorCell.tsx +++ b/airbyte-webapp/src/components/EntityTable/components/ConnectorCell.tsx @@ -12,7 +12,7 @@ interface IProps { const Content = styled.div<{ enabled?: boolean }>` display: flex; align-items: center; - color: ${({ theme, enabled }) => (!enabled ? theme.greyColor40 : "inheret")}; + color: ${({ theme, enabled }) => (!enabled ? theme.greyColor40 : "inherit")}; font-weight: 500; `; diff --git a/airbyte-webapp/src/components/ReleaseStageBadge/ReleaseStageBadge.module.scss b/airbyte-webapp/src/components/ReleaseStageBadge/ReleaseStageBadge.module.scss index f86b7fae4e3a7..d4018cc7676c3 100644 --- a/airbyte-webapp/src/components/ReleaseStageBadge/ReleaseStageBadge.module.scss +++ b/airbyte-webapp/src/components/ReleaseStageBadge/ReleaseStageBadge.module.scss @@ -16,16 +16,4 @@ &--small { font-size: 8px; } - - &--contains-tag { - padding-right: 2px; - } -} - -.freeTag { - background-color: colors.$green-300; - color: colors.$white; - border-radius: variables.$border-radius-pill; - padding: 2px 5px; - margin-left: 2px; } diff --git a/airbyte-webapp/src/components/ReleaseStageBadge/ReleaseStageBadge.tsx b/airbyte-webapp/src/components/ReleaseStageBadge/ReleaseStageBadge.tsx index c1ad9e6aa5dc5..3f1b24c01d1b5 100644 --- a/airbyte-webapp/src/components/ReleaseStageBadge/ReleaseStageBadge.tsx +++ b/airbyte-webapp/src/components/ReleaseStageBadge/ReleaseStageBadge.tsx @@ -1,10 +1,12 @@ import classNames from "classnames"; -import { FormattedMessage, useIntl } from "react-intl"; +import { FormattedMessage } from "react-intl"; import { GAIcon } from "components/icons/GAIcon"; import { Tooltip } from "components/ui/Tooltip"; import { ReleaseStage } from "core/request/AirbyteClient"; +import { useFeature, FeatureItem } from "hooks/services/Feature"; +import { FreeTag } from "packages/cloud/components/experiments/FreeConnectorProgram"; import styles from "./ReleaseStageBadge.module.scss"; @@ -15,16 +17,10 @@ interface ReleaseStageBadgeProps { * Whether to show a detailed message via a tooltip. If not specified, will be {@code true}. */ tooltip?: boolean; - showFreeTag?: boolean; } -export const ReleaseStageBadge: React.FC = ({ - stage, - small, - tooltip = true, - showFreeTag = false, -}) => { - const { formatMessage } = useIntl(); +export const ReleaseStageBadge: React.FC = ({ stage, small, tooltip = true }) => { + const fcpEnabled = useFeature(FeatureItem.FreeConnectorProgram); if (!stage) { return null; @@ -37,13 +33,10 @@ export const ReleaseStageBadge: React.FC = ({
    - {showFreeTag && ( - {formatMessage({ id: "freeConnectorProgram.releaseStageBadge.free" })} - )} + {fcpEnabled && }
    ); diff --git a/airbyte-webapp/src/hooks/services/Feature/constants.ts b/airbyte-webapp/src/hooks/services/Feature/constants.ts index 05d47cda60840..c847fb35267ef 100644 --- a/airbyte-webapp/src/hooks/services/Feature/constants.ts +++ b/airbyte-webapp/src/hooks/services/Feature/constants.ts @@ -15,4 +15,5 @@ export const defaultCloudFeatures = [ FeatureItem.AllowSync, FeatureItem.AllowChangeDataGeographies, FeatureItem.AllowDBTCloudIntegration, + FeatureItem.FreeConnectorProgram, ]; diff --git a/airbyte-webapp/src/hooks/services/Feature/types.tsx b/airbyte-webapp/src/hooks/services/Feature/types.tsx index e6dac29a8fb1a..2f2729f3bfdb3 100644 --- a/airbyte-webapp/src/hooks/services/Feature/types.tsx +++ b/airbyte-webapp/src/hooks/services/Feature/types.tsx @@ -13,6 +13,7 @@ export enum FeatureItem { AllowSync = "ALLOW_SYNC", AllowChangeDataGeographies = "ALLOW_CHANGE_DATA_GEOGRAPHIES", AllowSyncSubOneHourCronExpressions = "ALLOW_SYNC_SUB_ONE_HOUR_CRON_EXPRESSIONS", + FreeConnectorProgram = "FREE_CONNECTOR_PROGRAM", } export type FeatureSet = Partial>; diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/FreeTag.module.scss b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/FreeTag.module.scss new file mode 100644 index 0000000000000..285e97aeb6902 --- /dev/null +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/FreeTag.module.scss @@ -0,0 +1,13 @@ +@use "scss/colors"; +@use "scss/variables"; + +.freeTag { + background-color: colors.$green-300; + color: colors.$white; + border-radius: variables.$border-radius-pill; + padding: 2px 5px; + + // margin: 0 2px; + margin-left: 2px; + margin-right: -4px; +} diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/FreeTag.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/FreeTag.tsx new file mode 100644 index 0000000000000..5dbbe76510254 --- /dev/null +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/FreeTag.tsx @@ -0,0 +1,22 @@ +import { useIntl } from "react-intl"; + +import { ReleaseStage } from "core/request/AirbyteClient"; + +import styles from "./FreeTag.module.scss"; +import { useFreeConnectorProgram } from "./hooks/useFreeConnectorProgram"; + +interface FreeTagProps { + releaseStage: ReleaseStage; +} + +// A tag labeling a release stage pill as free. Defined here for easy reuse between the +// two release stage pill implementations (which should likely be refactored!) +export const FreeTag: React.FC = ({ releaseStage }) => { + const { enrollmentStatusQuery } = useFreeConnectorProgram(); + const { isEnrolled } = enrollmentStatusQuery.data || {}; + const { formatMessage } = useIntl(); + + return isEnrolled && ["alpha", "beta"].includes(releaseStage) ? ( + {formatMessage({ id: "freeConnectorProgram.releaseStageBadge.free" })} + ) : null; +}; diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout.tsx index 09a425906a9da..b0200005b5864 100644 --- a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout.tsx +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout.tsx @@ -18,9 +18,14 @@ export const EnrollLink: React.FC> = ({ children }) = ); }; export const InlineEnrollmentCallout: React.FC = () => { - const { userDidEnroll } = useFreeConnectorProgram(); + const { userDidEnroll, enrollmentStatusQuery } = useFreeConnectorProgram(); + const { showEnrollmentUi } = enrollmentStatusQuery.data || {}; - return userDidEnroll ? null : ( + if (userDidEnroll || !showEnrollmentUi) { + return null; + } + + return ( { const { showEnrollmentModal } = useShowEnrollmentModal(); - const { userDidEnroll } = useFreeConnectorProgram(); + const { userDidEnroll, enrollmentStatusQuery } = useFreeConnectorProgram(); + const { showEnrollmentUi } = enrollmentStatusQuery.data || {}; - return userDidEnroll ? null : ( + if (userDidEnroll || !showEnrollmentUi) { + return null; + } + + return ( diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/index.ts b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/index.ts new file mode 100644 index 0000000000000..b2bbcbd0ed5b2 --- /dev/null +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/index.ts @@ -0,0 +1,2 @@ +export * from "./hooks/useFreeConnectorProgram"; +export * from "./FreeTag"; diff --git a/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/CreditsPage.tsx b/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/CreditsPage.tsx index 447d98f5b8760..d3e89aa734cff 100644 --- a/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/CreditsPage.tsx +++ b/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/CreditsPage.tsx @@ -8,7 +8,7 @@ import { Spinner } from "components/ui/Spinner"; import { Text } from "components/ui/Text"; import { PageTrackingCodes, useTrackPage } from "hooks/services/Analytics"; -import { useFreeConnectorProgram } from "packages/cloud/components/experiments/FreeConnectorProgram/hooks/useFreeConnectorProgram"; +import { useFeature, FeatureItem } from "hooks/services/Feature"; import { LargeEnrollmentCallout } from "packages/cloud/components/experiments/FreeConnectorProgram/LargeEnrollmentCallout"; import { useAuthService } from "packages/cloud/services/auth/AuthService"; @@ -20,8 +20,7 @@ import styles from "./CreditsPage.module.scss"; const CreditsPage: React.FC = () => { const { emailVerified } = useAuthService(); useTrackPage(PageTrackingCodes.CREDITS); - const { enrollmentStatusQuery } = useFreeConnectorProgram(); - const { showEnrollmentUi } = enrollmentStatusQuery.data || {}; + const fcpEnabled = useFeature(FeatureItem.FreeConnectorProgram); return ( {
    {!emailVerified && } - {showEnrollmentUi && } + {fcpEnabled && } diff --git a/airbyte-webapp/src/pages/connections/ConnectionPage/ConnectionPageTitle.tsx b/airbyte-webapp/src/pages/connections/ConnectionPage/ConnectionPageTitle.tsx index 970434ad34231..187b2770e0c10 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionPage/ConnectionPageTitle.tsx +++ b/airbyte-webapp/src/pages/connections/ConnectionPage/ConnectionPageTitle.tsx @@ -13,7 +13,7 @@ import { Text } from "components/ui/Text"; import { ConnectionStatus } from "core/request/AirbyteClient"; import { useConnectionEditService } from "hooks/services/ConnectionEdit/ConnectionEditService"; -import { useFreeConnectorProgram } from "packages/cloud/components/experiments/FreeConnectorProgram/hooks/useFreeConnectorProgram"; +import { useFeature, FeatureItem } from "hooks/services/Feature"; import { InlineEnrollmentCallout } from "packages/cloud/components/experiments/FreeConnectorProgram/InlineEnrollmentCallout"; import styles from "./ConnectionPageTitle.module.scss"; @@ -26,9 +26,6 @@ export const ConnectionPageTitle: React.FC = () => { const { connection } = useConnectionEditService(); - const { enrollmentStatusQuery } = useFreeConnectorProgram(); - const { showEnrollmentUi } = enrollmentStatusQuery.data || {}; - const steps = useMemo(() => { const steps = [ { @@ -65,6 +62,8 @@ export const ConnectionPageTitle: React.FC = () => { [navigate] ); + const fcpEnabled = useFeature(FeatureItem.FreeConnectorProgram); + return (
    {connection.status === ConnectionStatus.deprecated && ( @@ -80,7 +79,7 @@ export const ConnectionPageTitle: React.FC = () => {
    - {showEnrollmentUi && } + {fcpEnabled && }
    diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorDefinitionTypeControl.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorDefinitionTypeControl.tsx index c53e7f8f0ad2d..2286fe14d5c73 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorDefinitionTypeControl.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorDefinitionTypeControl.tsx @@ -22,8 +22,10 @@ import { ConnectorDefinition } from "core/domain/connector"; import { ReleaseStage } from "core/request/AirbyteClient"; import { useAvailableConnectorDefinitions } from "hooks/domain/connector/useAvailableConnectorDefinitions"; import { useExperiment } from "hooks/services/Experiment"; +import { useFeature, FeatureItem } from "hooks/services/Feature"; import { useModalService } from "hooks/services/Modal"; import { useCurrentWorkspace } from "hooks/services/useWorkspace"; +import { FreeTag } from "packages/cloud/components/experiments/FreeConnectorProgram"; import { useDocumentationPanelContext } from "views/Connector/ConnectorDocumentationLayout/DocumentationPanelContext"; import RequestConnectorModal from "views/Connector/RequestConnectorModal"; @@ -51,6 +53,8 @@ const ConnectorList: React.FC = ({ releaseStage }) => { + const fcpEnabled = useFeature(FeatureItem.FreeConnectorProgram); + if (!releaseStage) { return null; } @@ -62,6 +66,7 @@ const StageLabel: React.FC<{ releaseStage?: ReleaseStage }> = ({ releaseStage }) return (
    + {fcpEnabled && }
    ); }; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/FrequentlyUsedConnectorsCard.test.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/FrequentlyUsedConnectorsCard.test.tsx index 77a1df94157f3..1dcb4804e7615 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/FrequentlyUsedConnectorsCard.test.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/FrequentlyUsedConnectors/FrequentlyUsedConnectorsCard.test.tsx @@ -1,16 +1,14 @@ import { fireEvent, render, waitFor } from "@testing-library/react"; -import { IntlProvider } from "react-intl"; import { mockDestinationsData } from "test-utils/mock-data/mockFrequentlyUsedDestinations"; - -import en from "locales/en.json"; +import { TestWrapper } from "test-utils/testutils"; import { FrequentlyUsedConnectorsCard, FrequentlyUsedConnectorsCardProps } from "./FrequentlyUsedConnectorsCard"; const renderFrequentlyUsedConnectorsComponent = (props: FrequentlyUsedConnectorsCardProps) => render( - + - + ); describe("", () => { From fa24ad6fb624a59413dded33ccc0257cb9f98105 Mon Sep 17 00:00:00 2001 From: Jimmy Ma Date: Thu, 26 Jan 2023 11:19:05 -0800 Subject: [PATCH 118/195] Add WellKnownTypes to the Orchestrator (#21897) * Add WellKnownTypes to the Orchestrator * Add comments --- airbyte-container-orchestrator/Dockerfile | 3 +++ airbyte-container-orchestrator/build.gradle | 16 ++++++++++++++++ airbyte-workers/build.gradle | 2 ++ 3 files changed, 21 insertions(+) diff --git a/airbyte-container-orchestrator/Dockerfile b/airbyte-container-orchestrator/Dockerfile index 7b0ef96f0197e..107ff2405590a 100644 --- a/airbyte-container-orchestrator/Dockerfile +++ b/airbyte-container-orchestrator/Dockerfile @@ -18,6 +18,9 @@ ENV AIRBYTE_ENTRYPOINT "/app/${APPLICATION}-${VERSION}/bin/${APPLICATION}" WORKDIR /app +# Grab well-known types file +COPY WellKnownTypes.json /app + # Move orchestrator app ADD bin/${APPLICATION}-${VERSION}.tar /app diff --git a/airbyte-container-orchestrator/build.gradle b/airbyte-container-orchestrator/build.gradle index 55e9bbd3bd381..83c31305ac3e7 100644 --- a/airbyte-container-orchestrator/build.gradle +++ b/airbyte-container-orchestrator/build.gradle @@ -1,3 +1,6 @@ +import groovy.json.JsonBuilder +import groovy.yaml.YamlSlurper + plugins { id 'application' } @@ -54,6 +57,19 @@ application { applicationDefaultJvmArgs = ['-XX:+ExitOnOutOfMemoryError', '-XX:MaxRAMPercentage=75.0'] } +// Duplicated from :airbyte-worker, eventually, this should be handled in :airbyte-protocol +task generateWellKnownTypes() { + doLast { + def wellKnownTypesYaml = project(':airbyte-protocol').file('protocol-models/src/main/resources/airbyte_protocol/well_known_types.yaml').text + def parsedYaml = new YamlSlurper().parseText(wellKnownTypesYaml) + def wellKnownTypesJson = new JsonBuilder(parsedYaml).toPrettyString() + def targetFile = project.file("build/docker/WellKnownTypes.json") + targetFile.getParentFile().mkdirs() + targetFile.text = wellKnownTypesJson + } +} + tasks.named("buildDockerImage") { dependsOn copyGeneratedTar + dependsOn generateWellKnownTypes } diff --git a/airbyte-workers/build.gradle b/airbyte-workers/build.gradle index b719fcd6bc954..8069f28ef6c67 100644 --- a/airbyte-workers/build.gradle +++ b/airbyte-workers/build.gradle @@ -130,6 +130,7 @@ task cloudStorageIntegrationTest(type: Test) { } } +// Duplicated in :airbyte-container-orchestrator, eventually, this should be handled in :airbyte-protocol task generateWellKnownTypes() { doLast { def wellKnownTypesYaml = project(':airbyte-protocol').file('protocol-models/src/main/resources/airbyte_protocol/well_known_types.yaml').text @@ -143,6 +144,7 @@ task generateWellKnownTypes() { tasks.named("buildDockerImage") { dependsOn copyGeneratedTar + dependsOn generateWellKnownTypes } // Ideally, we would have buildDockerImage depend on generateWellKnownTypes From 1693cab6c1e939107295847cbb4a0cbf8e25ff7b Mon Sep 17 00:00:00 2001 From: Denys Davydov Date: Thu, 26 Jan 2023 21:28:59 +0200 Subject: [PATCH 119/195] =?UTF-8?q?=F0=9F=90=9BSource=20Amazon=20Seller=20?= =?UTF-8?q?Partner:=20Implement=20slicing=20for=20report=20streams=20(#164?= =?UTF-8?q?30)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #257 source amazon seller partner: implement slicing for report streams * #257 source amazon seller partner: upd changelog * #257 source amazon seller partner: fix SATs * #257 source amazon seller partner: fix SATs * Validate if report_options empty * Fixed SAT * Disable high strictness level * Enable connector on cloud * Increase max period in days * Increase max period in days * Updated docs * retur connector to list with hiden connectors * generate definitions Co-authored-by: Serhii Lazebnyi <53845333+lazebnyi@users.noreply.github.com> Co-authored-by: Serhii Lazebnyi --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 10 +- .../source-amazon-seller-partner/Dockerfile | 3 +- .../source-amazon-seller-partner/README.md | 2 +- .../acceptance-test-config.yml | 219 +++++----- .../integration_tests/configured_catalog.json | 54 +-- .../configured_catalog_browse_tree_data.json | 95 +---- ...nt_customer_shipment_replacement_data.json | 55 +-- .../configured_catalog_incremental.json | 16 + .../configured_catalog_restock_inventory.json | 96 +---- .../integration_tests/expected_records.jsonl | 40 ++ .../integration_tests/future_state.json | 18 +- .../integration_tests/spec.json | 5 +- .../GET_MERCHANT_LISTINGS_ALL_DATA.json | 6 +- .../schemas/GET_XML_BROWSE_TREE_DATA.json | 10 +- .../schemas/ListFinancialEvents.json | 386 ++++++++++++------ .../source_amazon_seller_partner/source.py | 4 - .../source_amazon_seller_partner/spec.py | 8 +- .../source_amazon_seller_partner/streams.py | 125 ++---- .../sources/amazon-seller-partner.md | 4 + 20 files changed, 514 insertions(+), 644 deletions(-) create mode 100644 airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_incremental.json create mode 100644 airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/expected_records.jsonl diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index d1230378d454f..96450bff5b6b1 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -65,7 +65,7 @@ - name: Amazon Seller Partner sourceDefinitionId: e55879a8-0ef8-4557-abcf-ab34c53ec460 dockerRepository: airbyte/source-amazon-seller-partner - dockerImageTag: 0.2.30 + dockerImageTag: 0.2.31 sourceType: api documentationUrl: https://docs.airbyte.com/integrations/sources/amazon-seller-partner icon: amazonsellerpartner.svg diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 358937a8c7672..90ce5e066b360 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -922,7 +922,7 @@ type: "string" path_in_connector_config: - "client_secret" -- dockerImage: "airbyte/source-amazon-seller-partner:0.2.30" +- dockerImage: "airbyte/source-amazon-seller-partner:0.2.31" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/amazon-seller-partner" changelogUrl: "https://docs.airbyte.com/integrations/sources/amazon-seller-partner" @@ -1003,10 +1003,14 @@ description: "Will be used for stream slicing for initial full_refresh sync\ \ when no updated state is present for reports that support sliced incremental\ \ sync." - default: 30 + default: 90 + maximum: 90 examples: + - "1" + - "10" - "30" - - "365" + - "60" + - "90" order: 10 type: "integer" report_options: diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/Dockerfile b/airbyte-integrations/connectors/source-amazon-seller-partner/Dockerfile index 5431001a6c31b..649f9f2521652 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/Dockerfile +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/Dockerfile @@ -12,5 +12,6 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.30 + +LABEL io.airbyte.version=0.2.31 LABEL io.airbyte.name=airbyte/source-amazon-seller-partner diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/README.md b/airbyte-integrations/connectors/source-amazon-seller-partner/README.md index 97ab0ed69a220..3f19a0c98a5ad 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/README.md +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/README.md @@ -77,7 +77,7 @@ docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integrat Make sure to familiarize yourself with [pytest test discovery](https://docs.pytest.org/en/latest/goodpractices.html#test-discovery) to know how your test files and methods should be named. First install test dependencies into your virtual environment: ``` -pip install .[tests] +pip install .'[tests]' ``` ### Unit Tests To run unit tests locally, from the connector directory run: diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/acceptance-test-config.yml b/airbyte-integrations/connectors/source-amazon-seller-partner/acceptance-test-config.yml index 135f5de1a6b42..9ff79ab2c2339 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/acceptance-test-config.yml @@ -1,100 +1,127 @@ connector_image: airbyte/source-amazon-seller-partner:dev -tests: +acceptance_tests: spec: - - spec_path: "integration_tests/spec.json" + tests: + - spec_path: "integration_tests/spec.json" + backward_compatibility_tests_config: + disable_for_version: "0.2.30" connection: - # - config_path: "secrets/config.json" - # status: "succeed" - # timeout_seconds: 60 - - config_path: "integration_tests/invalid_config.json" - status: "failed" - timeout_seconds: 60 + tests: + - config_path: "secrets/config.json" + status: "succeed" + timeout_seconds: 60 + - config_path: "integration_tests/invalid_config.json" + status: "failed" + timeout_seconds: 60 discovery: - - config_path: "secrets/config.json" -# TODO: uncomment when at least one record exist -# basic_read: -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog.json" -# empty_streams: -# [ -# "Orders", -# "GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL", -# "GET_MERCHANT_LISTINGS_ALL_DATA", -# "GET_FBA_INVENTORY_AGED_DATA", -# "GET_AMAZON_FULFILLED_SHIPMENTS_DATA_GENERAL", -# "GET_FLAT_FILE_OPEN_LISTINGS_DATA", -# "GET_FBA_FULFILLMENT_REMOVAL_ORDER_DETAIL_DATA", -# "GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA", -# "GET_VENDOR_INVENTORY_HEALTH_AND_PLANNING_REPORT", -# "VendorDirectFulfillmentShipping" -# ] -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_brand_analytics_alternate_purchase.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_brand_analytics_item_comparison.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_brand_analytics_market_basket.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_brand_analytics_repeat_purchase.json.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_brand_analytics_search_terms.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_fba_fulfillment_customer_shipment_replacement_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_browse_tree_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_restock_inventory.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_estimated_fba_fees_txt_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_fulfillment_current_inventory_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_fulfillment_customer_shipment_promotion_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_fulfillment_inventory_adjustments_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_fulfillment_inventory_receipts_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_fulfillment_inventory_summary_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_fulfillment_monthly_inventory_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_myi_unsuppressed_inventory_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_sns_forecast_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_sns_performance_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_flat_file_archived_orders_data_by_order_date.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_flat_file_returns_data_by_return_date.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_merchant_cancelled_listings_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_merchant_listings_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_merchant_listings_data_back_compat.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_merchants_listings_fyp_report.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_merchant_listings_inactive_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_stranded_inventory_ui_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_xml_all_orders_data_by_order_date_general.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_ledger_detail_view_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_fba_inventory_planning_data.json" -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog_get_ledger_summary_view_data.json" -# TODO: uncomment when Orders (or any other incremental) stream is filled with data -# incremental: -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog.json" -# future_state_path: "integration_tests/future_state.json" -# cursor_paths: -# Orders: ["LastUpdateDate"] -# full_refresh: -# - config_path: "secrets/config.json" -# configured_catalog_path: "integration_tests/configured_catalog.json" + tests: + - config_path: "secrets/config.json" + backward_compatibility_tests_config: + disable_for_version: "0.2.30" + basic_read: + tests: + - config_path: "secrets/config.json" + timeout_seconds: 2400 + expect_records: + path: "integration_tests/expected_records.jsonl" + extra_fields: no + exact_order: no + extra_records: yes + # TODO: Add records for empty streams - https://github.com/airbytehq/airbyte/issues/21555 + empty_streams: + - name: Orders + bypass_reason: "no records" + - name: GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL + bypass_reason: "no records" + - name: GET_AMAZON_FULFILLED_SHIPMENTS_DATA_GENERAL + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_REMOVAL_ORDER_DETAIL_DATA + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA + bypass_reason: "no records" + - name: GET_SELLER_FEEDBACK_DATA + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_CUSTOMER_SHIPMENT_REPLACEMENT_DATA + bypass_reason: "no records" + - name: GET_RESTOCK_INVENTORY_RECOMMENDATIONS_REPORT + bypass_reason: "no records" + - name: GET_LEDGER_DETAIL_VIEW_DATA + bypass_reason: "no records" + - name: GET_AFN_INVENTORY_DATA_BY_COUNTRY + bypass_reason: "no records" + - name: GET_FLAT_FILE_RETURNS_DATA_BY_RETURN_DATE + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_MONTHLY_INVENTORY_DATA + bypass_reason: "no records" + - name: GET_VENDOR_SALES_REPORT + bypass_reason: "no records" + - name: GET_BRAND_ANALYTICS_MARKET_BASKET_REPORT + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA + bypass_reason: "no records" + - name: GET_FBA_SNS_FORECAST_DATA + bypass_reason: "no records" + - name: GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_INVENTORY_SUMMARY_DATA + bypass_reason: "no records" + - name: GET_BRAND_ANALYTICS_ITEM_COMPARISON_REPORT + bypass_reason: "no records" + - name: GET_AFN_INVENTORY_DATA + bypass_reason: "no records" + - name: GET_MERCHANT_CANCELLED_LISTINGS_DATA + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_CUSTOMER_SHIPMENT_PROMOTION_DATA + bypass_reason: "no records" + - name: GET_LEDGER_SUMMARY_VIEW_DATA + bypass_reason: "no records" + - name: GET_BRAND_ANALYTICS_ALTERNATE_PURCHASE_REPORT + bypass_reason: "no records" + - name: GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_INVENTORY_ADJUSTMENTS_DATA + bypass_reason: "no records" + - name: GET_MERCHANT_LISTINGS_DATA_BACK_COMPAT + bypass_reason: "no records" + - name: GET_BRAND_ANALYTICS_REPEAT_PURCHASE_REPORT + bypass_reason: "no records" + - name: VendorDirectFulfillmentShipping + bypass_reason: "no records" + - name: GET_FLAT_FILE_ARCHIVED_ORDERS_DATA_BY_ORDER_DATE + bypass_reason: "no records" + - name: GET_VENDOR_INVENTORY_REPORT + bypass_reason: "no records" + - name: GET_FBA_SNS_PERFORMANCE_DATA + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_CURRENT_INVENTORY_DATA + bypass_reason: "no records" + - name: GET_FBA_ESTIMATED_FBA_FEES_TXT_DATA + bypass_reason: "no records" + - name: GET_FBA_INVENTORY_PLANNING_DATA + bypass_reason: "no records" + - name: GET_FBA_STORAGE_FEE_CHARGES_DATA + bypass_reason: "no records" + - name: GET_FLAT_FILE_ALL_ORDERS_DATA_BY_LAST_UPDATE_GENERAL + bypass_reason: "no records" + - name: GET_SALES_AND_TRAFFIC_REPORT + bypass_reason: "no records" + - name: GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA + bypass_reason: "no records" + - name: GET_STRANDED_INVENTORY_UI_DATA + bypass_reason: "no records" + - name: GET_FBA_FULFILLMENT_INVENTORY_RECEIPTS_DATA + bypass_reason: "no records" + - name: GET_XML_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL + bypass_reason: "no records" + - name: ListFinancialEvents + bypass_reason: "no records" + incremental: + tests: + - config_path: "secrets/config_old_data.json" + configured_catalog_path: "integration_tests/configured_catalog_incremental.json" + future_state: + future_state_path: "integration_tests/future_state.json" + full_refresh: + tests: + - config_path: "secrets/config.json" + configured_catalog_path: "integration_tests/configured_catalog.json" diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog.json index 5c897b44e0b2d..2246774c2256a 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog.json @@ -1,26 +1,5 @@ { "streams": [ - { - "stream": { - "name": "Orders", - "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": true, - "default_cursor_field": ["LastUpdateDate"] - }, - "sync_mode": "incremental", - "destination_sync_mode": "append", - "cursor_field": ["LastUpdateDate"] - }, - { - "stream": { - "name": "GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL", - "json_schema": {}, - "supported_sync_modes": ["full_refresh"] - }, - "sync_mode": "full_refresh", - "destination_sync_mode": "overwrite" - }, { "stream": { "name": "GET_MERCHANT_LISTINGS_ALL_DATA", @@ -32,16 +11,7 @@ }, { "stream": { - "name": "GET_FBA_INVENTORY_AGED_DATA", - "json_schema": {}, - "supported_sync_modes": ["full_refresh"] - }, - "sync_mode": "full_refresh", - "destination_sync_mode": "overwrite" - }, - { - "stream": { - "name": "GET_AMAZON_FULFILLED_SHIPMENTS_DATA_GENERAL", + "name": "GET_FLAT_FILE_OPEN_LISTINGS_DATA", "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, @@ -50,7 +20,7 @@ }, { "stream": { - "name": "GET_FLAT_FILE_OPEN_LISTINGS_DATA", + "name": "GET_XML_BROWSE_TREE_DATA", "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, @@ -59,7 +29,7 @@ }, { "stream": { - "name": "GET_FBA_FULFILLMENT_REMOVAL_ORDER_DETAIL_DATA", + "name": "GET_MERCHANTS_LISTINGS_FYP_REPORT", "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, @@ -68,7 +38,7 @@ }, { "stream": { - "name": "GET_FBA_FULFILLMENT_REMOVAL_SHIPMENT_DETAIL_DATA", + "name": "ListFinancialEventGroups", "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, @@ -77,7 +47,7 @@ }, { "stream": { - "name": "GET_VENDOR_INVENTORY_HEALTH_AND_PLANNING_REPORT", + "name": "GET_MERCHANT_LISTINGS_DATA", "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, @@ -86,24 +56,12 @@ }, { "stream": { - "name": "VendorDirectFulfillmentShipping", + "name": "GET_MERCHANT_LISTINGS_INACTIVE_DATA", "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, "sync_mode": "full_refresh", "destination_sync_mode": "overwrite" - }, - { - "stream": { - "name": "GET_SELLER_FEEDBACK_DATA", - "json_schema": {}, - "supported_sync_modes": ["full_refresh", "incremental"], - "source_defined_cursor": true, - "default_cursor_field": ["Date"] - }, - "sync_mode": "incremental", - "destination_sync_mode": "append", - "cursor_field": ["Date"] } ] } diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_browse_tree_data.json b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_browse_tree_data.json index ae500e45eb328..1ce01e2998e3b 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_browse_tree_data.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_browse_tree_data.json @@ -3,100 +3,7 @@ { "stream": { "name": "GET_XML_BROWSE_TREE_DATA", - "json_schema": { - "title": "XML Browse Tree Data", - "type": "object", - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "browseNodeId": { - "type": ["string"] - }, - "browseNodeAttributes": { - "type": ["null", "object"], - "properties": { - "attribute": { - "type": ["array"], - "items": { - "type": ["null", "object"] - }, - "properties": { - "name": { - "type": ["null", "string"] - }, - "text": { - "type": ["null", "string"] - } - } - }, - "count": { - "type": ["null", "string"] - } - } - }, - "browseNodeName": { - "type": ["null", "string"] - }, - "browseNodeStoreContextName": { - "type": ["null", "string"] - }, - "browsePathById": { - "type": ["null", "string"] - }, - "browsePathByName": { - "type": ["null", "string"] - }, - "hasChildren": { - "type": ["string"] - }, - "childNodes": { - "type": ["null", "object"], - "properties": { - "count": { - "type": ["null", "string"] - }, - "id": { - "type": ["array"], - "items": { - "type": ["null", "string"] - } - } - } - }, - "productTypeDefinitions": { - "type": ["null", "string"] - }, - "refinementsInformation": { - "type": ["array"], - "items": { - "type": ["null", "object"] - }, - "properties": { - "refinementName": { - "type": ["object"], - "properties": { - "refinementField": { - "type": ["null", "object"], - "properties": { - "acceptedValues": { - "type": ["null", "string"] - }, - "hasModifier": { - "type": ["null", "string"] - }, - "modifiers": { - "type": ["null", "string"] - }, - "refinementAttribute": { - "type": ["null", "string"] - } - } - } - } - } - } - } - } - }, + "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, "sync_mode": "full_refresh", diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_fba_fulfillment_customer_shipment_replacement_data.json b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_fba_fulfillment_customer_shipment_replacement_data.json index f4134321139d3..8c42293972eb8 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_fba_fulfillment_customer_shipment_replacement_data.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_fba_fulfillment_customer_shipment_replacement_data.json @@ -3,60 +3,7 @@ { "stream": { "name": "GET_FBA_FULFILLMENT_CUSTOMER_SHIPMENT_REPLACEMENT_DATA", - "json_schema": { - "title": "FBA Fulfillment Customer Shipment Replacement Data", - "description": "FBA Fulfillment Customer Shipment Replacement Data Reports", - "type": "object", - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "shipment-date": { - "title": "Date", - "description": "DD-MON-YYYY. Date of free replacement shipment", - "type": ["null", "string"], - "format": "date-time" - }, - "sku": { - "title": "Merchant SKU", - "description": "Seller's item identifier", - "type": ["null", "string"] - }, - "asin": { - "title": "ASIN", - "description": "Amazon Standard Inventory Number", - "type": ["null", "string"] - }, - "fulfillment-center-id": { - "title": "Warehouse ID", - "description": "Fulfillment center shipping this unit.", - "type": ["null", "string"] - }, - "original-fulfillment-center-id": { - "title": "Original Warehouse ID", - "description": "Original fulfillment center shipping free replaced item.", - "type": ["null", "string"] - }, - "quantity": { - "title": "Quantity", - "description": "Units shipped in replacement shipment", - "type": ["null", "string"] - }, - "replacement-reason-code": { - "title": "Replacement Reason Code", - "description": "Reason for replacement", - "type": ["null", "string"] - }, - "replacement-customer-order-id": { - "title": "Replacement Customer Order Id", - "description": "Order ID of the replacement order", - "type": ["null", "string"] - }, - "original-amazon-order-id": { - "title": "Original Customer Order ID", - "description": "Order ID of original shipment", - "type": ["null", "string"] - } - } - }, + "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, "sync_mode": "full_refresh", diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_incremental.json b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_incremental.json new file mode 100644 index 0000000000000..9f2a3465ecdea --- /dev/null +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_incremental.json @@ -0,0 +1,16 @@ +{ + "streams": [ + { + "stream": { + "name": "Orders", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["LastUpdateDate"] + }, + "sync_mode": "incremental", + "destination_sync_mode": "append", + "cursor_field": ["LastUpdateDate"] + } + ] +} diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_restock_inventory.json b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_restock_inventory.json index 35fa951e3dfa6..7998d2cc92c4d 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_restock_inventory.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/configured_catalog_restock_inventory.json @@ -3,101 +3,7 @@ { "stream": { "name": "GET_RESTOCK_INVENTORY_RECOMMENDATIONS_REPORT", - "json_schema": { - "title": "Restock Inventory Report", - "description": "Restock Inventory Report", - "type": "object", - "$schema": "http://json-schema.org/draft-07/schema#", - "properties": { - "Country": { - "type": ["null", "string"] - }, - "Product Name": { - "type": ["null", "string"] - }, - "FNSKU": { - "type": ["null", "string"] - }, - "Merchant SKU": { - "type": ["null", "string"] - }, - "ASIN": { - "type": ["null", "string"] - }, - "Condition": { - "type": ["null", "string"] - }, - "Supplier": { - "type": ["null", "string"] - }, - "Supplier part no.": { - "type": ["null", "string"] - }, - "Currency code": { - "type": ["null", "string"] - }, - "Price": { - "type": ["null", "string"] - }, - "Sales last 30 days": { - "type": ["null", "string"] - }, - "Units Sold Last 30 Days": { - "type": ["null", "string"] - }, - "Total Units": { - "type": ["null", "string"] - }, - "Inbound": { - "type": ["null", "string"] - }, - "Available": { - "type": ["null", "string"] - }, - "FC transfer": { - "type": ["null", "string"] - }, - "FC Processing": { - "type": ["null", "string"] - }, - "Customer Order": { - "type": ["null", "string"] - }, - "Unfulfillable": { - "type": ["null", "string"] - }, - "Working": { - "type": ["null", "string"] - }, - "Shipped": { - "type": ["null", "string"] - }, - "Receiving": { - "type": ["null", "string"] - }, - "Fulfilled by": { - "type": ["null", "string"] - }, - "Total Days of Supply (including units from open shipments)": { - "type": ["null", "string"] - }, - "Days of Supply at Amazon Fulfillment Network": { - "type": ["null", "string"] - }, - "Alert": { - "type": ["null", "string"] - }, - "Recommended replenishment qty": { - "type": ["null", "string"] - }, - "Recommended ship date": { - "type": ["null", "string"] - }, - "Recommended action": { - "type": ["null", "string"] - } - } - }, + "json_schema": {}, "supported_sync_modes": ["full_refresh"] }, "sync_mode": "full_refresh", diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/expected_records.jsonl new file mode 100644 index 0000000000000..9d1913d4e8ce0 --- /dev/null +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/expected_records.jsonl @@ -0,0 +1,40 @@ +{"stream": "GET_MERCHANT_LISTINGS_ALL_DATA", "data": {"item-name": "House Foods, Tofu Shirataki, Spaghetti Shaped Tofu, 8 oz", "item-description": "", "listing-id": "0705Z8IQ8GS", "seller-sku": "0R-4KDA-Z2U8", "price": "5", "quantity": "983", "open-date": "2022-07-05 08:09:12 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B000VHYM2E", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B000VHYM2E", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template", "status": "Inactive"}, "emitted_at": 1673447236350} +{"stream": "GET_MERCHANT_LISTINGS_ALL_DATA", "data": {"item-name": "Beyond Meat Beyond Burger Plant-Based Patties 2 pk, 8 oz (Frozen)", "item-description": "", "listing-id": "0708ZF4UYHW", "seller-sku": "2J-D6V7-C8XI", "price": "7", "quantity": "922", "open-date": "2022-07-08 03:50:23 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B074K5MDLW", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B074K5MDLW", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template", "status": "Inactive"}, "emitted_at": 1673447236353} +{"stream": "GET_MERCHANT_LISTINGS_ALL_DATA", "data": {"item-name": "GiftBox", "item-description": "", "listing-id": "0711ZJWAW1J", "seller-sku": "G3-8N7Y-L93I", "price": "6", "quantity": "1000", "open-date": "2022-07-11 01:48:47 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B0B68NBQ1Y", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B0B68NBQ1Y", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template", "status": "Inactive"}, "emitted_at": 1673447236353} +{"stream": "GET_MERCHANT_LISTINGS_ALL_DATA", "data": {"item-name": "GiftBox", "item-description": "Monitor and optimize the GiftBox to reward your customers and increase the average order value", "listing-id": "0711ZJUYPNS", "seller-sku": "I0-RALD-N1UR", "price": "5", "quantity": "0", "open-date": "2022-07-11 01:34:18 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B0B68NBQ1Y", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B0B68NBQ1Y", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template", "status": "Inactive"}, "emitted_at": 1673447236354} +{"stream": "GET_MERCHANT_LISTINGS_ALL_DATA", "data": {"item-name": "Beyond Meat Beyond Burger Plant-Based Patties 2 pk, 8 oz (Frozen)", "item-description": "", "listing-id": "0711ZJW1CW7", "seller-sku": "M6-KYAA-V7O7", "price": "10", "quantity": "999999", "open-date": "2022-07-11 01:16:54 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B074K5MDLW", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B074K5MDLW", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template", "status": "Inactive"}, "emitted_at": 1673447236354} +{"stream": "GET_MERCHANT_LISTINGS_ALL_DATA", "data": {"item-name": "House Foods, Organic Firm Tofu, 14 oz", "item-description": "", "listing-id": "0705Z8HWWAY", "seller-sku": "MP-V4RG-EDEY", "price": "5", "quantity": "1518", "open-date": "2022-07-05 08:00:10 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "1", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B000VHRNUW", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B000VHRNUW", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template", "status": "Inactive"}, "emitted_at": 1673447236354} +{"stream": "GET_FLAT_FILE_OPEN_LISTINGS_DATA", "data": {"sku": "I0-RALD-N1UR", "asin": "B0B68NBQ1Y", "price": "5.00", "quantity": "0", "Business Price": "6.0", "Quantity Price Type": "", "Quantity Lower Bound 1": "", "Quantity Price 1": "", "Quantity Lower Bound 2": "", "Quantity Price 2": "", "Quantity Lower Bound 3": "", "Quantity Price 3": "", "Quantity Lower Bound 4": "", "Quantity Price 4": "", "Quantity Lower Bound 5": "", "Quantity Price 5": "", "Progressive Price Type": "", "Progressive Lower Bound 1": "", "Progressive Price 1": "", "Progressive Lower Bound 2": "", "Progressive Price 2": "", "Progressive Lower Bound 3": "", "Progressive Price 3": ""}, "emitted_at": 1673447298434} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718301", "browseNodeAttributes": {"count": "0"}, "browseNodeName": "Car Polishes & Waxes", "browseNodeStoreContextName": "Automotive Polish, Scratch Removers & Waxes", "browsePathById": "15684181,15690151,15718271,15718291,15718301", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Polishes & Waxes", "hasChildren": "true", "childNodes": {"count": "3", "id": ["19351186011", "15718311", "15718371"]}, "productTypeDefinitions": "ABRASIVES,SURFACE_PROTECTION_WAX,CLEANING_AGENT", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762672} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "19351186011", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-bug-sap-and-tar-removers"}]}, "browseNodeName": "Bug, Sap & Tar Removers", "browseNodeStoreContextName": "Automotive Bug, Sap & Tar Removers", "browsePathById": "15684181,15690151,15718271,15718291,15718301,19351186011", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Polishes & Waxes,Bug, Sap & Tar Removers", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "CLEANING_AGENT", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762673} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718311", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-metal-cleaners"}]}, "browseNodeName": "Chrome & Metal Polishes", "browseNodeStoreContextName": "Chrome & Metal Polishes", "browsePathById": "15684181,15690151,15718271,15718291,15718301,15718311", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Polishes & Waxes,Chrome & Metal Polishes", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "ABRASIVES", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762673} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718371", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "car-waxes"}]}, "browseNodeName": "Waxes", "browseNodeStoreContextName": "Waxes", "browsePathById": "15684181,15690151,15718271,15718291,15718301,15718371", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Polishes & Waxes,Waxes", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "SURFACE_PROTECTION_WAX", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762673} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718381", "browseNodeAttributes": {"count": "0"}, "browseNodeName": "Car Wash Equipment", "browseNodeStoreContextName": "Car Wash Equipment", "browsePathById": "15684181,15690151,15718271,15718291,15718381", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Wash Equipment", "hasChildren": "true", "childNodes": {"count": "7", "id": ["15718391", "15718401", "15718451", "15718411", "15718421", "15718431", "15718441"]}, "productTypeDefinitions": "SQUEEGEE,AUTO_ACCESSORY,CLEANING_AGENT", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762673} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718391", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "car-washing-applicators"}]}, "browseNodeName": "Applicators", "browseNodeStoreContextName": "Car Washing Applicators", "browsePathById": "15684181,15690151,15718271,15718291,15718381,15718391", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Wash Equipment,Applicators", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762674} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718401", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-buckets-grit-guards-and-kits"}]}, "browseNodeName": "Buckets, Grit Guards & Kits", "browseNodeStoreContextName": "Automotive Buckets, Grit Guards & Kits", "browsePathById": "15684181,15690151,15718271,15718291,15718381,15718401", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Wash Equipment,Buckets, Grit Guards & Kits", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762674} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718451", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-exterior-cleaners"}]}, "browseNodeName": "Cleaners", "browseNodeStoreContextName": "Cleaners", "browsePathById": "15684181,15690151,15718271,15718291,15718381,15718451", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Wash Equipment,Cleaners", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "CLEANING_AGENT", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762674} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718411", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-washing-nozzles"}]}, "browseNodeName": "Nozzles & Hose Attachments", "browseNodeStoreContextName": "Car Washing Nozzles & Hose Attachments", "browsePathById": "15684181,15690151,15718271,15718291,15718381,15718411", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Wash Equipment,Nozzles & Hose Attachments", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762674} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718421", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-cleaning-sponges-and-mitts"}]}, "browseNodeName": "Sponges & Mitts", "browseNodeStoreContextName": "Car Washing Sponges & Mitts", "browsePathById": "15684181,15690151,15718271,15718291,15718381,15718421", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Wash Equipment,Sponges & Mitts", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762674} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718431", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "waterless-automotive-wash-treatments"}]}, "browseNodeName": "Waterless Wash Treatments", "browseNodeStoreContextName": "Waterless Car Washing Treatments", "browsePathById": "15684181,15690151,15718271,15718291,15718381,15718431", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Wash Equipment,Waterless Wash Treatments", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762675} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718441", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "windshield-squeegees"}]}, "browseNodeName": "Windshield Squeegees", "browseNodeStoreContextName": "Car Washing Windshield Squeegees", "browsePathById": "15684181,15690151,15718271,15718291,15718381,15718441", "browsePathByName": "Automotive,Car Care,Exterior Care,Car Wash Equipment,Windshield Squeegees", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "SQUEEGEE", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762675} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718461", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-roof-and-convertible-top-cleaners"}]}, "browseNodeName": "Convertible Top Cleaners", "browseNodeStoreContextName": "Convertible Top Cleaners", "browsePathById": "15684181,15690151,15718271,15718291,15718461", "browsePathByName": "Automotive,Car Care,Exterior Care,Convertible Top Cleaners", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "CLEANING_AGENT", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762675} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718471", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-polishing-clays"}]}, "browseNodeName": "Polishing & Rubbing Compounds", "browseNodeStoreContextName": "Polishing & Rubbing Compounds", "browsePathById": "15684181,15690151,15718271,15718291,15718471", "browsePathByName": "Automotive,Car Care,Exterior Care,Polishing & Rubbing Compounds", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "ABRASIVES", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762675} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718481", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-polishing-and-waxing-kits"}]}, "browseNodeName": "Polishing & Waxing Kits", "browseNodeStoreContextName": "Polishing & Waxing Kits", "browsePathById": "15684181,15690151,15718271,15718291,15718481", "browsePathByName": "Automotive,Car Care,Exterior Care,Polishing & Waxing Kits", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762676} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "155340011", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-cleaning-squeegee-blades"}]}, "browseNodeName": "Water Blades", "browseNodeStoreContextName": "Cleaning Water Squeegee Blades", "browsePathById": "15684181,15690151,15718271,15718291,155340011", "browsePathByName": "Automotive,Car Care,Exterior Care,Water Blades", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762676} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "21557050011", "browseNodeAttributes": {"count": "0"}, "browseNodeName": "Fillers, Adhesives & Sealants", "browseNodeStoreContextName": "Automotive Fillers, Adhesives & Sealants", "browsePathById": "15684181,15690151,15718271,21557050011", "browsePathByName": "Automotive,Car Care,Fillers, Adhesives & Sealants", "hasChildren": "true", "childNodes": {"count": "3", "id": ["15718921", "3097823011", "15718491"]}, "productTypeDefinitions": "SEALANT,AUTO_ACCESSORY,BONDING_ADHESIVES", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762676} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718921", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-adhesives"}]}, "browseNodeName": "Adhesives", "browseNodeStoreContextName": "Body Repair & Restoration Adhesives", "browsePathById": "15684181,15690151,15718271,21557050011,15718921", "browsePathByName": "Automotive,Car Care,Fillers, Adhesives & Sealants,Adhesives", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "BONDING_ADHESIVES", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762676} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "3097823011", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-body-repair-putties"}]}, "browseNodeName": "Putty", "browseNodeStoreContextName": "Body Repair Putty", "browsePathById": "15684181,15690151,15718271,21557050011,3097823011", "browsePathByName": "Automotive,Car Care,Fillers, Adhesives & Sealants,Putty", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762676} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15718491", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-sealants"}]}, "browseNodeName": "Sealants", "browseNodeStoreContextName": "Automotive Sealants", "browsePathById": "15684181,15690151,15718271,21557050011,15718491", "browsePathByName": "Automotive,Car Care,Fillers, Adhesives & Sealants,Sealants", "hasChildren": "true", "childNodes": {"count": "5", "id": ["15719581", "15709931", "15719601", "15719611", "15719631"]}, "productTypeDefinitions": "SEALANT", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762676} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15719581", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-liquid-gasket-makers"}]}, "browseNodeName": "Gasket", "browseNodeStoreContextName": "Gasket Sealers", "browsePathById": "15684181,15690151,15718271,21557050011,15718491,15719581", "browsePathByName": "Automotive,Car Care,Fillers, Adhesives & Sealants,Sealants,Gasket", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "AUTO_ACCESSORY", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762676} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15709931", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-paint-sealers"}]}, "browseNodeName": "Paint", "browseNodeStoreContextName": "Automotive Sealers", "browsePathById": "15684181,15690151,15718271,21557050011,15718491,15709931", "browsePathByName": "Automotive,Car Care,Fillers, Adhesives & Sealants,Sealants,Paint", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "SEALANT", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762677} +{"stream": "GET_XML_BROWSE_TREE_DATA", "data": {"browseNodeId": "15719601", "browseNodeAttributes": {"count": "1", "attribute": [{"name": "item_type_keyword", "text": "automotive-radiator-sealers"}]}, "browseNodeName": "Radiator", "browseNodeStoreContextName": "Radiator Sealers", "browsePathById": "15684181,15690151,15718271,21557050011,15718491,15719601", "browsePathByName": "Automotive,Car Care,Fillers, Adhesives & Sealants,Sealants,Radiator", "hasChildren": "false", "childNodes": {"count": "0"}, "productTypeDefinitions": "SEALANT", "refinementsInformation": {"count": "0"}}, "emitted_at": 1673447762677} +{"stream": "GET_MERCHANTS_LISTINGS_FYP_REPORT", "data": {"Status": "Search Suppressed", "Reason": "Missing info", "SKU": "G3-8N7Y-L93I", "ASIN": "B0B68NBQ1Y", "Product name": "GiftBox", "Condition": "11", "Status Change Date": "Jul 29, 2022", "Issue Description": "'[brand]' is required but not supplied."}, "emitted_at": 1673450133231} +{"stream": "GET_MERCHANTS_LISTINGS_FYP_REPORT", "data": {"Status": "Search Suppressed", "Reason": "Missing info", "SKU": "I0-RALD-N1UR", "ASIN": "B0B68NBQ1Y", "Product name": "GiftBox", "Condition": "11", "Status Change Date": "Jul 29, 2022", "Issue Description": "'[brand]' is required but not supplied."}, "emitted_at": 1673450133232} +{"stream": "ListFinancialEventGroups", "data": {"FinancialEventGroupId": "biM60XKT9qekhLpYdH9-ktjaaCDakRl5bhkXarpufys", "ProcessingStatus": "Open", "OriginalTotal": {"CurrencyCode": "USD", "CurrencyAmount": 0.0}, "BeginningBalance": {"CurrencyCode": "USD", "CurrencyAmount": -58.86}, "FinancialEventGroupStart": "2022-08-08T22:51:31Z"}, "emitted_at": 1673450203988} +{"stream": "GET_MERCHANT_LISTINGS_DATA", "data": {"item-name": "GiftBox", "item-description": "Monitor and optimize the GiftBox to reward your customers and increase the average order value", "listing-id": "0711ZJUYPNS", "seller-sku": "I0-RALD-N1UR", "price": "5", "quantity": "0", "open-date": "2022-07-11 01:34:18 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B0B68NBQ1Y", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B0B68NBQ1Y", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "Business Price": "6.0", "Quantity Price Type": "", "Quantity Lower Bound 1": "", "Quantity Price 1": "", "Quantity Lower Bound 2": "", "Quantity Price 2": "", "Quantity Lower Bound 3": "", "Quantity Price 3": "", "Quantity Lower Bound 4": "", "Quantity Price 4": "", "Quantity Lower Bound 5": "", "Quantity Price 5": "", "merchant-shipping-group": "Migrated Template", "Progressive Price Type": "", "Progressive Lower Bound 1": "", "Progressive Price 1": "", "Progressive Lower Bound 2": "", "Progressive Price 2": "", "Progressive Lower Bound 3": "", "Progressive Price 3": ""}, "emitted_at": 1673450377952} +{"stream": "GET_MERCHANT_LISTINGS_INACTIVE_DATA", "data": {"item-name": "House Foods, Tofu Shirataki, Spaghetti Shaped Tofu, 8 oz", "item-description": "", "listing-id": "0705Z8IQ8GS", "seller-sku": "0R-4KDA-Z2U8", "price": "5", "quantity": "983", "open-date": "2022-07-05 08:09:12 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B000VHYM2E", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B000VHYM2E", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template"}, "emitted_at": 1673450467120} +{"stream": "GET_MERCHANT_LISTINGS_INACTIVE_DATA", "data": {"item-name": "Beyond Meat Beyond Burger Plant-Based Patties 2 pk, 8 oz (Frozen)", "item-description": "", "listing-id": "0708ZF4UYHW", "seller-sku": "2J-D6V7-C8XI", "price": "7", "quantity": "922", "open-date": "2022-07-08 03:50:23 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B074K5MDLW", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B074K5MDLW", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template"}, "emitted_at": 1673450467121} +{"stream": "GET_MERCHANT_LISTINGS_INACTIVE_DATA", "data": {"item-name": "GiftBox", "item-description": "", "listing-id": "0711ZJWAW1J", "seller-sku": "G3-8N7Y-L93I", "price": "6", "quantity": "1000", "open-date": "2022-07-11 01:48:47 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B0B68NBQ1Y", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B0B68NBQ1Y", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template"}, "emitted_at": 1673450467122} +{"stream": "GET_MERCHANT_LISTINGS_INACTIVE_DATA", "data": {"item-name": "GiftBox", "item-description": "Monitor and optimize the GiftBox to reward your customers and increase the average order value", "listing-id": "0711ZJUYPNS", "seller-sku": "I0-RALD-N1UR", "price": "5", "quantity": "0", "open-date": "2022-07-11 01:34:18 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B0B68NBQ1Y", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B0B68NBQ1Y", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template"}, "emitted_at": 1673450467122} +{"stream": "GET_MERCHANT_LISTINGS_INACTIVE_DATA", "data": {"item-name": "Beyond Meat Beyond Burger Plant-Based Patties 2 pk, 8 oz (Frozen)", "item-description": "", "listing-id": "0711ZJW1CW7", "seller-sku": "M6-KYAA-V7O7", "price": "10", "quantity": "999999", "open-date": "2022-07-11 01:16:54 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "11", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B074K5MDLW", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B074K5MDLW", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template"}, "emitted_at": 1673450467123} +{"stream": "GET_MERCHANT_LISTINGS_INACTIVE_DATA", "data": {"item-name": "House Foods, Organic Firm Tofu, 14 oz", "item-description": "", "listing-id": "0705Z8HWWAY", "seller-sku": "MP-V4RG-EDEY", "price": "5", "quantity": "1518", "open-date": "2022-07-05 08:00:10 PDT", "image-url": "", "item-is-marketplace": "y", "product-id-type": "1", "zshop-shipping-fee": "", "item-note": "", "item-condition": "1", "zshop-category1": "", "zshop-browse-path": "", "zshop-storefront-feature": "", "asin1": "B000VHRNUW", "asin2": "", "asin3": "", "will-ship-internationally": "", "expedited-shipping": "", "zshop-boldface": "", "product-id": "B000VHRNUW", "bid-for-featured-placement": "", "add-delete": "", "pending-quantity": "0", "fulfillment-channel": "DEFAULT", "merchant-shipping-group": "Migrated Template"}, "emitted_at": 1673450467123} diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/future_state.json b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/future_state.json index 2676de94b9bff..f7a73ecd7d11b 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/future_state.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/future_state.json @@ -1,5 +1,13 @@ -{ - "Orders": { - "LastUpdateDate": "2121-07-01T00:00:00Z" - } -} +[ + { + "type": "STREAM", + "stream": { + "stream_state": { + "LastUpdateDate": "2121-07-01T00:00:00Z" + }, + "stream_descriptor": { + "name": "Orders" + } + } + } + ] \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/spec.json b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/spec.json index 8b0b764c12a0b..367e5695099dd 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/spec.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/integration_tests/spec.json @@ -78,8 +78,9 @@ "period_in_days": { "title": "Period In Days", "description": "Will be used for stream slicing for initial full_refresh sync when no updated state is present for reports that support sliced incremental sync.", - "default": 30, - "examples": ["30", "365"], + "default": 90, + "maximum": 90, + "examples": ["1", "10", "30", "60", "90"], "order": 10, "type": "integer" }, diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/GET_MERCHANT_LISTINGS_ALL_DATA.json b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/GET_MERCHANT_LISTINGS_ALL_DATA.json index 086973b8f6bf4..c4d4459eb0995 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/GET_MERCHANT_LISTINGS_ALL_DATA.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/GET_MERCHANT_LISTINGS_ALL_DATA.json @@ -17,10 +17,10 @@ "type": ["null", "string"] }, "price": { - "type": ["null", "number"] + "type": ["null", "string"] }, "quantity": { - "type": ["null", "number"] + "type": ["null", "string"] }, "open-date": { "type": ["null", "string"] @@ -80,7 +80,7 @@ "type": ["null", "string"] }, "pending-quantity": { - "type": ["null", "number"] + "type": ["null", "string"] }, "fulfillment-channel": { "type": ["null", "string"] diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/GET_XML_BROWSE_TREE_DATA.json b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/GET_XML_BROWSE_TREE_DATA.json index 1b28d79be705f..be41d2108a457 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/GET_XML_BROWSE_TREE_DATA.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/GET_XML_BROWSE_TREE_DATA.json @@ -61,13 +61,13 @@ "type": ["null", "string"] }, "refinementsInformation": { - "type": ["array"], - "items": { - "type": ["null", "object"] - }, + "type": ["null", "object"], "properties": { + "count": { + "type": ["null", "string"] + }, "refinementName": { - "type": ["object"], + "type": ["null", "object"], "properties": { "refinementField": { "type": ["null", "object"], diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/ListFinancialEvents.json b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/ListFinancialEvents.json index 3e21f32595b20..d505714f157ec 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/ListFinancialEvents.json +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/schemas/ListFinancialEvents.json @@ -1,22 +1,22 @@ { "title": "ListFinancialEvents", "description": "List of Financial Events", - "type": "object", + "type": ["null", "object"], "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "ShipmentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "SellerOrderId": { - "type": "string" + "type": ["null", "string"] }, "MarketplaceName": { - "type": "string" + "type": ["null", "string"] }, "OrderChargeList": { "type": ["null", "array"] @@ -40,7 +40,7 @@ "type": ["null", "array"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "ShipmentItemList": { @@ -55,16 +55,16 @@ "RefundEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "SellerOrderId": { - "type": "string" + "type": ["null", "string"] }, "MarketplaceName": { - "type": "string" + "type": ["null", "string"] }, "OrderChargeList": { "type": ["null", "array"] @@ -88,7 +88,7 @@ "type": ["null", "array"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "ShipmentItemList": { @@ -103,16 +103,16 @@ "GuaranteeClaimEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "SellerOrderId": { - "type": "string" + "type": ["null", "string"] }, "MarketplaceName": { - "type": "string" + "type": ["null", "string"] }, "OrderChargeList": { "type": ["null", "array"] @@ -136,7 +136,7 @@ "type": ["null", "array"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "ShipmentItemList": { @@ -151,16 +151,16 @@ "ChargebackEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "SellerOrderId": { - "type": "string" + "type": ["null", "string"] }, "MarketplaceName": { - "type": "string" + "type": ["null", "string"] }, "OrderChargeList": { "type": ["null", "array"] @@ -184,7 +184,7 @@ "type": ["null", "array"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "ShipmentItemList": { @@ -199,20 +199,20 @@ "PayWithAmazonEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "SellerOrderId": { - "type": "string" + "type": ["null", "string"] }, "TransactionPostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "BusinessObjectType": { - "type": "string" + "type": ["null", "string"] }, "SalesChannel": { - "type": "string" + "type": ["null", "string"] }, "Charge": { "type": ["null", "object"] @@ -221,16 +221,16 @@ "type": ["null", "array"] }, "PaymentAmountType": { - "type": "string" + "type": ["null", "string"] }, "AmountDescription": { - "type": "string" + "type": ["null", "string"] }, "FulfillmentChannel": { - "type": "string" + "type": ["null", "string"] }, "StoreName": { - "type": "string" + "type": ["null", "string"] } } } @@ -238,37 +238,37 @@ "ServiceProviderCreditEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "ProviderTransactionType": { - "type": "string" + "type": ["null", "string"] }, "SellerOrderId": { - "type": "string" + "type": ["null", "string"] }, "MarketplaceId": { - "type": "string" + "type": ["null", "string"] }, "MarketplaceCountryCode": { - "type": "string" + "type": ["null", "string"] }, "SellerId": { - "type": "string" + "type": ["null", "string"] }, "SellerStoreName": { - "type": "string" + "type": ["null", "string"] }, "ProviderId": { - "type": "string" + "type": ["null", "string"] }, "ProviderStoreName": { - "type": "string" + "type": ["null", "string"] }, "TransactionAmount": { "type": ["null", "object"] }, "TransactionCreationDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" } } @@ -277,16 +277,16 @@ "RetrochargeEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "RetrochargeEventType": { - "type": "string" + "type": ["null", "string"] }, "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "BaseTax": { @@ -296,7 +296,7 @@ "type": ["null", "object"] }, "MarketplaceName": { - "type": "string" + "type": ["null", "string"] }, "RetrochargeTaxWithheldList": { "type": ["null", "array"] @@ -307,20 +307,20 @@ "RentalTransactionEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "RentalEventType": { - "type": "string" + "type": ["null", "string"] }, "ExtensionLength": { "type": "integer", "format": "int32" }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "RentalChargeList": { @@ -330,7 +330,7 @@ "type": ["null", "array"] }, "MarketplaceName": { - "type": "string" + "type": ["null", "string"] }, "RentalInitialValue": { "type": ["null", "object"] @@ -344,20 +344,24 @@ } } }, + "PerformanceBondRefundEventList": { + "type": "array", + "items": {} + }, "ProductAdsPaymentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "postedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "transactionType": { - "type": "string" + "type": ["null", "string"] }, "invoiceId": { - "type": "string" + "type": ["null", "string"] }, "baseValue": { "type": ["null", "object"] @@ -374,28 +378,28 @@ "ServiceFeeEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "FeeReason": { - "type": "string" + "type": ["null", "string"] }, "FeeList": { "type": ["null", "array"] }, "SellerSKU": { - "type": "string" + "type": ["null", "string"] }, "FnSKU": { - "type": "string" + "type": ["null", "string"] }, "FeeDescription": { - "type": "string" + "type": ["null", "string"] }, "ASIN": { - "type": "string" + "type": ["null", "string"] } } } @@ -403,23 +407,23 @@ "SellerDealPaymentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "postedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "dealId": { - "type": "string" + "type": ["null", "string"] }, "dealDescription": { - "type": "string" + "type": ["null", "string"] }, "eventType": { - "type": "string" + "type": ["null", "string"] }, "feeType": { - "type": "string" + "type": ["null", "string"] }, "feeAmount": { "type": ["null", "object"] @@ -436,10 +440,10 @@ "DebtRecoveryEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "DebtRecoveryType": { - "type": "string" + "type": ["null", "string"] }, "RecoveryAmount": { "type": ["null", "object"] @@ -459,13 +463,13 @@ "LoanServicingEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "LoanAmount": { "type": ["null", "object"] }, "SourceBusinessEventType": { - "type": "string" + "type": ["null", "string"] } } } @@ -473,13 +477,13 @@ "AdjustmentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AdjustmentType": { - "type": "string" + "type": ["null", "string"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "AdjustmentAmount": { @@ -494,20 +498,20 @@ "SAFETReimbursementEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "SAFETClaimId": { - "type": "string" + "type": ["null", "string"] }, "ReimbursedAmount": { "type": ["null", "object"] }, "ReasonCode": { - "type": "string" + "type": ["null", "string"] }, "SAFETReimbursementItemList": { "type": ["null", "array"] @@ -518,17 +522,17 @@ "SellerReviewEnrollmentPaymentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "EnrollmentId": { - "type": "string" + "type": ["null", "string"] }, "ParentASIN": { - "type": "string" + "type": ["null", "string"] }, "FeeComponent": { "type": ["null", "object"] @@ -545,14 +549,14 @@ "FBALiquidationEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "OriginalRemovalOrderId": { - "type": "string" + "type": ["null", "string"] }, "LiquidationProceedsAmount": { "type": ["null", "object"] @@ -566,24 +570,24 @@ "CouponPaymentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "CouponId": { - "type": "string" + "type": ["null", "string"] }, "SellerCouponDescription": { - "type": "string" + "type": ["null", "string"] }, "ClipOrRedemptionCount": { "type": "integer", "format": "int64" }, "PaymentEventId": { - "type": "string" + "type": ["null", "string"] }, "FeeComponent": { "type": ["null", "object"] @@ -600,16 +604,16 @@ "ImagingServicesFeeEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "ImagingRequestBillingItemID": { - "type": "string" + "type": ["null", "string"] }, "ASIN": { - "type": "string" + "type": ["null", "string"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "FeeList": { @@ -621,26 +625,26 @@ "NetworkComminglingTransactionEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "TransactionType": { - "type": "string" + "type": ["null", "string"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "NetCoTransactionID": { - "type": "string" + "type": ["null", "string"] }, "SwapReason": { - "type": "string" + "type": ["null", "string"] }, "ASIN": { - "type": "string" + "type": ["null", "string"] }, "MarketplaceId": { - "type": "string" + "type": ["null", "string"] }, "TaxExclusiveAmount": { "type": ["null", "object"] @@ -654,20 +658,20 @@ "AffordabilityExpenseEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "MarketplaceId": { - "type": "string" + "type": ["null", "string"] }, "TransactionType": { - "type": "string" + "type": ["null", "string"] }, "BaseExpense": { "type": ["null", "object"] @@ -690,20 +694,20 @@ "AffordabilityExpenseReversalEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "MarketplaceId": { - "type": "string" + "type": ["null", "string"] }, "TransactionType": { - "type": "string" + "type": ["null", "string"] }, "BaseExpense": { "type": ["null", "object"] @@ -726,20 +730,44 @@ "TrialShipmentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], + "properties": { + "AmazonOrderId": { + "type": ["null", "string"] + }, + "FinancialEventGroupId": { + "type": ["null", "string"] + }, + "PostedDate": { + "type": ["null", "string"], + "format": "date-time" + }, + "SKU": { + "type": ["null", "string"] + }, + "FeeList": { + "type": ["null", "array"] + } + } + } + }, + "TDSReimbursementEventList": { + "type": ["null", "array"], + "items": { + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "FinancialEventGroupId": { - "type": "string" + "type": ["null", "string"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "SKU": { - "type": "string" + "type": ["null", "string"] }, "FeeList": { "type": ["null", "array"] @@ -747,19 +775,40 @@ } } }, + "AdhocDisbursementEventList": { + "type": ["null","array"], + "items": { + "type": ["null", "object"], + "properties": { + "AdjustmentType": { + "type": ["null", "string"] + }, + "PostedDate": { + "type": ["null", "string"], + "format": "date-time" + }, + "AdjustmentAmount": { + "type": ["null", "object"] + }, + "AdjustmentItemList": { + "type": ["null", "array"] + } + } + } + }, "ShipmentSettleEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "AmazonOrderId": { - "type": "string" + "type": ["null", "string"] }, "SellerOrderId": { - "type": "string" + "type": ["null", "string"] }, "MarketplaceName": { - "type": "string" + "type": ["null", "string"] }, "OrderChargeList": { "type": ["null", "array"] @@ -783,7 +832,7 @@ "type": ["null", "array"] }, "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "ShipmentItemList": { @@ -795,13 +844,82 @@ } } }, + "ChargeRefundEventList": { + "type": ["null","array"], + "items": { + "type": ["null", "object"], + "properties": { + "ChargeAmount": { + "type": ["null", "object"] + }, + "ChargeType": { + "type": ["null", "string"] + } + } + } + }, + "FailedAdhocDisbursementEventList": { + "type": ["null","array"], + "items": { + "type": ["null", "object"], + "properties": { + "FundsTransfersType": { + "type": ["null", "string"] + }, + "TransferId": { + "type": ["null", "string"] + }, + "DisbursementId": { + "type": ["null", "string"] + }, + "PaymentDisbursementType": { + "type": ["null", "string"] + }, + "Status": { + "type": ["null", "string"] + }, + "TransferAmount": { + "type": ["null", "object"] + }, + "PostedDate": { + "type": ["null", "string"], + "format": "date-time" + } + } + } + }, + "ValueAddedServiceChargeEventList": { + "type": ["null","array"], + "items": { + "type": ["null", "object"], + "properties": { + "TransactionType": { + "type": ["null", "string"] + }, + "Description": { + "type": ["null", "string"] + }, + "TransactionAmount": { + "type": ["null", "object"] + }, + "PostedDate": { + "type": ["null", "string"], + "format": "date-time" + } + } + } + }, + "CapacityReservationBillingEventList": { + "type": "array", + "items": {} + }, "TaxWithholdingEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "BaseAmount": { @@ -819,20 +937,20 @@ "RemovalShipmentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "MerchantOrderId": { - "type": "string" + "type": ["null", "string"] }, "OrderId": { - "type": "string" + "type": ["null", "string"] }, "TransactionType": { - "type": "string" + "type": ["null", "string"] }, "RemovalShipmentItemList": { "type": ["null", "array"] @@ -843,23 +961,23 @@ "RemovalShipmentAdjustmentEventList": { "type": ["null", "array"], "items": { - "type": "object", + "type": ["null", "object"], "properties": { "PostedDate": { - "type": "string", + "type": ["null", "string"], "format": "date-time" }, "AdjustmentEventId": { - "type": "string" + "type": ["null", "string"] }, "MerchantOrderId": { - "type": "string" + "type": ["null", "string"] }, "OrderId": { - "type": "string" + "type": ["null", "string"] }, "TransactionType": { - "type": "string" + "type": ["null", "string"] }, "RemovalShipmentItemAdjustmentList": { "type": ["null", "array"] diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/source.py b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/source.py index de7ef7fcc0f6d..dcfebec39b935 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/source.py +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/source.py @@ -29,7 +29,6 @@ FbaFulfillmentInventorySummaryReport, FbaFulfillmentMonthlyInventoryReport, FbaInventoryPlaningReport, - FbaInventoryReports, FbaMyiUnsuppressedInventoryReport, FbaOrdersReports, FbaReplacementsReports, @@ -61,7 +60,6 @@ SellerFeedbackReports, StrandedInventoryUiReport, VendorDirectFulfillmentShipping, - VendorInventoryHealthReports, VendorInventoryReports, VendorSalesReports, XmlAllOrdersDataByOrderDataGeneral, @@ -158,7 +156,6 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: return [ FbaCustomerReturnsReports(**stream_kwargs), - FbaInventoryReports(**stream_kwargs), FbaAfnInventoryReports(**stream_kwargs), FbaAfnInventoryByCountryReports(**stream_kwargs), FbaOrdersReports(**stream_kwargs), @@ -173,7 +170,6 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: FulfilledShipmentsReports(**stream_kwargs), MerchantListingsReports(**stream_kwargs), VendorDirectFulfillmentShipping(**stream_kwargs), - VendorInventoryHealthReports(**stream_kwargs), VendorInventoryReports(**stream_kwargs), VendorSalesReports(**stream_kwargs), Orders(**stream_kwargs), diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/spec.py b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/spec.py index 4bd603705b700..e6461ad68ce51 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/spec.py +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/spec.py @@ -85,9 +85,10 @@ class Config: ) period_in_days: int = Field( - 30, + 90, + le=90, + examples=["1", "10", "30", "60", "90"], description="Will be used for stream slicing for initial full_refresh sync when no updated state is present for reports that support sliced incremental sync.", - examples=["30", "365"], order=10, ) report_options: str = Field( @@ -99,7 +100,8 @@ class Config: max_wait_seconds: int = Field( 500, title="Max wait time for reports (in seconds)", - description="Sometimes report can take up to 30 minutes to generate. This will set the limit for how long to wait for a successful report.", + description="Sometimes report can take up to 30 minutes to generate. This will set the limit for how long " + "to wait for a successful report.", examples=["500", "1980"], order=12, ) diff --git a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/streams.py b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/streams.py index 2a67e74d58c28..47028b22aa52c 100644 --- a/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/streams.py +++ b/airbyte-integrations/connectors/source-amazon-seller-partner/source_amazon_seller_partner/streams.py @@ -182,8 +182,8 @@ def __init__( self._replication_start_date = replication_start_date self._replication_end_date = replication_end_date self.marketplace_id = marketplace_id - self.period_in_days = period_in_days - self._report_options = report_options + self.period_in_days = max(period_in_days, self.replication_start_date_limit_in_days) # ensure old configs work as well + self._report_options = report_options or "{}" self.max_wait_seconds = max_wait_seconds @property @@ -241,24 +241,7 @@ def _report_data( stream_slice: Mapping[str, Any] = None, stream_state: Mapping[str, Any] = None, ) -> Mapping[str, Any]: - replication_start_date = max( - pendulum.parse(self._replication_start_date), pendulum.now("utc").subtract(days=self.replication_start_date_limit_in_days) - ) - - params = { - "reportType": self.name, - "marketplaceIds": [self.marketplace_id], - "dataStartTime": replication_start_date.strftime(DATE_TIME_FORMAT), - } - - if self._replication_end_date and sync_mode == SyncMode.full_refresh: - params["dataEndTime"] = self._replication_end_date - # if replication_start_date is older than 90 days(from current date), we are overriding the value above. - # when replication_end_date is present, we should use the user provided replication_start_date. - # user may provide a date range which is older than 90 days. - params["dataStartTime"] = self._replication_start_date - - return params + return {"reportType": self.name, "marketplaceIds": [self.marketplace_id], **stream_slice} def _create_report( self, @@ -317,6 +300,31 @@ def report_options(self) -> Mapping[str, Any]: else: return {} + def stream_slices( + self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_state: Mapping[str, Any] = None + ) -> Iterable[Optional[Mapping[str, Any]]]: + start_date = max(pendulum.parse(self._replication_start_date), pendulum.now("utc").subtract(days=90)) + end_date = pendulum.now() + if self._replication_end_date and sync_mode == SyncMode.full_refresh: + # if replication_start_date is older than 90 days(from current date), we are overriding the value above. + # when replication_end_date is present, we should use the user provided replication_start_date. + # user may provide a date range which is older than 90 days. + end_date = min(end_date, pendulum.parse(self._replication_end_date)) + start_date = pendulum.parse(self._replication_start_date) + + if stream_state: + state = stream_state.get(self.cursor_field) + start_date = state and pendulum.parse(state) or start_date + + start_date = min(start_date, end_date) + while start_date < end_date: + end_date_slice = start_date.add(days=self.period_in_days) + yield { + "dataStartTime": start_date.strftime(DATE_TIME_FORMAT), + "dataEndTime": min(end_date_slice.subtract(seconds=1), end_date).strftime(DATE_TIME_FORMAT), + } + start_date = end_date_slice + def read_records( self, sync_mode: SyncMode, @@ -376,14 +384,6 @@ class FlatFileOrdersReports(ReportsAmazonSPStream): name = "GET_FLAT_FILE_ALL_ORDERS_DATA_BY_ORDER_DATE_GENERAL" -class FbaInventoryReports(ReportsAmazonSPStream): - """ - Field definitions: https://sellercentral.amazon.com/gp/help/200740930 - """ - - name = "GET_FBA_INVENTORY_AGED_DATA" - - class FbaAfnInventoryReports(ReportsAmazonSPStream): """ Field definitions: https://developer-docs.amazon.com/sp-api/docs/report-type-values#inventory-reports @@ -456,10 +456,6 @@ class RestockInventoryReports(ReportsAmazonSPStream): name = "GET_RESTOCK_INVENTORY_RECOMMENDATIONS_REPORT" -class VendorInventoryHealthReports(ReportsAmazonSPStream): - name = "GET_VENDOR_INVENTORY_HEALTH_AND_PLANNING_REPORT" - - class GetXmlBrowseTreeData(ReportsAmazonSPStream): def parse_document(self, document): parsed = xmltodict.parse( @@ -581,6 +577,8 @@ class FlatFileArchivedOrdersDataByOrderDate(ReportsAmazonSPStream): class FlatFileReturnsDataByReturnDate(ReportsAmazonSPStream): name = "GET_FLAT_FILE_RETURNS_DATA_BY_RETURN_DATE" + replication_start_date_limit_in_days = 60 + class FbaInventoryPlaningReport(ReportsAmazonSPStream): name = "GET_FBA_INVENTORY_PLANNING_DATA" @@ -703,24 +701,6 @@ class IncrementalReportsAmazonSPStream(ReportsAmazonSPStream): def cursor_field(self) -> Union[str, List[str]]: pass - def _report_data( - self, - sync_mode: SyncMode, - cursor_field: List[str] = None, - stream_slice: Mapping[str, Any] = None, - stream_state: Mapping[str, Any] = None, - ) -> Mapping[str, Any]: - data = super()._report_data(sync_mode, cursor_field, stream_slice, stream_state) - if stream_slice: - data_times = {} - if stream_slice.get("dataStartTime"): - data_times["dataStartTime"] = stream_slice["dataStartTime"] - if stream_slice.get("dataEndTime"): - data_times["dataEndTime"] = stream_slice["dataEndTime"] - data.update(data_times) - - return data - def get_updated_state(self, current_stream_state: MutableMapping[str, Any], latest_record: Mapping[str, Any]) -> Mapping[str, Any]: """ Return the latest state by comparing the cursor value in the latest record with the stream's most recent state object @@ -731,35 +711,6 @@ def get_updated_state(self, current_stream_state: MutableMapping[str, Any], late return {self.cursor_field: max(latest_benchmark, current_stream_state[self.cursor_field])} return {self.cursor_field: latest_benchmark} - def stream_slices( - self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_state: Mapping[str, Any] = None - ) -> Iterable[Optional[Mapping[str, Any]]]: - - start_date = pendulum.parse(self._replication_start_date) - end_date = pendulum.now() - - if self._replication_end_date and sync_mode == SyncMode.full_refresh: - end_date = pendulum.parse(self._replication_end_date) - - if stream_state: - state = stream_state.get(self.cursor_field) - start_date = pendulum.parse(state) - - start_date = min(start_date, end_date) - slices = [] - - while start_date < end_date: - end_date_slice = start_date.add(days=self.period_in_days) - slices.append( - { - "dataStartTime": start_date.strftime(DATE_TIME_FORMAT), - "dataEndTime": min(end_date_slice.subtract(seconds=1), end_date).strftime(DATE_TIME_FORMAT), - } - ) - start_date = end_date_slice - - return slices - class SellerFeedbackReports(IncrementalReportsAmazonSPStream): """ @@ -1145,22 +1096,6 @@ class FbaCustomerReturnsReports(ReportsAmazonSPStream): name = "GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA" - def _report_data( - self, - sync_mode: SyncMode, - cursor_field: List[str] = None, - stream_slice: Mapping[str, Any] = None, - stream_state: Mapping[str, Any] = None, - ) -> Mapping[str, Any]: - replication_start_date = pendulum.parse(self._replication_start_date) - - data = { - "reportType": self.name, - "marketplaceIds": [self.marketplace_id], - "dataStartTime": replication_start_date.strftime(DATE_TIME_FORMAT), - } - return data - class FlatFileSettlementV2Reports(ReportsAmazonSPStream): diff --git a/docs/integrations/sources/amazon-seller-partner.md b/docs/integrations/sources/amazon-seller-partner.md index 9d73c33f6c940..2ca5bcea7d4a1 100644 --- a/docs/integrations/sources/amazon-seller-partner.md +++ b/docs/integrations/sources/amazon-seller-partner.md @@ -110,6 +110,9 @@ This source is capable of syncing the following tables and their data: Make sure to configure the [required parameters](https://developer-docs.amazon.com/sp-api/docs/report-type-values) in the report options setting for the reports configured. +For `GET_AMAZON_FULFILLED_SHIPMENTS_DATA_GENERAL` and `GET_FLAT_FILE_RETURNS_DATA_BY_RETURN_DATE` streams maximum value for `period_in_days` 30 days and 60 days. +So, for any value that exceeds the limit, the `period_in_days` will be automatically reduced to the limit for the stream. + ## Data type mapping | Integration Type | Airbyte Type | @@ -126,6 +129,7 @@ Make sure to configure the [required parameters](https://developer-docs.amazon.c | Version | Date | Pull Request | Subject | |:---------|:-----------|:-----------------------------------------------------------|:-----------------------------------------------------------------------| +| `0.2.31` | 2022-01-10 | [\#16430](https://github.com/airbytehq/airbyte/pull/16430) | Implement slicing for report streams | | `0.2.30` | 2022-12-28 | [\#20896](https://github.com/airbytehq/airbyte/pull/20896) | Validate connections without orders data | | `0.2.29` | 2022-11-18 | [\#19581](https://github.com/airbytehq/airbyte/pull/19581) | Use user provided end date for GET_SALES_AND_TRAFFIC_REPORT | | | `0.2.28` | 2022-10-20 | [\#18283](https://github.com/airbytehq/airbyte/pull/18283) | Added multiple (22) report types | From cf7302003ce03ece9dbe1a43e87da57edef4d71e Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 26 Jan 2023 20:29:52 +0100 Subject: [PATCH 120/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=8E=89=20Remove=20?= =?UTF-8?q?advanced=20mode=20(#21914)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove advanced mode * Add Suspense boundary * Remove tests Co-authored-by: Joey Marshment-Howell --- .../services/useAdvancedModeSetting.test.ts | 53 ------------------- .../hooks/services/useAdvancedModeSetting.ts | 19 ------- airbyte-webapp/src/locales/en.json | 4 +- .../src/packages/cloud/locales/en.json | 3 -- .../WorkspaceSettingsView.tsx | 30 +---------- .../AccountPage/components/AccountForm.tsx | 34 ++---------- .../ConnectionSettingsPage.module.scss | 8 +++ .../ConnectionSettingsPage.test.tsx | 49 ----------------- .../ConnectionSettingsPage.tsx | 28 ++++++++-- 9 files changed, 39 insertions(+), 189 deletions(-) delete mode 100644 airbyte-webapp/src/hooks/services/useAdvancedModeSetting.test.ts delete mode 100644 airbyte-webapp/src/hooks/services/useAdvancedModeSetting.ts delete mode 100644 airbyte-webapp/src/pages/connections/ConnectionSettingsPage/ConnectionSettingsPage.test.tsx diff --git a/airbyte-webapp/src/hooks/services/useAdvancedModeSetting.test.ts b/airbyte-webapp/src/hooks/services/useAdvancedModeSetting.test.ts deleted file mode 100644 index 2b6a1217de128..0000000000000 --- a/airbyte-webapp/src/hooks/services/useAdvancedModeSetting.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { act, renderHook } from "@testing-library/react-hooks"; - -import { useAdvancedModeSetting } from "./useAdvancedModeSetting"; - -// mock `useCurrentWorkspace` with a closure so we can simulate changing -// workspaces by mutating the top-level variable it references -let mockWorkspaceId = "fakeWorkspaceId"; -const changeToWorkspace = (newWorkspaceId: string) => { - mockWorkspaceId = newWorkspaceId; -}; - -jest.mock("hooks/services/useWorkspace", () => ({ - useCurrentWorkspace() { - return { workspaceId: mockWorkspaceId }; - }, -})); - -it("defaults to false before advanced mode is explicitly set", () => { - const { result } = renderHook(() => useAdvancedModeSetting()); - // eslint-disable-next-line prefer-const - let [isAdvancedMode, setAdvancedMode] = result.current; - - expect(isAdvancedMode).toBe(false); - - act(() => setAdvancedMode(true)); - [isAdvancedMode] = result.current; - - expect(isAdvancedMode).toBe(true); -}); - -it("stores workspace-specific advanced mode settings", () => { - changeToWorkspace("workspaceA"); - - const { result, rerender } = renderHook(() => useAdvancedModeSetting()); - // Avoiding destructuring in this spec to avoid capturing stale values when - // rerendering in different workspaces - const setAdvancedModeA = result.current[1]; - - expect(result.current[0]).toBe(false); - act(() => setAdvancedModeA(true)); - - expect(result.current[0]).toBe(true); - - // in workspaceB, it returns the default setting of `false` - changeToWorkspace("workspaceB"); - rerender(); - expect(result.current[0]).toBe(false); - - // ...but workspaceA's manual setting is persisted - changeToWorkspace("workspaceA"); - rerender(); - expect(result.current[0]).toBe(true); -}); diff --git a/airbyte-webapp/src/hooks/services/useAdvancedModeSetting.ts b/airbyte-webapp/src/hooks/services/useAdvancedModeSetting.ts deleted file mode 100644 index f79bdd63c4017..0000000000000 --- a/airbyte-webapp/src/hooks/services/useAdvancedModeSetting.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { useLocalStorage } from "react-use"; - -import { useCurrentWorkspace } from "hooks/services/useWorkspace"; - -type SettingsByWorkspace = Record; - -export const useAdvancedModeSetting = (): [boolean, (newSetting: boolean) => void] => { - const { workspaceId } = useCurrentWorkspace(); - const [advancedModeSettingsByWorkspace, setAdvancedModeSettingsByWorkspace] = useLocalStorage( - "advancedMode", - {} - ); - - const isAdvancedMode = (advancedModeSettingsByWorkspace || {})[workspaceId] ?? false; - const setAdvancedMode = (newSetting: boolean) => - setAdvancedModeSettingsByWorkspace({ ...advancedModeSettingsByWorkspace, [workspaceId]: newSetting }); - - return [isAdvancedMode, setAdvancedMode]; -}; diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index 2765d6f1a38bc..d48e12c1b701f 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -113,11 +113,9 @@ "form.url.error": "field must be a valid URL", "form.setupGuide": "Setup Guide", "form.wait": "Please wait a little bit more…", - "form.advancedMode.label": "Advanced mode", - "form.advancedMode.switchLabel": "Enable advanced mode", - "form.advancedMode.tooltip": "When Advanced Mode is enabled, certain views will display additional technical information.", "form.optional": "Optional", + "connectionForm.settings.advancedButton": "Advanced", "connectionForm.validation.error": "The form is invalid. Please make sure that all fields are correct.", "connectionForm.normalization.title": "Normalization", "connectionForm.operations.notSupported": "Normalization and Transformation operations are not supported for this connection.", diff --git a/airbyte-webapp/src/packages/cloud/locales/en.json b/airbyte-webapp/src/packages/cloud/locales/en.json index 9613710f325b6..e154f02eb869a 100644 --- a/airbyte-webapp/src/packages/cloud/locales/en.json +++ b/airbyte-webapp/src/packages/cloud/locales/en.json @@ -108,9 +108,6 @@ "settings.generalSettings.changeWorkspace": "Change Workspace", "settings.generalSettings.form.name.label": "Workspace name", "settings.generalSettings.form.name.placeholder": "Workspace name", - "settings.generalSettings.form.advancedMode.label": "Advanced mode", - "settings.generalSettings.form.advancedMode.switchLabel": "Enable advanced mode", - "settings.generalSettings.form.advancedMode.tooltip": "When Advanced Mode is enabled, certain views will display additional technical information.", "settings.generalSettings.deleteLabel": "Delete your workspace", "settings.generalSettings.deleteText": "Delete", "settings.accessManagementSettings": "Access Management", diff --git a/airbyte-webapp/src/packages/cloud/views/workspaces/WorkspaceSettingsView/WorkspaceSettingsView.tsx b/airbyte-webapp/src/packages/cloud/views/workspaces/WorkspaceSettingsView/WorkspaceSettingsView.tsx index 5982f9a047c2c..424c786006cce 100644 --- a/airbyte-webapp/src/packages/cloud/views/workspaces/WorkspaceSettingsView/WorkspaceSettingsView.tsx +++ b/airbyte-webapp/src/packages/cloud/views/workspaces/WorkspaceSettingsView/WorkspaceSettingsView.tsx @@ -4,12 +4,10 @@ import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; import * as yup from "yup"; -import { Label, LabeledInput, LabeledSwitch } from "components"; +import { LabeledInput } from "components"; import { Button } from "components/ui/Button"; -import { InfoTooltip } from "components/ui/Tooltip"; import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics"; -import { useAdvancedModeSetting } from "hooks/services/useAdvancedModeSetting"; import { useCurrentWorkspace } from "hooks/services/useWorkspace"; import { useRemoveCloudWorkspace, @@ -20,15 +18,6 @@ import { useInvalidateWorkspace, useWorkspaceService } from "services/workspaces import styles from "./WorkspaceSettingsView.module.scss"; -const AdvancedModeSwitchLabel = () => ( - <> - - - - - -); - const ValidationSchema = yup.object().shape({ name: yup.string().required("form.empty.error"), }); @@ -41,7 +30,6 @@ export const WorkspaceSettingsView: React.FC = () => { const { mutateAsync: removeCloudWorkspace, isLoading: isRemovingCloudWorkspace } = useRemoveCloudWorkspace(); const { mutateAsync: updateCloudWorkspace } = useUpdateCloudWorkspace(); const invalidateWorkspace = useInvalidateWorkspace(workspace.workspaceId); - const [isAdvancedMode, setAdvancedMode] = useAdvancedModeSetting(); return ( <> @@ -58,11 +46,9 @@ export const WorkspaceSettingsView: React.FC = () => { { const { workspaceId } = workspace; - setAdvancedMode(payload.advancedMode); await updateCloudWorkspace({ workspaceId, name: payload.name, @@ -72,7 +58,7 @@ export const WorkspaceSettingsView: React.FC = () => { enableReinitialize validationSchema={ValidationSchema} > - {({ dirty, isSubmitting, resetForm, isValid, setFieldValue }) => ( + {({ dirty, isSubmitting, resetForm, isValid }) => (
    @@ -89,18 +75,6 @@ export const WorkspaceSettingsView: React.FC = () => { /> )} - - - {({ field }: FieldProps) => ( - } - checked={field.value} - onChange={() => setFieldValue(field.name, !field.value)} - /> - )} -
    -------- @@ -7,7 +7,7 @@ border-spacing: 0; width: 100%; max-width: 100%; - border-radius: vars.$border-radius-md; + border-radius: variables.$border-radius-md; } .thead { @@ -28,13 +28,13 @@ font-weight: 600; &:first-child { - padding-left: calc(vars.$spacing-2xl + vars.$spacing-sm); - border-radius: vars.$border-radius-md 0 0; + padding-left: calc(variables.$spacing-2xl + variables.$spacing-sm); + border-radius: variables.$border-radius-md 0 0; } &:last-child { - padding-left: vars.$spacing-lg; - border-radius: 0 vars.$border-radius-md 0 0; + padding-left: variables.$spacing-lg; + border-radius: 0 variables.$border-radius-md 0 0; } } @@ -51,7 +51,7 @@ // ---------
    --------- .td { - padding: vars.$spacing-lg calc(vars.$spacing-md + vars.$spacing-xs); + padding: variables.$spacing-lg calc(variables.$spacing-md + variables.$spacing-xs); font-size: 12px; line-height: 15px; font-weight: normal; @@ -59,18 +59,18 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - border-bottom: vars.$border-thin solid colors.$grey-100; + border-bottom: variables.$border-thin solid colors.$grey-100; width: auto; tr:last-child > & { border-bottom: none; &:first-child { - border-radius: 0 0 0 vars.$border-radius-md; + border-radius: 0 0 0 variables.$border-radius-md; } &:last-child { - border-radius: 0 0 vars.$border-radius-md; + border-radius: 0 0 variables.$border-radius-md; } } } diff --git a/airbyte-webapp/src/components/ui/Toast/Toast.module.scss b/airbyte-webapp/src/components/ui/Toast/Toast.module.scss index d14a776aa30b1..36a8276825858 100644 --- a/airbyte-webapp/src/components/ui/Toast/Toast.module.scss +++ b/airbyte-webapp/src/components/ui/Toast/Toast.module.scss @@ -1,5 +1,5 @@ @use "scss/colors"; -@use "scss/variables" as vars; +@use "scss/variables"; @use "scss/z-indices"; @use "scss/mixins"; @@ -38,17 +38,17 @@ $toast-bottom-margin: 27px; display: flex; flex-direction: row; align-items: flex-start; - gap: vars.$spacing-md; - max-width: vars.$width-max-notification; + gap: variables.$spacing-md; + max-width: variables.$width-max-notification; position: fixed; box-sizing: border-box; bottom: $toast-bottom-margin; - margin-left: calc(vars.$width-size-menu / 2); + margin-left: calc(variables.$width-size-menu / 2); left: 50%; transform: translate(-50%, 0); z-index: z-indices.$notification; - padding: vars.$spacing-md; - border-radius: vars.$border-radius-md; + padding: variables.$spacing-md; + border-radius: variables.$border-radius-md; animation: slide-up-animations 0.25s ease-out; @include mixins.shadow; @@ -64,8 +64,8 @@ $toast-bottom-margin: 27px; height: $toast-icon-container-size; max-height: $toast-icon-container-size; min-width: $toast-icon-container-size; - padding: vars.$border-radius-md; - border-radius: vars.$border-radius-md; + padding: variables.$border-radius-md; + border-radius: variables.$border-radius-md; box-sizing: border-box; display: flex; align-items: center; @@ -89,7 +89,7 @@ $toast-bottom-margin: 27px; } .actionButton { - margin-top: vars.$spacing-xs; + margin-top: variables.$spacing-xs; } .closeButton { diff --git a/airbyte-webapp/src/packages/cloud/views/auth/OAuthLogin/OAuthLogin.module.scss b/airbyte-webapp/src/packages/cloud/views/auth/OAuthLogin/OAuthLogin.module.scss index bbe1cea8a1128..e6e13509bcaf7 100644 --- a/airbyte-webapp/src/packages/cloud/views/auth/OAuthLogin/OAuthLogin.module.scss +++ b/airbyte-webapp/src/packages/cloud/views/auth/OAuthLogin/OAuthLogin.module.scss @@ -1,10 +1,10 @@ -@use "../../../../../scss/variables" as vars; -@use "../../../../../scss/colors"; +@use "scss/variables"; +@use "scss/colors"; .buttons { display: grid; grid-template-columns: 1fr; - gap: vars.$spacing-sm; + gap: variables.$spacing-sm; } .spinner { @@ -31,11 +31,11 @@ font-size: 16px; font-weight: 500; width: 100%; - margin: vars.$spacing-sm auto; - padding: vars.$spacing-md; - gap: vars.$spacing-md; - border-radius: vars.$border-radius-md; - transition: all vars.$transition; + margin: variables.$spacing-sm auto; + padding: variables.$spacing-md; + gap: variables.$spacing-md; + border-radius: variables.$border-radius-md; + transition: all variables.$transition; cursor: pointer; &:hover, @@ -49,6 +49,6 @@ } .error { - margin-top: vars.$spacing-lg; + margin-top: variables.$spacing-lg; color: colors.$red; } diff --git a/airbyte-webapp/src/packages/cloud/views/auth/SignupPage/components/Separator.module.scss b/airbyte-webapp/src/packages/cloud/views/auth/SignupPage/components/Separator.module.scss index aedcba0ca9853..f1bcb5d46e189 100644 --- a/airbyte-webapp/src/packages/cloud/views/auth/SignupPage/components/Separator.module.scss +++ b/airbyte-webapp/src/packages/cloud/views/auth/SignupPage/components/Separator.module.scss @@ -1,9 +1,9 @@ -@use "../../../../../../scss/variables" as vars; -@use "../../../../../../scss/colors"; +@use "scss/variables"; +@use "scss/colors"; .separator { display: flex; - padding: vars.$spacing-md 0; + padding: variables.$spacing-md 0; font-size: 16px; text-align: center; font-weight: bold; @@ -19,10 +19,10 @@ } &::before { - margin-right: vars.$spacing-md; + margin-right: variables.$spacing-md; } &::after { - margin-left: vars.$spacing-md; + margin-left: variables.$spacing-md; } } diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorServiceTypeControl.module.scss b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorServiceTypeControl.module.scss index 530470fee870e..5cb031bfb35ea 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorServiceTypeControl.module.scss +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Controls/ConnectorServiceTypeControl/ConnectorServiceTypeControl.module.scss @@ -1,10 +1,10 @@ @use "scss/colors"; -@use "scss/variables" as vars; +@use "scss/variables"; .connectorListFooter { width: 100%; - padding: vars.$spacing-md; - border-top: vars.$border-thin solid colors.$grey-50; + padding: variables.$spacing-md; + border-top: variables.$border-thin solid colors.$grey-50; min-height: 36px; position: relative; @@ -12,7 +12,7 @@ display: flex; flex-direction: row; align-items: center; - gap: vars.$spacing-md; + gap: variables.$spacing-md; border: none; cursor: pointer; background: colors.$white; @@ -28,7 +28,7 @@ display: flex; flex-direction: row; align-items: center; - gap: vars.$spacing-md; + gap: variables.$spacing-md; } .stageLabel { @@ -37,7 +37,7 @@ background: colors.$grey-100; color: colors.$dark-blue; text-transform: uppercase; - border-radius: vars.$border-radius-pill; + border-radius: variables.$border-radius-pill; font-weight: 500; font-size: 8px; line-height: 10px; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSpinner.module.scss b/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSpinner.module.scss index c6230db871ec6..6b2ffd07f6315 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSpinner.module.scss +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSpinner.module.scss @@ -1,12 +1,12 @@ -@use "../../../../scss/variables" as vars; +@use "scss/variables"; .container { - margin: 34px 0 vars.$spacing-md; + margin: 34px 0 variables.$spacing-md; display: flex; align-items: center; justify-content: center; } .button { - margin-left: vars.$spacing-md; + margin-left: variables.$spacing-md; } diff --git a/airbyte-webapp/src/views/Connector/RequestConnectorModal/RequestConnectorModal.module.scss b/airbyte-webapp/src/views/Connector/RequestConnectorModal/RequestConnectorModal.module.scss index 6a80fe3b575f3..f1a18c3460efc 100644 --- a/airbyte-webapp/src/views/Connector/RequestConnectorModal/RequestConnectorModal.module.scss +++ b/airbyte-webapp/src/views/Connector/RequestConnectorModal/RequestConnectorModal.module.scss @@ -1,4 +1,4 @@ -@use "../../../scss/variables" as vars; +@use "scss/variables"; .modalBody { overflow: unset; @@ -6,7 +6,7 @@ } .controlLabel { - margin-bottom: vars.$spacing-xl; + margin-bottom: variables.$spacing-xl; } .requestButton { From 19fdca0aade9d285aac63c4e3ea1786e82fdc4d8 Mon Sep 17 00:00:00 2001 From: Joey Marshment-Howell Date: Fri, 27 Jan 2023 13:30:50 +0100 Subject: [PATCH 136/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=90=9B=20Fix=20typ?= =?UTF-8?q?e=20error=20=20(#21966)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- airbyte-webapp/src/core/request/apiOverride.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/airbyte-webapp/src/core/request/apiOverride.ts b/airbyte-webapp/src/core/request/apiOverride.ts index 0d663a258d978..a232bc2bb88db 100644 --- a/airbyte-webapp/src/core/request/apiOverride.ts +++ b/airbyte-webapp/src/core/request/apiOverride.ts @@ -15,6 +15,7 @@ function getRequestBody(data: U) { if (nonJsonObject) { // The app tries to stringify blobs which results in broken functionality. // There may be some edge cases where we pass in an empty object. + // @ts-expect-error There may be a better way to do this, but for now it solves the problem. return data as BodyInit; } return stringifiedData; From 1697b8efb5730d7d6c28c9e9ed5a188ca4a05d9e Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Fri, 27 Jan 2023 14:26:40 +0100 Subject: [PATCH 137/195] =?UTF-8?q?=F0=9F=AA=9F=F0=9F=8E=A8=20Clean=20up?= =?UTF-8?q?=20connector=20form=20form=20controls=20=20(#21698)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor * review comments * do not pass changes to retest source * reorder imports --- .../common/DeleteBlock/DeleteBlock.tsx | 22 +-- .../StreamTestingPanel/ConfigMenu.tsx | 36 ++-- airbyte-webapp/src/hooks/useDeleteModal.tsx | 23 +++ airbyte-webapp/src/locales/en.json | 9 +- .../components/SourceSettings.tsx | 13 +- .../DestinationSettingsPage.tsx | 12 +- .../ConnectorCard/ConnectorCard.module.scss | 8 - .../Connector/ConnectorCard/ConnectorCard.tsx | 165 +++++++++--------- .../ConnectorCard/components/Controls.tsx | 73 ++++++++ .../components/TestCard.module.scss | 5 + .../ConnectorCard/components/TestCard.tsx | 120 +++++++++++++ .../TestingConnectionSpinner.module.scss | 0 .../components/TestingConnectionSpinner.tsx | 0 .../components/TestingConnectionSuccess.tsx | 17 ++ .../ConnectorForm/ConnectorForm.test.tsx | 42 +---- .../Connector/ConnectorForm/ConnectorForm.tsx | 75 +++----- .../ConnectorForm/FormRoot.module.scss | 5 + .../Connector/ConnectorForm/FormRoot.tsx | 118 ++++++------- .../components/CreateControls.module.scss | 19 -- .../components/CreateControls.tsx | 73 -------- .../components/EditControls.module.scss | 16 -- .../ConnectorForm/components/EditControls.tsx | 78 --------- .../components/Sections/auth/AuthSection.tsx | 5 +- .../components/TestingConnectionError.tsx | 44 ++--- .../components/TestingConnectionSuccess.tsx | 33 ---- .../ConnectorForm/connectorFormContext.tsx | 4 +- .../Connector/ConnectorForm/useBuildForm.tsx | 24 ++- 27 files changed, 501 insertions(+), 538 deletions(-) create mode 100644 airbyte-webapp/src/hooks/useDeleteModal.tsx create mode 100644 airbyte-webapp/src/views/Connector/ConnectorCard/components/Controls.tsx create mode 100644 airbyte-webapp/src/views/Connector/ConnectorCard/components/TestCard.module.scss create mode 100644 airbyte-webapp/src/views/Connector/ConnectorCard/components/TestCard.tsx rename airbyte-webapp/src/views/Connector/{ConnectorForm => ConnectorCard}/components/TestingConnectionSpinner.module.scss (100%) rename airbyte-webapp/src/views/Connector/{ConnectorForm => ConnectorCard}/components/TestingConnectionSpinner.tsx (100%) create mode 100644 airbyte-webapp/src/views/Connector/ConnectorCard/components/TestingConnectionSuccess.tsx create mode 100644 airbyte-webapp/src/views/Connector/ConnectorForm/FormRoot.module.scss delete mode 100644 airbyte-webapp/src/views/Connector/ConnectorForm/components/CreateControls.module.scss delete mode 100644 airbyte-webapp/src/views/Connector/ConnectorForm/components/CreateControls.tsx delete mode 100644 airbyte-webapp/src/views/Connector/ConnectorForm/components/EditControls.module.scss delete mode 100644 airbyte-webapp/src/views/Connector/ConnectorForm/components/EditControls.tsx delete mode 100644 airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSuccess.tsx diff --git a/airbyte-webapp/src/components/common/DeleteBlock/DeleteBlock.tsx b/airbyte-webapp/src/components/common/DeleteBlock/DeleteBlock.tsx index 548ad268ffaea..684d6dcbf92d4 100644 --- a/airbyte-webapp/src/components/common/DeleteBlock/DeleteBlock.tsx +++ b/airbyte-webapp/src/components/common/DeleteBlock/DeleteBlock.tsx @@ -1,12 +1,11 @@ -import React, { useCallback } from "react"; +import React from "react"; import { FormattedMessage } from "react-intl"; -import { useNavigate } from "react-router-dom"; import { H5 } from "components/base/Titles"; import { Button } from "components/ui/Button"; import { Card } from "components/ui/Card"; -import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; +import { useDeleteModal } from "hooks/useDeleteModal"; import styles from "./DeleteBlock.module.scss"; @@ -16,22 +15,7 @@ interface IProps { } export const DeleteBlock: React.FC = ({ type, onDelete }) => { - const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); - const navigate = useNavigate(); - - const onDeleteButtonClick = useCallback(() => { - openConfirmationModal({ - text: `tables.${type}DeleteModalText`, - title: `tables.${type}DeleteConfirm`, - submitButtonText: "form.delete", - onSubmit: async () => { - await onDelete(); - closeConfirmationModal(); - navigate("../.."); - }, - submitButtonDataId: "delete", - }); - }, [closeConfirmationModal, onDelete, openConfirmationModal, navigate, type]); + const onDeleteButtonClick = useDeleteModal(type, onDelete); return ( diff --git a/airbyte-webapp/src/components/connectorBuilder/StreamTestingPanel/ConfigMenu.tsx b/airbyte-webapp/src/components/connectorBuilder/StreamTestingPanel/ConfigMenu.tsx index 0596304949d84..696e02fc6125f 100644 --- a/airbyte-webapp/src/components/connectorBuilder/StreamTestingPanel/ConfigMenu.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/StreamTestingPanel/ConfigMenu.tsx @@ -1,11 +1,12 @@ import { faClose, faUser } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useMemo } from "react"; -import { FormattedMessage, useIntl } from "react-intl"; +import { FormattedMessage } from "react-intl"; import { useLocalStorage } from "react-use"; import { Button } from "components/ui/Button"; import { Callout } from "components/ui/Callout"; +import { FlexContainer, FlexItem } from "components/ui/Flex"; import { Modal, ModalBody } from "components/ui/Modal"; import { NumberBadge } from "components/ui/NumberBadge"; import { Tooltip } from "components/ui/Tooltip"; @@ -27,7 +28,6 @@ interface ConfigMenuProps { } export const ConfigMenu: React.FC = ({ className, testInputJsonErrors, isOpen, setIsOpen }) => { - const { formatMessage } = useIntl(); const { jsonManifest, editorView, setEditorView } = useConnectorBuilderFormState(); const { testInputJson, setTestInputJson } = useConnectorBuilderTestState(); @@ -112,20 +112,36 @@ export const ConfigMenu: React.FC = ({ className, testInputJson { setTestInputJson(values.connectionConfiguration as StreamReadRequestBodyConfig); setIsOpen(false); }} - onCancel={() => { - setIsOpen(false); - }} - onReset={() => { - setTestInputJson({}); - }} - submitLabel={formatMessage({ id: "connectorBuilder.saveInputsForm" })} + renderFooter={({ dirty, isSubmitting, resetConnectorForm }) => ( +
    + + + + + + + +
    + )} /> diff --git a/airbyte-webapp/src/hooks/useDeleteModal.tsx b/airbyte-webapp/src/hooks/useDeleteModal.tsx new file mode 100644 index 0000000000000..17f1d87c1e41b --- /dev/null +++ b/airbyte-webapp/src/hooks/useDeleteModal.tsx @@ -0,0 +1,23 @@ +import { useCallback } from "react"; +import { useNavigate } from "react-router-dom"; + +import { useConfirmationModalService } from "./services/ConfirmationModal"; + +export function useDeleteModal(type: "source" | "destination" | "connection", onDelete: () => Promise) { + const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService(); + const navigate = useNavigate(); + + return useCallback(() => { + openConfirmationModal({ + text: `tables.${type}DeleteModalText`, + title: `tables.${type}DeleteConfirm`, + submitButtonText: "form.delete", + onSubmit: async () => { + await onDelete(); + closeConfirmationModal(); + navigate("../.."); + }, + submitButtonDataId: "delete", + }); + }, [closeConfirmationModal, onDelete, openConfirmationModal, navigate, type]); +} diff --git a/airbyte-webapp/src/locales/en.json b/airbyte-webapp/src/locales/en.json index d48e12c1b701f..4b7240a3f3566 100644 --- a/airbyte-webapp/src/locales/en.json +++ b/airbyte-webapp/src/locales/en.json @@ -62,9 +62,12 @@ "form.saveChanges": "Save changes", "form.openDatepicker": "Open datepicker", "form.datepickerTimeCaption": "Time (UTC)", - "form.saveChangesAndTest": "Save changes and test", - "form.sourceRetest": "Retest source", - "form.destinationRetest": "Retest destination", + "form.saveChangesAndTest": "Test and save", + "form.sourceRetest": "Retest saved source", + "form.destinationRetest": "Retest saved destination", + "form.test": "Test", + "form.sourceRetestTitle": "Test the source", + "form.destinationRetestTitle": "Test the destination", "form.discardChanges": "Discard changes", "form.discardChangesConfirmation": "There are unsaved changes. Are you sure you want to discard your changes?", "form.every.minutes": "Every {value, plural, one {minute} other {# minutes}}", diff --git a/airbyte-webapp/src/pages/SourcesPage/pages/SourceItemPage/components/SourceSettings.tsx b/airbyte-webapp/src/pages/SourcesPage/pages/SourceItemPage/components/SourceSettings.tsx index f1b21954adb9e..54f55047a132b 100644 --- a/airbyte-webapp/src/pages/SourcesPage/pages/SourceItemPage/components/SourceSettings.tsx +++ b/airbyte-webapp/src/pages/SourcesPage/pages/SourceItemPage/components/SourceSettings.tsx @@ -1,13 +1,12 @@ -import React, { useEffect } from "react"; +import React, { useCallback, useEffect } from "react"; import { FormattedMessage } from "react-intl"; -import { DeleteBlock } from "components/common/DeleteBlock"; - import { ConnectionConfiguration } from "core/domain/connection"; import { SourceRead, WebBackendConnectionListItem } from "core/request/AirbyteClient"; import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics"; import { useFormChangeTrackerService, useUniqueFormId } from "hooks/services/FormChangeTracker"; import { useDeleteSource, useUpdateSource } from "hooks/services/useSourceHook"; +import { useDeleteModal } from "hooks/useDeleteModal"; import { useSourceDefinition } from "services/connector/SourceDefinitionService"; import { useGetSourceDefinitionSpecification } from "services/connector/SourceDefinitionSpecificationService"; import { ConnectorCard } from "views/Connector/ConnectorCard"; @@ -49,10 +48,12 @@ const SourceSettings: React.FC = ({ currentSource, connecti }); }; - const onDelete = async () => { + const onDelete = useCallback(async () => { clearFormChange(formId); await deleteSource({ connectionsWithSource, source: currentSource }); - }; + }, [clearFormChange, connectionsWithSource, currentSource, deleteSource, formId]); + + const onDeleteClick = useDeleteModal("source", onDelete); return (
    @@ -66,8 +67,8 @@ const SourceSettings: React.FC = ({ currentSource, connecti selectedConnectorDefinitionId={sourceDefinitionSpecification.sourceDefinitionId} connector={currentSource} onSubmit={onSubmit} + onDeleteClick={onDeleteClick} /> -
    ); }; diff --git a/airbyte-webapp/src/pages/destination/DestinationSettingsPage/DestinationSettingsPage.tsx b/airbyte-webapp/src/pages/destination/DestinationSettingsPage/DestinationSettingsPage.tsx index 33cd33acb4193..9e46d6bed34ee 100644 --- a/airbyte-webapp/src/pages/destination/DestinationSettingsPage/DestinationSettingsPage.tsx +++ b/airbyte-webapp/src/pages/destination/DestinationSettingsPage/DestinationSettingsPage.tsx @@ -1,14 +1,14 @@ -import React from "react"; +import React, { useCallback } from "react"; import { FormattedMessage } from "react-intl"; import { useParams } from "react-router-dom"; -import { DeleteBlock } from "components/common/DeleteBlock"; import { StepsTypes } from "components/ConnectorBlocks"; import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics"; import { useFormChangeTrackerService, useUniqueFormId } from "hooks/services/FormChangeTracker"; import { useConnectionList } from "hooks/services/useConnectionHook"; import { useDeleteDestination, useGetDestination, useUpdateDestination } from "hooks/services/useDestinationHook"; +import { useDeleteModal } from "hooks/useDeleteModal"; import { useDestinationDefinition } from "services/connector/DestinationDefinitionService"; import { useGetDestinationDefinitionSpecification } from "services/connector/DestinationDefinitionSpecificationService"; import { ConnectorCard } from "views/Connector/ConnectorCard"; @@ -36,13 +36,15 @@ export const DestinationSettingsPage: React.FC = () => { }); }; - const onDelete = async () => { + const onDelete = useCallback(async () => { clearFormChange(formId); await deleteDestination({ connectionsWithDestination, destination, }); - }; + }, [clearFormChange, connectionsWithDestination, deleteDestination, destination, formId]); + + const onDeleteClick = useDeleteModal("destination", onDelete); return (
    @@ -56,8 +58,8 @@ export const DestinationSettingsPage: React.FC = () => { selectedConnectorDefinitionId={destinationSpecification.destinationDefinitionId} connector={destination} onSubmit={onSubmitForm} + onDeleteClick={onDeleteClick} /> -
    ); }; diff --git a/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.module.scss b/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.module.scss index 24d8851b643e0..ca3da58cf15f0 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.module.scss +++ b/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.module.scss @@ -1,9 +1,5 @@ @use "scss/variables"; -.cardForm { - padding: 22px 27px 23px 24px; -} - .connectorSelectControl { margin-bottom: variables.$spacing-xl; } @@ -19,7 +15,3 @@ margin-top: variables.$spacing-md; margin-left: variables.$spacing-lg; } - -.connectionTestLogs { - margin-top: variables.$spacing-lg; -} diff --git a/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.tsx b/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.tsx index c78951ad9525b..55a474a0c17d5 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard.tsx @@ -1,11 +1,5 @@ -import { faChevronDown, faChevronRight } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { useEffect, useMemo, useState } from "react"; -import { FormattedMessage } from "react-intl"; -import { JobLogs } from "components/JobItem/components/JobLogs"; -import { Button } from "components/ui/Button"; -import { Card } from "components/ui/Card"; import { Spinner } from "components/ui/Spinner"; import { @@ -18,13 +12,9 @@ import { import { DestinationRead, SourceRead, SynchronousJobRead } from "core/request/AirbyteClient"; import { LogsRequestError } from "core/request/LogsRequestError"; import { generateMessageFromError } from "utils/errorStatusMessage"; -import { - ConnectorCardValues, - ConnectorForm, - ConnectorFormProps, - ConnectorFormValues, -} from "views/Connector/ConnectorForm"; +import { ConnectorCardValues, ConnectorForm, ConnectorFormValues } from "views/Connector/ConnectorForm"; +import { Controls } from "./components/Controls"; import ShowLoadingMessage from "./components/ShowLoadingMessage"; import styles from "./ConnectorCard.module.scss"; import { useAnalyticsTrackFunctions } from "./useAnalyticsTrackFunctions"; @@ -43,6 +33,7 @@ interface ConnectorCardBaseProps { jobInfo?: SynchronousJobRead | null; additionalSelectorComponent?: React.ReactNode; onSubmit: (values: ConnectorCardValues) => Promise | void; + onDeleteClick?: () => void; onConnectorDefinitionSelect?: (id: string) => void; availableConnectorDefinitions: ConnectorDefinition[]; @@ -75,20 +66,16 @@ const getConnectorId = (connectorRead: DestinationRead | SourceRead) => { }; export const ConnectorCard: React.FC = ({ - title, - description, - full, jobInfo, onSubmit, + onDeleteClick, additionalSelectorComponent, selectedConnectorDefinitionId, fetchingConnectorError, ...props }) => { - const [saved, setSaved] = useState(false); const [errorStatusRequest, setErrorStatusRequest] = useState(null); const [isFormSubmitting, setIsFormSubmitting] = useState(false); - const [logsVisible, setLogsVisible] = useState(false); const { setDocumentationUrl, setDocumentationPanelOpen } = useDocumentationPanelContext(); const { @@ -139,9 +126,25 @@ export const ConnectorCard: React.FC { + const testConnectorWithTracking = async (connectorCardValues?: ConnectorCardValues) => { + trackTestConnectorStarted(selectedConnectorDefinition); + try { + await testConnector(connectorCardValues); + trackTestConnectorSuccess(selectedConnectorDefinition); + } catch (e) { + trackTestConnectorFailure(selectedConnectorDefinition); + throw e; + } + }; + + const handleTestConnector = async (values?: ConnectorCardValues) => { setErrorStatusRequest(null); - return testConnector(v); + try { + await testConnectorWithTracking(values); + } catch (e) { + setErrorStatusRequest(e); + throw e; + } }; const onHandleSubmit = async (values: ConnectorFormValues) => { @@ -157,21 +160,9 @@ export const ConnectorCard: React.FC { - trackTestConnectorStarted(selectedConnectorDefinition); - try { - await testConnector(connectorCardValues); - trackTestConnectorSuccess(selectedConnectorDefinition); - } catch (e) { - trackTestConnectorFailure(selectedConnectorDefinition); - throw e; - } - }; - try { - await testConnectorWithTracking(); + await testConnectorWithTracking(connectorCardValues); onSubmit(connectorCardValues); - setSaved(true); } catch (e) { setErrorStatusRequest(e); setIsFormSubmitting(false); @@ -191,21 +182,21 @@ export const ConnectorCard: React.FC -
    -
    - -
    - {additionalSelectorComponent} -
    + +
    + +
    + {additionalSelectorComponent} {props.isLoading && (
    @@ -215,42 +206,48 @@ export const ConnectorCard: React.FC )} {fetchingConnectorError && } - {selectedConnectorDefinition && selectedConnectorDefinitionSpecification && ( - } - connectorId={isEditMode ? getConnectorId(props.connector) : undefined} - /> - )} - {job && ( -
    - - {logsVisible && } -
    - )} -
    -
    - + + } + // Causes the whole ConnectorForm to be unmounted and a new instance mounted whenever the connector type changes. + // That way we carry less state around inside it, preventing any state from one connector type from affecting another + // connector type's form in any way. + key={selectedConnectorDefinition && Connector.id(selectedConnectorDefinition)} + {...props} + selectedConnectorDefinition={selectedConnectorDefinition} + selectedConnectorDefinitionSpecification={selectedConnectorDefinitionSpecification} + isTestConnectionInProgress={isTestConnectionInProgress} + connectionTestSuccess={connectionTestSuccess} + onSubmit={onHandleSubmit} + formValues={formValues} + connectorId={isEditMode ? getConnectorId(props.connector) : undefined} + renderFooter={({ dirty, isSubmitting, isValid, resetConnectorForm, getValues }) => ( + { + if (!selectedConnectorDefinitionId) { + return; + } + handleTestConnector( + isEditMode ? undefined : { ...getValues(), serviceType: selectedConnectorDefinitionId } + ); + }} + onDeleteClick={onDeleteClick} + isValid={isValid} + dirty={dirty} + job={job ? job : undefined} + onCancelClick={() => { + resetConnectorForm(); + }} + connectionTestSuccess={connectionTestSuccess} + /> + )} + renderWithCard + /> ); }; diff --git a/airbyte-webapp/src/views/Connector/ConnectorCard/components/Controls.tsx b/airbyte-webapp/src/views/Connector/ConnectorCard/components/Controls.tsx new file mode 100644 index 0000000000000..b2a3e7527ba82 --- /dev/null +++ b/airbyte-webapp/src/views/Connector/ConnectorCard/components/Controls.tsx @@ -0,0 +1,73 @@ +import React from "react"; +import { FormattedMessage } from "react-intl"; + +import { Button } from "components/ui/Button"; +import { FlexContainer, FlexItem } from "components/ui/Flex"; + +import { SynchronousJobRead } from "core/request/AirbyteClient"; + +import { TestCard } from "./TestCard"; + +interface IProps { + formType: "source" | "destination"; + isSubmitting: boolean; + isValid: boolean; + dirty: boolean; + onCancelClick: () => void; + onDeleteClick?: () => void; + onRetestClick: () => void; + onCancelTesting: () => void; + isTestConnectionInProgress?: boolean; + errorMessage?: React.ReactNode; + job?: SynchronousJobRead; + connectionTestSuccess: boolean; + hasDefinition: boolean; + isEditMode: boolean; +} + +export const Controls: React.FC = ({ + isTestConnectionInProgress, + isSubmitting, + formType, + hasDefinition, + isEditMode, + dirty, + onDeleteClick, + onCancelClick, + ...restProps +}) => { + return ( + <> + {hasDefinition && ( + + )} + + + {isEditMode && ( + + )} + + {isEditMode && ( + + )} + + + + ); +}; diff --git a/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestCard.module.scss b/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestCard.module.scss new file mode 100644 index 0000000000000..9c08b01bf1573 --- /dev/null +++ b/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestCard.module.scss @@ -0,0 +1,5 @@ +@use "scss/variables"; + +.cardTest { + padding: variables.$spacing-xl; +} diff --git a/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestCard.tsx b/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestCard.tsx new file mode 100644 index 0000000000000..75dac5a0e05bc --- /dev/null +++ b/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestCard.tsx @@ -0,0 +1,120 @@ +import { faChevronDown, faChevronRight, faClose, faRefresh } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { useState } from "react"; +import { FormattedMessage } from "react-intl"; + +import { JobLogs } from "components/JobItem/components/JobLogs"; +import { Button } from "components/ui/Button"; +import { Card } from "components/ui/Card"; +import { FlexContainer, FlexItem } from "components/ui/Flex"; +import { ProgressBar } from "components/ui/ProgressBar"; +import { Text } from "components/ui/Text"; + +import { SynchronousJobRead } from "core/request/AirbyteClient"; + +import styles from "./TestCard.module.scss"; +import TestingConnectionSuccess from "./TestingConnectionSuccess"; +import { TestingConnectionError } from "../../ConnectorForm/components/TestingConnectionError"; + +interface IProps { + formType: "source" | "destination"; + isValid: boolean; + onRetestClick: () => void; + onCancelTesting: () => void; + isTestConnectionInProgress?: boolean; + successMessage?: React.ReactNode; + errorMessage?: React.ReactNode; + job?: SynchronousJobRead; + isEditMode?: boolean; + dirty: boolean; + connectionTestSuccess: boolean; +} + +const PROGRESS_BAR_TIME = 60 * 2; + +export const TestCard: React.FC = ({ + isTestConnectionInProgress, + isValid, + formType, + onRetestClick, + connectionTestSuccess, + errorMessage, + onCancelTesting, + job, + isEditMode, + dirty, +}) => { + const [logsVisible, setLogsVisible] = useState(false); + + const renderStatusMessage = () => { + if (errorMessage) { + return ( + + + {job && ( +
    + + {logsVisible && } +
    + )} +
    + ); + } + if (connectionTestSuccess) { + return ; + } + return null; + }; + + return ( + + + + + + + + + {isTestConnectionInProgress ? ( + + ) : ( + + )} + + {isTestConnectionInProgress ? ( + + + + ) : ( + renderStatusMessage() + )} + + + ); +}; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSpinner.module.scss b/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestingConnectionSpinner.module.scss similarity index 100% rename from airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSpinner.module.scss rename to airbyte-webapp/src/views/Connector/ConnectorCard/components/TestingConnectionSpinner.module.scss diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSpinner.tsx b/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestingConnectionSpinner.tsx similarity index 100% rename from airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSpinner.tsx rename to airbyte-webapp/src/views/Connector/ConnectorCard/components/TestingConnectionSpinner.tsx diff --git a/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestingConnectionSuccess.tsx b/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestingConnectionSuccess.tsx new file mode 100644 index 0000000000000..2f364342f160e --- /dev/null +++ b/airbyte-webapp/src/views/Connector/ConnectorCard/components/TestingConnectionSuccess.tsx @@ -0,0 +1,17 @@ +import React from "react"; +import { FormattedMessage } from "react-intl"; + +import { FlexContainer } from "components/ui/Flex"; +import { StatusIcon } from "components/ui/StatusIcon"; +import { Text } from "components/ui/Text"; + +const TestingConnectionSuccess: React.FC = () => ( + + + + + + +); + +export default TestingConnectionSuccess; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.test.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.test.tsx index 6ce7e80830635..6858c7a266406 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.test.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.test.tsx @@ -8,7 +8,7 @@ import { render, useMockIntersectionObserver } from "test-utils/testutils"; import { ConnectorDefinition } from "core/domain/connector"; import { AirbyteJSONSchema } from "core/jsonSchema/types"; import { DestinationDefinitionSpecificationRead } from "core/request/AirbyteClient"; -import { ConnectorForm, ConnectorFormProps } from "views/Connector/ConnectorForm"; +import { ConnectorForm } from "views/Connector/ConnectorForm"; import { ConnectorFormValues } from "./types"; import { DocumentationPanelContext } from "../ConnectorDocumentationLayout/DocumentationPanelContext"; @@ -179,6 +179,7 @@ describe("Service Form", () => { formType="source" onSubmit={handleSubmit} selectedConnectorDefinition={connectorDefinition} + renderFooter={() => } selectedConnectorDefinitionSpecification={ // @ts-expect-error Partial objects for testing { @@ -260,6 +261,7 @@ describe("Service Form", () => { onSubmit={async (values) => { result = values; }} + renderFooter={() => } selectedConnectorDefinition={connectorDefinition} selectedConnectorDefinitionSpecification={ // @ts-expect-error Partial objects for testing @@ -390,42 +392,4 @@ describe("Service Form", () => { ]); }); }); - - describe("conditionally render form submit button", () => { - const renderConnectorForm = (props: ConnectorFormProps) => - render(); - // eslint-disable-next-line @typescript-eslint/no-empty-function - const onSubmitClb = async () => {}; - const connectorDefSpec = { - connectionSpecification: schema, - sourceDefinitionId: "test-service-type", - documentationUrl: "", - }; - - it("should render if connector is selected", async () => { - const { getByText } = await renderConnectorForm({ - selectedConnectorDefinition: connectorDefinition, - selectedConnectorDefinitionSpecification: - // @ts-expect-error Partial objects for testing - connectorDefSpec as DestinationDefinitionSpecificationRead, - formType: "destination", - onSubmit: onSubmitClb, - }); - expect(getByText(/Set up destination/)).toBeInTheDocument(); - }); - - it("should render if connector is selected", async () => { - const { getByText } = await renderConnectorForm({ - selectedConnectorDefinition: connectorDefinition, - selectedConnectorDefinitionSpecification: - // @ts-expect-error Partial objects for testing - connectorDefSpec as DestinationDefinitionSpecificationRead, - formType: "destination", - onSubmit: onSubmitClb, - isEditMode: true, - }); - - expect(getByText(/Save changes and test/)).toBeInTheDocument(); - }); - }); }); diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.tsx index f193a3f41e8c4..a5c14439c9972 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/ConnectorForm.tsx @@ -1,5 +1,5 @@ import { Formik } from "formik"; -import React, { useCallback } from "react"; +import React, { useCallback, useMemo } from "react"; import { FormChangeTracker } from "components/common/FormChangeTracker"; @@ -9,46 +9,40 @@ import { SourceDefinitionSpecificationDraft, } from "core/domain/connector"; import { FormikPatch } from "core/form/FormikPatch"; -import { CheckConnectionRead } from "core/request/AirbyteClient"; import { useFormChangeTrackerService, useUniqueFormId } from "hooks/services/FormChangeTracker"; import { ConnectorFormContextProvider } from "./connectorFormContext"; -import { FormRoot } from "./FormRoot"; -import { ConnectorCardValues, ConnectorFormValues } from "./types"; +import { BaseFormRootProps, FormRoot } from "./FormRoot"; +import { ConnectorFormValues } from "./types"; import { useBuildForm } from "./useBuildForm"; -export interface ConnectorFormProps { +interface BaseConnectorFormProps extends Omit { formType: "source" | "destination"; formId?: string; /** * Definition of the connector might not be available if it's not released but only exists in frontend heap */ selectedConnectorDefinition?: ConnectorDefinition; - selectedConnectorDefinitionSpecification: ConnectorDefinitionSpecification | SourceDefinitionSpecificationDraft; + selectedConnectorDefinitionSpecification?: ConnectorDefinitionSpecification | SourceDefinitionSpecificationDraft; onSubmit: (values: ConnectorFormValues) => Promise; isEditMode?: boolean; formValues?: Partial; - connectionTestSuccess?: boolean; - errorMessage?: React.ReactNode; - successMessage?: React.ReactNode; connectorId?: string; - footerClassName?: string; - bodyClassName?: string; - submitLabel?: string; - /** - * Called in case the user cancels the form - if not provided, no cancel button is rendered - */ - onCancel?: () => void; - /** - * Called in case the user reset the form - if not provided, no reset button is rendered - */ - onReset?: () => void; +} - isTestConnectionInProgress?: boolean; - onStopTesting?: () => void; - testConnector?: (v?: ConnectorCardValues) => Promise; +interface CardConnectorFormProps extends BaseConnectorFormProps { + renderWithCard: true; + title?: React.ReactNode; + description?: React.ReactNode; + full?: boolean; } +interface BareConnectorFormProps extends BaseConnectorFormProps { + renderWithCard?: false; +} + +export type ConnectorFormProps = CardConnectorFormProps | BareConnectorFormProps; + export const ConnectorForm: React.FC = (props) => { const formId = useUniqueFormId(props.formId); const { clearFormChange } = useFormChangeTrackerService(); @@ -58,13 +52,9 @@ export const ConnectorForm: React.FC = (props) => { formValues, onSubmit, isEditMode, - onStopTesting, - testConnector, selectedConnectorDefinition, selectedConnectorDefinitionSpecification, - errorMessage, connectorId, - onReset, } = props; const { formFields, initialValues, validationSchema } = useBuildForm( @@ -74,7 +64,7 @@ export const ConnectorForm: React.FC = (props) => { formValues ); - const getValues = useCallback( + const castValues = useCallback( (values: ConnectorFormValues) => validationSchema.cast(values, { stripUnknown: true, @@ -84,11 +74,16 @@ export const ConnectorForm: React.FC = (props) => { const onFormSubmit = useCallback( async (values: ConnectorFormValues) => { - const valuesToSend = getValues(values); + const valuesToSend = castValues(values); await onSubmit(valuesToSend); clearFormChange(formId); }, - [clearFormChange, formId, getValues, onSubmit] + [clearFormChange, formId, castValues, onSubmit] + ); + + const isInitialValid = useMemo( + () => Boolean(validationSchema.isValidSync(initialValues)), + [initialValues, validationSchema] ); return ( @@ -96,14 +91,15 @@ export const ConnectorForm: React.FC = (props) => { validateOnBlur validateOnChange initialValues={initialValues} + isInitialValid={isInitialValid} validationSchema={validationSchema} onSubmit={onFormSubmit} enableReinitialize > - {({ dirty, resetForm }) => ( + {({ dirty }) => ( = (props) => { > - { - onReset?.(); - resetForm(); - }) - } - onStopTestingConnector={onStopTesting ? () => onStopTesting() : undefined} - onRetest={testConnector ? async () => await testConnector() : undefined} - /> + )} diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/FormRoot.module.scss b/airbyte-webapp/src/views/Connector/ConnectorForm/FormRoot.module.scss new file mode 100644 index 0000000000000..dbb8d75cb9858 --- /dev/null +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/FormRoot.module.scss @@ -0,0 +1,5 @@ +@use "scss/variables"; + +.cardForm { + padding: variables.$spacing-xl; +} diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/FormRoot.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/FormRoot.tsx index fbc00004eafeb..8d5a2b8c0c8fb 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/FormRoot.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/FormRoot.tsx @@ -1,87 +1,87 @@ import { Form, useFormikContext } from "formik"; -import React from "react"; +import React, { ReactNode } from "react"; + +import { Card } from "components/ui/Card"; +import { FlexContainer } from "components/ui/Flex"; import { FormBlock } from "core/form/types"; -import CreateControls from "./components/CreateControls"; -import EditControls from "./components/EditControls"; import { FormSection } from "./components/Sections/FormSection"; import { useConnectorForm } from "./connectorFormContext"; +import styles from "./FormRoot.module.scss"; import { ConnectorFormValues } from "./types"; -interface FormRootProps { +export interface BaseFormRootProps { formFields: FormBlock; connectionTestSuccess?: boolean; isTestConnectionInProgress?: boolean; - errorMessage?: React.ReactNode; - successMessage?: React.ReactNode; - onRetest?: () => void; - onStopTestingConnector?: () => void; - submitLabel?: string; - footerClassName?: string; bodyClassName?: string; - /** - * Called in case the user cancels the form - if not provided, no cancel button is rendered - */ - onCancel?: () => void; - /** - * Called in case the user reset the form - if not provided, no reset button is rendered - */ - onReset?: () => void; + headerBlock?: ReactNode; + castValues: (values: ConnectorFormValues) => ConnectorFormValues; + renderFooter?: (formProps: { + dirty: boolean; + isSubmitting: boolean; + isValid: boolean; + resetConnectorForm: () => void; + isEditMode?: boolean; + formType: "source" | "destination"; + getValues: () => ConnectorFormValues; + }) => ReactNode; +} + +interface CardFormRootProps extends BaseFormRootProps { + renderWithCard: true; + title?: React.ReactNode; + description?: React.ReactNode; + full?: boolean; } -export const FormRoot: React.FC = ({ +interface BareFormRootProps extends BaseFormRootProps { + renderWithCard?: false; +} + +export const FormRoot: React.FC = ({ isTestConnectionInProgress = false, - onRetest, formFields, - successMessage, - errorMessage, - connectionTestSuccess, - onStopTestingConnector, - submitLabel, - footerClassName, bodyClassName, - onCancel, - onReset, + headerBlock, + renderFooter, + castValues, + ...props }) => { - const { dirty, isSubmitting, isValid } = useFormikContext(); + const { dirty, isSubmitting, isValid, values } = useFormikContext(); const { resetConnectorForm, isEditMode, formType } = useConnectorForm(); - return ( - + const formBody = ( + <> + {headerBlock}
    -
    - {isEditMode ? ( - { - resetConnectorForm(); - }} - successMessage={successMessage} - /> + + ); + + return ( + + + {props.renderWithCard ? ( + +
    {formBody}
    +
    ) : ( - + formBody )} -
    + {renderFooter && + renderFooter({ + dirty, + isSubmitting, + isValid, + resetConnectorForm, + isEditMode, + formType, + getValues: () => castValues(values), + })} + ); }; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/CreateControls.module.scss b/airbyte-webapp/src/views/Connector/ConnectorForm/components/CreateControls.module.scss deleted file mode 100644 index d93a861682412..0000000000000 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/CreateControls.module.scss +++ /dev/null @@ -1,19 +0,0 @@ -@use "scss/variables"; - -.controlContainer { - margin-top: 34px; - display: flex; - align-items: center; - justify-content: flex-end; -} - -.buttonContainer { - display: flex; - flex: 0 0 auto; - align-self: flex-end; - gap: variables.$spacing-sm; -} - -.deleteButtonContainer { - flex-grow: 1; -} diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/CreateControls.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/CreateControls.tsx deleted file mode 100644 index 425157a83cc77..0000000000000 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/CreateControls.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from "react"; -import { FormattedMessage } from "react-intl"; - -import { Button } from "components/ui/Button"; - -import styles from "./CreateControls.module.scss"; -import { TestingConnectionError } from "./TestingConnectionError"; -import { TestingConnectionSpinner } from "./TestingConnectionSpinner"; -import TestingConnectionSuccess from "./TestingConnectionSuccess"; - -interface CreateControlProps { - formType: "source" | "destination"; - /** - * Called in case the user cancels the form - if not provided, no cancel button is rendered - */ - onCancel?: () => void; - /** - * Called in case the user reset the form - if not provided, no reset button is rendered - */ - onReset?: () => void; - submitLabel?: string; - isSubmitting: boolean; - errorMessage?: React.ReactNode; - connectionTestSuccess?: boolean; - - isTestConnectionInProgress: boolean; - onCancelTesting?: () => void; -} - -const CreateControls: React.FC = ({ - isTestConnectionInProgress, - isSubmitting, - formType, - connectionTestSuccess, - errorMessage, - onCancelTesting, - onCancel, - onReset, - submitLabel, -}) => { - if (isSubmitting) { - return ; - } - - if (connectionTestSuccess) { - return ; - } - - return ( -
    - {errorMessage && } - {onReset && ( -
    - -
    - )} -
    - {onCancel && ( - - )} - -
    -
    - ); -}; - -export default CreateControls; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/EditControls.module.scss b/airbyte-webapp/src/views/Connector/ConnectorForm/components/EditControls.module.scss deleted file mode 100644 index 0976e17e7de45..0000000000000 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/EditControls.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use "scss/variables"; - -.controlsContainer { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: variables.$spacing-lg; -} - -.buttonsContainer { - display: flex; -} - -.cancelButton { - margin-left: 10px; -} diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/EditControls.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/EditControls.tsx deleted file mode 100644 index ba6bd02460893..0000000000000 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/EditControls.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from "react"; -import { FormattedMessage } from "react-intl"; - -import { Button } from "components/ui/Button"; - -import styles from "./EditControls.module.scss"; -import { TestingConnectionError } from "./TestingConnectionError"; -import { TestingConnectionSpinner } from "./TestingConnectionSpinner"; -import TestingConnectionSuccess from "./TestingConnectionSuccess"; - -interface IProps { - formType: "source" | "destination"; - isSubmitting: boolean; - isValid: boolean; - dirty: boolean; - onCancelClick: () => void; - onRetestClick?: () => void; - onCancelTesting?: () => void; - isTestConnectionInProgress?: boolean; - successMessage?: React.ReactNode; - errorMessage?: React.ReactNode; -} - -const EditControls: React.FC = ({ - isSubmitting, - isTestConnectionInProgress, - isValid, - dirty, - onCancelClick, - formType, - onRetestClick, - successMessage, - errorMessage, - onCancelTesting, -}) => { - if (isSubmitting) { - return ; - } - - const renderStatusMessage = () => { - if (errorMessage) { - return ; - } - if (successMessage) { - return ; - } - return null; - }; - - return ( - <> -
    -
    - - -
    - {onRetestClick && ( - - )} -
    - {renderStatusMessage()} - - ); -}; - -export default EditControls; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/auth/AuthSection.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/auth/AuthSection.tsx index c00cadf3ae6a9..50852a0c002eb 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/auth/AuthSection.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/Sections/auth/AuthSection.tsx @@ -9,7 +9,10 @@ import { SectionContainer } from "../SectionContainer"; export const AuthSection: React.FC = () => { const { selectedConnectorDefinitionSpecification } = useConnectorForm(); - if (isSourceDefinitionSpecificationDraft(selectedConnectorDefinitionSpecification)) { + if ( + !selectedConnectorDefinitionSpecification || + isSourceDefinitionSpecificationDraft(selectedConnectorDefinitionSpecification) + ) { return null; } return ( diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionError.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionError.tsx index f88f3e9ef6026..e9538929578e8 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionError.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionError.tsx @@ -1,44 +1,24 @@ import React from "react"; import { FormattedMessage } from "react-intl"; -import styled from "styled-components"; +import { Callout } from "components/ui/Callout"; +import { FlexContainer } from "components/ui/Flex"; import { StatusIcon } from "components/ui/StatusIcon"; - -const Error = styled(StatusIcon)` - padding-left: 1px; - width: 26px; - min-width: 26px; - height: 26px; - padding-top: 5px; - font-size: 17px; -`; - -const ErrorBlock = styled.div` - display: flex; - align-items: center; - font-weight: 600; - font-size: 12px; - line-height: 18px; - color: ${({ theme }) => theme.darkPrimaryColor}; -`; - -const ErrorText = styled.div` - font-weight: normal; - color: ${({ theme }) => theme.dangerColor}; - max-width: 400px; -`; +import { Text } from "components/ui/Text"; const ErrorSection: React.FC<{ errorTitle: React.ReactNode; errorMessage: React.ReactNode; }> = ({ errorMessage, errorTitle }) => ( - - -
    - {errorTitle} - {errorMessage} -
    -
    + + + + + {errorTitle} + {errorMessage} + + + ); const TestingConnectionError: React.FC<{ errorMessage: React.ReactNode }> = ({ errorMessage }) => ( diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSuccess.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSuccess.tsx deleted file mode 100644 index ec07619a3590e..0000000000000 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/components/TestingConnectionSuccess.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from "react"; -import { FormattedMessage } from "react-intl"; -import styled from "styled-components"; - -import { StatusIcon } from "components/ui/StatusIcon"; - -const LoadingContainer = styled.div` - font-weight: 600; - font-size: 14px; - line-height: 17px; - color: ${({ theme }) => theme.darkPrimaryColor}; - margin-top: 34px; - display: flex; - align-items: center; - justify-content: center; -`; - -const Success = styled(StatusIcon)` - width: 26px; - min-width: 26px; - height: 26px; - padding-top: 5px; - font-size: 17px; -`; - -const TestingConnectionSuccess: React.FC = () => ( - - - - -); - -export default TestingConnectionSuccess; diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/connectorFormContext.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/connectorFormContext.tsx index a222e14c59c9b..4389e49fcf74a 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/connectorFormContext.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/connectorFormContext.tsx @@ -15,7 +15,7 @@ interface ConnectorFormContext { getValues: (values: ConnectorFormValues) => ConnectorFormValues; resetConnectorForm: () => void; selectedConnectorDefinition?: ConnectorDefinition; - selectedConnectorDefinitionSpecification: ConnectorDefinitionSpecification | SourceDefinitionSpecificationDraft; + selectedConnectorDefinitionSpecification?: ConnectorDefinitionSpecification | SourceDefinitionSpecificationDraft; isEditMode?: boolean; validationSchema: AnySchema; connectorId?: string; @@ -36,7 +36,7 @@ interface ConnectorFormContextProviderProps { formType: "source" | "destination"; isEditMode?: boolean; getValues: (values: ConnectorFormValues) => ConnectorFormValues; - selectedConnectorDefinitionSpecification: ConnectorDefinitionSpecification | SourceDefinitionSpecificationDraft; + selectedConnectorDefinitionSpecification?: ConnectorDefinitionSpecification | SourceDefinitionSpecificationDraft; validationSchema: AnySchema; connectorId?: string; } diff --git a/airbyte-webapp/src/views/Connector/ConnectorForm/useBuildForm.tsx b/airbyte-webapp/src/views/Connector/ConnectorForm/useBuildForm.tsx index cb4e76b6bde3f..6a009380795ea 100644 --- a/airbyte-webapp/src/views/Connector/ConnectorForm/useBuildForm.tsx +++ b/airbyte-webapp/src/views/Connector/ConnectorForm/useBuildForm.tsx @@ -61,14 +61,26 @@ export function setDefaultValues( export function useBuildForm( isEditMode: boolean, formType: "source" | "destination", - selectedConnectorDefinitionSpecification: ConnectorDefinitionSpecification | SourceDefinitionSpecificationDraft, + selectedConnectorDefinitionSpecification: + | ConnectorDefinitionSpecification + | SourceDefinitionSpecificationDraft + | undefined, initialValues?: Partial ): BuildFormHook { const { formatMessage } = useIntl(); - const isDraft = isSourceDefinitionSpecificationDraft(selectedConnectorDefinitionSpecification); + + const isDraft = + selectedConnectorDefinitionSpecification && + isSourceDefinitionSpecificationDraft(selectedConnectorDefinitionSpecification); try { const jsonSchema: JSONSchema7 = useMemo(() => { + if (!selectedConnectorDefinitionSpecification) { + return { + type: "object", + properties: {}, + }; + } const schema: JSONSchema7 = { type: "object", properties: { @@ -89,7 +101,7 @@ export function useBuildForm( }; schema.required = ["name"]; return schema; - }, [formType, formatMessage, isDraft, selectedConnectorDefinitionSpecification.connectionSpecification]); + }, [formType, formatMessage, isDraft, selectedConnectorDefinitionSpecification]); const formFields = useMemo(() => jsonSchemaToFormBlock(jsonSchema), [jsonSchema]); @@ -119,7 +131,7 @@ export function useBuildForm( return baseValues; } - setDefaultValues(formFields, baseValues as Record, { respectExistingValues: isDraft }); + setDefaultValues(formFields, baseValues as Record, { respectExistingValues: Boolean(isDraft) }); return baseValues; }, [formFields, initialValues, isDraft, isEditMode, validationSchema]); @@ -134,7 +146,9 @@ export function useBuildForm( if (isFormBuildError(e)) { throw new FormBuildError( e.message, - isDraft ? undefined : ConnectorSpecification.id(selectedConnectorDefinitionSpecification) + isDraft || !selectedConnectorDefinitionSpecification + ? undefined + : ConnectorSpecification.id(selectedConnectorDefinitionSpecification) ); } throw e; From 231050390f79fe4d81313147ef3c074b067e4a5b Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 27 Jan 2023 10:08:23 -0500 Subject: [PATCH 138/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=8E=89=20log=20out?= =?UTF-8?q?=20when=20a=20user=20logs=20out=20in=20another=20tab=20(#21766)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Joey Marshment-Howell --- .../src/packages/cloud/services/auth/AuthService.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx b/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx index fdccf84cfdca5..2c2f62edd4c0b 100644 --- a/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx +++ b/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx @@ -169,6 +169,9 @@ export const AuthenticationProvider: React.FC> authInited(); } } + if (!currentUser) { + loggedOut(); + } }); }); From fa1b87787aa279b243f66c387db6175b2baec5b9 Mon Sep 17 00:00:00 2001 From: Augustin Date: Fri, 27 Jan 2023 16:46:49 +0100 Subject: [PATCH 139/195] qa-engine: define cloud eligibility (#21961) --- .../ci_connector_ops/qa_engine/models.py | 3 + .../ci_connector_ops/qa_engine/validations.py | 24 ++++++ tools/ci_connector_ops/setup.py | 2 +- .../tests/test_qa_engine/test_validations.py | 74 ++++++++++++++++++- 4 files changed, 101 insertions(+), 2 deletions(-) diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py index 7fef17500db3c..37eb14be1246a 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py @@ -3,6 +3,7 @@ # +from datetime import datetime from enum import Enum from typing import List @@ -32,6 +33,8 @@ class ConnectorQAReport(BaseModel): number_of_connections: int number_of_users: int sync_success_rate: float + is_eligible_for_promotion_to_cloud: bool + report_generation_datetime: datetime class QAReport(BaseModel): connectors_qa_report: List[ConnectorQAReport] diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py index 8a04e8b91bb8a..b168b59e1f516 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py @@ -3,6 +3,9 @@ # +from datetime import datetime +from typing import Iterable + import pandas as pd import requests @@ -10,6 +13,12 @@ from .inputs import OSS_CATALOG from .models import ConnectorQAReport, QAReport +TRUTHY_COLUMNS_TO_BE_ELIGIBLE = [ + "documentation_is_available", + "is_appropriate_for_cloud_use", + "latest_build_is_successful" +] + class QAReportGenerationError(Exception): pass @@ -20,6 +29,14 @@ def url_is_reachable(url: str) -> bool: def is_appropriate_for_cloud_use(definition_id: str) -> bool: return definition_id not in INAPPROPRIATE_FOR_CLOUD_USE_CONNECTORS +def is_eligible_for_promotion_to_cloud(connector_qa_data: pd.Series) -> bool: + if connector_qa_data["is_on_cloud"]: + return False + return all([ + connector_qa_data[col] + for col in TRUTHY_COLUMNS_TO_BE_ELIGIBLE + ]) + def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame: """Perform validation steps on top of the enriched catalog. Adds the following columns: @@ -51,6 +68,9 @@ def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame: qa_report["number_of_users"] = 0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721 qa_report["sync_success_rate"] = .0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721 + qa_report["is_eligible_for_promotion_to_cloud"] = qa_report.apply(is_eligible_for_promotion_to_cloud, axis="columns") + qa_report["report_generation_datetime"] = datetime.utcnow() + # Only select dataframe columns defined in the ConnectorQAReport model. qa_report= qa_report[[field.name for field in ConnectorQAReport.__fields__.values()]] # Validate the report structure with pydantic QAReport model. @@ -58,3 +78,7 @@ def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame: if len(qa_report) != len(OSS_CATALOG): raise QAReportGenerationError("The QA report does not contain all the connectors defined in the OSS catalog.") return qa_report + +def get_connectors_eligible_for_cloud(qa_report: pd.DataFrame) -> Iterable[ConnectorQAReport]: + for _, row in qa_report[qa_report["is_eligible_for_promotion_to_cloud"]].iterrows(): + yield ConnectorQAReport(**row) diff --git a/tools/ci_connector_ops/setup.py b/tools/ci_connector_ops/setup.py index 1b85d559a3bec..f8dced1a5444c 100644 --- a/tools/ci_connector_ops/setup.py +++ b/tools/ci_connector_ops/setup.py @@ -23,7 +23,7 @@ setup( - version="0.1.6", + version="0.1.7", name="ci_connector_ops", description="Packaged maintained by the connector operations team to perform CI for connectors", author="Airbyte", diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py b/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py index c20dc12f4b8a3..a56a5678e009c 100644 --- a/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py @@ -6,7 +6,7 @@ import pandas as pd import pytest -from ci_connector_ops.qa_engine import inputs, enrichments, models, validations +from ci_connector_ops.qa_engine import enrichments, inputs, models, validations @pytest.fixture def enriched_catalog() -> pd.DataFrame: @@ -32,3 +32,75 @@ def test_report_generation_error(enriched_catalog, mocker): mocker.patch.object(validations, "url_is_reachable", mocker.Mock(return_value=True)) with pytest.raises(validations.QAReportGenerationError): return validations.get_qa_report(enriched_catalog.sample(10)) + +@pytest.mark.parametrize( + "connector_qa_data, expected_to_be_eligible", + [ + ( + pd.Series({ + "is_on_cloud": False, + "documentation_is_available": True, + "is_appropriate_for_cloud_use": True, + "latest_build_is_successful": True + }), + True + ), + ( + pd.Series({ + "is_on_cloud": True, + "documentation_is_available": True, + "is_appropriate_for_cloud_use": True, + "latest_build_is_successful": True + }), + False + ), + ( + pd.Series({ + "is_on_cloud": True, + "documentation_is_available": False, + "is_appropriate_for_cloud_use": False, + "latest_build_is_successful": False + }), + False + ), + ( + pd.Series({ + "is_on_cloud": False, + "documentation_is_available": False, + "is_appropriate_for_cloud_use": True, + "latest_build_is_successful": True + }), + False + ), + ( + pd.Series({ + "is_on_cloud": False, + "documentation_is_available": True, + "is_appropriate_for_cloud_use": False, + "latest_build_is_successful": True + }), + False + ), + ( + pd.Series({ + "is_on_cloud": False, + "documentation_is_available": True, + "is_appropriate_for_cloud_use": True, + "latest_build_is_successful": False + }), + False + ) + ] +) +def test_is_eligible_for_promotion_to_cloud(connector_qa_data: pd.Series, expected_to_be_eligible: bool): + assert validations.is_eligible_for_promotion_to_cloud(connector_qa_data) == expected_to_be_eligible + +def test_get_connectors_eligible_for_cloud(qa_report: pd.DataFrame): + qa_report["is_eligible_for_promotion_to_cloud"] = True + connectors_eligible_for_cloud = list(validations.get_connectors_eligible_for_cloud(qa_report)) + assert len(qa_report) == len(connectors_eligible_for_cloud) + assert all([c.is_eligible_for_promotion_to_cloud for c in connectors_eligible_for_cloud]) + + qa_report["is_eligible_for_promotion_to_cloud"] = False + connectors_eligible_for_cloud = list(validations.get_connectors_eligible_for_cloud(qa_report)) + assert len(connectors_eligible_for_cloud) == 0 From 3a81ffc0a5c4e1a845767bc1ee15c9b979591d5a Mon Sep 17 00:00:00 2001 From: Augustin Date: Fri, 27 Jan 2023 17:46:08 +0100 Subject: [PATCH 140/195] QA engine: add adoption metrics to the QA report (#21917) --- .../ci_connector_ops/qa_engine/enrichments.py | 13 ++++- .../ci_connector_ops/qa_engine/inputs.py | 4 -- .../ci_connector_ops/qa_engine/main.py | 18 +++--- .../ci_connector_ops/qa_engine/models.py | 38 +++++++----- .../ci_connector_ops/qa_engine/outputs.py | 15 +++++ .../ci_connector_ops/qa_engine/validations.py | 15 ++--- tools/ci_connector_ops/setup.py | 2 +- tools/ci_connector_ops/tests/conftest.py | 57 ++++++++++++++++++ .../tests/test_qa_engine/test_enrichments.py | 23 +++++--- .../tests/test_qa_engine/test_inputs.py | 4 +- .../tests/test_qa_engine/test_main.py | 58 ++++++++++--------- .../tests/test_qa_engine/test_outputs.py | 24 ++++++++ .../tests/test_qa_engine/test_validations.py | 12 ++-- 13 files changed, 205 insertions(+), 78 deletions(-) create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/outputs.py create mode 100644 tools/ci_connector_ops/tests/conftest.py create mode 100644 tools/ci_connector_ops/tests/test_qa_engine/test_outputs.py diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py index e275dcb51d33b..a64008ae28fb1 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/enrichments.py @@ -5,7 +5,10 @@ import pandas as pd -def get_enriched_catalog(oss_catalog: pd.DataFrame, cloud_catalog: pd.DataFrame) -> pd.DataFrame: +def get_enriched_catalog( + oss_catalog: pd.DataFrame, + cloud_catalog: pd.DataFrame, + adoption_metrics_per_connector_version: pd.DataFrame) -> pd.DataFrame: """Merge OSS and Cloud catalog in a single dataframe on their definition id. Transformations: - Rename columns to snake case. @@ -15,9 +18,11 @@ def get_enriched_catalog(oss_catalog: pd.DataFrame, cloud_catalog: pd.DataFrame) Enrichments: - is_on_cloud: determined by the merge operation results. - connector_technical_name: built from the docker repository field. airbyte/source-pokeapi -> source-pokeapi. + - Adoptions metrics: add the columns from the adoption_metrics_per_connector_version dataframe. Args: oss_catalog (pd.DataFrame): The open source catalog dataframe. cloud_catalog (pd.DataFrame): The cloud catalog dataframe. + adoption_metrics_per_connector_version (pd.DataFrame): The crowd sourced adoptions metrics. Returns: pd.DataFrame: The enriched catalog. @@ -28,15 +33,19 @@ def get_enriched_catalog(oss_catalog: pd.DataFrame, cloud_catalog: pd.DataFrame) how="left", on="connector_definition_id", indicator=True, - suffixes=("", "_del"), + suffixes=("", "_cloud"), ) + enriched_catalog.columns = enriched_catalog.columns.str.replace( "(?<=[a-z])(?=[A-Z])", "_", regex=True ).str.lower() # column names to snake case + enriched_catalog = enriched_catalog[[c for c in enriched_catalog.columns if "_cloud" not in c]] enriched_catalog["is_on_cloud"] = enriched_catalog["_merge"] == "both" enriched_catalog = enriched_catalog.drop(columns="_merge") enriched_catalog["connector_name"] = enriched_catalog["name"] enriched_catalog["connector_technical_name"] = enriched_catalog["docker_repository"].str.replace("airbyte/", "") enriched_catalog["connector_version"] = enriched_catalog["docker_image_tag"] enriched_catalog["release_stage"] = enriched_catalog["release_stage"].fillna("unknown") + enriched_catalog = enriched_catalog.merge(adoption_metrics_per_connector_version, how="left", on=["connector_definition_id", "connector_version"]) + enriched_catalog[adoption_metrics_per_connector_version.columns] = enriched_catalog[adoption_metrics_per_connector_version.columns].fillna(0) return enriched_catalog diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py index a3d918496fe98..f42b4541e1691 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/inputs.py @@ -10,7 +10,6 @@ import requests import pandas as pd -from .constants import CLOUD_CATALOG_URL, OSS_CATALOG_URL def fetch_remote_catalog(catalog_url: str) -> pd.DataFrame: """Fetch a combined remote catalog and return a single DataFrame @@ -50,6 +49,3 @@ def fetch_adoption_metrics_per_connector_version() -> pd.DataFrame: "total_syncs_count", "sync_success_rate", ]] - -CLOUD_CATALOG = fetch_remote_catalog(CLOUD_CATALOG_URL) -OSS_CATALOG = fetch_remote_catalog(OSS_CATALOG_URL) diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py index a1e623cddb50c..a94dad5109094 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/main.py @@ -3,13 +3,17 @@ # -from .constants import GCS_QA_REPORT_PATH -from .enrichments import get_enriched_catalog -from .inputs import CLOUD_CATALOG, OSS_CATALOG -from .validations import get_qa_report +from .constants import CLOUD_CATALOG_URL, GCS_QA_REPORT_PATH, OSS_CATALOG_URL +from . import enrichments, inputs, validations, outputs def main(): - enriched_catalog = get_enriched_catalog(OSS_CATALOG, CLOUD_CATALOG) - qa_report = get_qa_report(enriched_catalog) - qa_report.to_json(GCS_QA_REPORT_PATH, orient="records") + oss_catalog = inputs.fetch_remote_catalog(OSS_CATALOG_URL) + cloud_catalog = inputs.fetch_remote_catalog(CLOUD_CATALOG_URL) + adoption_metrics_per_connector_version = inputs.fetch_adoption_metrics_per_connector_version() + enriched_catalog = enrichments.get_enriched_catalog( + oss_catalog, + cloud_catalog, + adoption_metrics_per_connector_version + ) + validations.get_qa_report(enriched_catalog, len(oss_catalog)) diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py index 37eb14be1246a..eaf60b504dea1 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/models.py @@ -7,7 +7,7 @@ from enum import Enum from typing import List -from pydantic import BaseModel +from pydantic import BaseModel, Field class ConnectorTypeEnum(str, Enum): source = "source" @@ -19,22 +19,28 @@ class ReleaseStageEnum(str, Enum): beta = "beta" generally_available = "generally_available" +PUBLIC_FIELD = Field(..., is_public=True) +PRIVATE_FIELD = Field(..., is_public=False) + class ConnectorQAReport(BaseModel): - connector_type: ConnectorTypeEnum - connector_name: str - connector_technical_name: str - connector_definition_id: str - connector_version: str - release_stage: ReleaseStageEnum - is_on_cloud: bool - is_appropriate_for_cloud_use: bool - latest_build_is_successful: bool - documentation_is_available: bool - number_of_connections: int - number_of_users: int - sync_success_rate: float - is_eligible_for_promotion_to_cloud: bool - report_generation_datetime: datetime + connector_type: ConnectorTypeEnum = PUBLIC_FIELD + connector_name: str = PUBLIC_FIELD + connector_technical_name: str = PUBLIC_FIELD + connector_definition_id: str = PUBLIC_FIELD + connector_version: str = PUBLIC_FIELD + release_stage: ReleaseStageEnum = PUBLIC_FIELD + is_on_cloud: bool = PUBLIC_FIELD + is_appropriate_for_cloud_use: bool = PUBLIC_FIELD + latest_build_is_successful: bool = PUBLIC_FIELD + documentation_is_available: bool = PUBLIC_FIELD + number_of_connections: int = PRIVATE_FIELD + number_of_users: int = PRIVATE_FIELD + sync_success_rate: float = PRIVATE_FIELD + total_syncs_count: int = PRIVATE_FIELD + failed_syncs_count: int = PRIVATE_FIELD + succeeded_syncs_count: int = PRIVATE_FIELD + is_eligible_for_promotion_to_cloud: bool = PUBLIC_FIELD + report_generation_datetime: datetime = PUBLIC_FIELD class QAReport(BaseModel): connectors_qa_report: List[ConnectorQAReport] diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/outputs.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/outputs.py new file mode 100644 index 0000000000000..88253303a30d1 --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/outputs.py @@ -0,0 +1,15 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import pandas as pd + +from .models import ConnectorQAReport + +def persist_qa_report(qa_report: pd.DataFrame, path: str, public_fields_only: bool =True): + final_fields = [ + field.name for field in ConnectorQAReport.__fields__.values() + if field.field_info.extra["is_public"] or not public_fields_only + ] + qa_report[final_fields].to_json(path, orient="records") diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py index b168b59e1f516..3e6116e9bfd2b 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/validations.py @@ -10,7 +10,6 @@ import requests from .constants import INAPPROPRIATE_FOR_CLOUD_USE_CONNECTORS -from .inputs import OSS_CATALOG from .models import ConnectorQAReport, QAReport TRUTHY_COLUMNS_TO_BE_ELIGIBLE = [ @@ -37,7 +36,8 @@ def is_eligible_for_promotion_to_cloud(connector_qa_data: pd.Series) -> bool: for col in TRUTHY_COLUMNS_TO_BE_ELIGIBLE ]) -def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame: + +def get_qa_report(enriched_catalog: pd.DataFrame, oss_catalog_length: int) -> pd.DataFrame: """Perform validation steps on top of the enriched catalog. Adds the following columns: - documentation_is_available: @@ -54,6 +54,7 @@ def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame: Get the sync success rate of the connections with this connector version from our datawarehouse. Args: enriched_catalog (pd.DataFrame): The enriched catalog. + oss_catalog_length (pd.DataFrame): The length of the OSS catalog, for sanity check. Returns: pd.DataFrame: The final QA report. @@ -64,9 +65,9 @@ def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame: # TODO YET TO IMPLEMENT VALIDATIONS qa_report["latest_build_is_successful"] = False # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21720 - qa_report["number_of_connections"] = 0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721 - qa_report["number_of_users"] = 0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721 - qa_report["sync_success_rate"] = .0 # TODO, tracked in https://github.com/airbytehq/airbyte/issues/21721 + + qa_report["is_eligible_for_promotion_to_cloud"] = qa_report.apply(is_eligible_for_promotion_to_cloud, axis="columns") + qa_report["report_generation_datetime"] = datetime.utcnow() qa_report["is_eligible_for_promotion_to_cloud"] = qa_report.apply(is_eligible_for_promotion_to_cloud, axis="columns") qa_report["report_generation_datetime"] = datetime.utcnow() @@ -75,8 +76,8 @@ def get_qa_report(enriched_catalog: pd.DataFrame) -> pd.DataFrame: qa_report= qa_report[[field.name for field in ConnectorQAReport.__fields__.values()]] # Validate the report structure with pydantic QAReport model. QAReport(connectors_qa_report=qa_report.to_dict(orient="records")) - if len(qa_report) != len(OSS_CATALOG): - raise QAReportGenerationError("The QA report does not contain all the connectors defined in the OSS catalog.") + if len(qa_report) != oss_catalog_length: + raise QAReportGenerationError("The QA report does not contain all the connectors defined in the OSS catalog.") return qa_report def get_connectors_eligible_for_cloud(qa_report: pd.DataFrame) -> Iterable[ConnectorQAReport]: diff --git a/tools/ci_connector_ops/setup.py b/tools/ci_connector_ops/setup.py index f8dced1a5444c..50cc3f0fe40b3 100644 --- a/tools/ci_connector_ops/setup.py +++ b/tools/ci_connector_ops/setup.py @@ -23,7 +23,7 @@ setup( - version="0.1.7", + version="0.1.8", name="ci_connector_ops", description="Packaged maintained by the connector operations team to perform CI for connectors", author="Airbyte", diff --git a/tools/ci_connector_ops/tests/conftest.py b/tools/ci_connector_ops/tests/conftest.py new file mode 100644 index 0000000000000..60380444fd376 --- /dev/null +++ b/tools/ci_connector_ops/tests/conftest.py @@ -0,0 +1,57 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +from datetime import datetime +import pandas as pd +import pytest + +from ci_connector_ops.qa_engine.constants import OSS_CATALOG_URL, CLOUD_CATALOG_URL +from ci_connector_ops.qa_engine.inputs import fetch_remote_catalog + +@pytest.fixture(scope="module") +def oss_catalog(): + return fetch_remote_catalog(OSS_CATALOG_URL) + +@pytest.fixture(scope="module") +def cloud_catalog(): + return fetch_remote_catalog(CLOUD_CATALOG_URL) + +@pytest.fixture(scope="module") +def adoption_metrics_per_connector_version(): + return pd.DataFrame([{ + "connector_definition_id": "dfd88b22-b603-4c3d-aad7-3701784586b1", + "connector_version": "2.0.0", + "number_of_connections": 0, + "number_of_users": 0, + "succeeded_syncs_count": 0, + "failed_syncs_count": 0, + "total_syncs_count": 0, + "sync_success_rate": 0.0, + }]) + +@pytest.fixture +def dummy_qa_report() -> pd.DataFrame: + return pd.DataFrame([ + { + "connector_type": "source", + "connector_name": "test", + "connector_technical_name": "source-test", + "connector_definition_id": "foobar", + "connector_version": "0.0.0", + "release_stage": "alpha", + "is_on_cloud": False, + "is_appropriate_for_cloud_use": True, + "latest_build_is_successful": True, + "documentation_is_available": False, + "number_of_connections": 0, + "number_of_users": 0, + "sync_success_rate": .99, + "total_syncs_count": 0, + "failed_syncs_count": 0, + "succeeded_syncs_count": 0, + "is_eligible_for_promotion_to_cloud": True, + "report_generation_datetime": datetime.utcnow() + } + ]) diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_enrichments.py b/tools/ci_connector_ops/tests/test_qa_engine/test_enrichments.py index c108c2d612c20..c8013070649bf 100644 --- a/tools/ci_connector_ops/tests/test_qa_engine/test_enrichments.py +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_enrichments.py @@ -8,30 +8,37 @@ import pandas as pd import pytest -from ci_connector_ops.qa_engine import inputs, enrichments +from ci_connector_ops.qa_engine import enrichments + @pytest.fixture -def enriched_catalog() -> pd.DataFrame: - return enrichments.get_enriched_catalog(inputs.OSS_CATALOG, inputs.CLOUD_CATALOG) +def enriched_catalog(oss_catalog, cloud_catalog, adoption_metrics_per_connector_version) -> pd.DataFrame: + return enrichments.get_enriched_catalog(oss_catalog, cloud_catalog, adoption_metrics_per_connector_version) @pytest.fixture def enriched_catalog_columns(enriched_catalog: pd.DataFrame) -> set: return set(enriched_catalog.columns) -def test_merge_performed_correctly(enriched_catalog): - assert len(enriched_catalog) == len(inputs.OSS_CATALOG) +def test_merge_performed_correctly(enriched_catalog, oss_catalog): + assert len(enriched_catalog) == len(oss_catalog) def test_new_columns_are_added(enriched_catalog_columns): expected_new_columns = { "is_on_cloud", "connector_name", "connector_technical_name", - "connector_version" + "connector_version", + "number_of_connections", + "number_of_users", + "succeeded_syncs_count", + "failed_syncs_count", + "total_syncs_count", + "sync_success_rate", } assert expected_new_columns.issubset(enriched_catalog_columns) -def test_no_column_are_removed_and_lowercased(enriched_catalog_columns): - for column in inputs.OSS_CATALOG: +def test_no_column_are_removed_and_lowercased(enriched_catalog_columns, oss_catalog): + for column in oss_catalog: assert re.sub(r"(? pd.DataFrame: - return pd.DataFrame([ - { - "connector_type": "source", - "connector_name": "test", - "docker_image_tag": "0.0.0", - "release_stage": "alpha", - "is_on_cloud": False, - "latest_build_is_successful": False, - "documentation_is_available": False, - "number_of_connections": 0, - "number_of_users": 0, - "sync_success_rate": .99 - } - ]) -def test_main(tmp_path, mocker, dummy_report): - output_path = tmp_path / "output.json" - mocker.patch.object(main, "GCS_QA_REPORT_PATH", output_path) - mocker.patch.object(main, "get_enriched_catalog") - mocker.patch.object(main, "get_qa_report", mocker.Mock(return_value=dummy_report)) +def test_main(mocker, dummy_qa_report): + mock_oss_catalog = mocker.Mock(__len__=mocker.Mock(return_value=42)) + mock_cloud_catalog = mocker.Mock() + + mocker.patch.object(main, "enrichments") + mocker.patch.object(main, "outputs") + mocker.patch.object( + main.inputs, + "fetch_remote_catalog", + mocker.Mock(side_effect=[mock_oss_catalog, mock_cloud_catalog])) + mocker.patch.object(main.inputs, "fetch_adoption_metrics_per_connector_version") + mocker.patch.object(main.validations, "get_qa_report", mocker.Mock(return_value=dummy_qa_report)) + main.main() - main.get_enriched_catalog.assert_called_with(main.OSS_CATALOG, main.CLOUD_CATALOG) - main.get_qa_report.assert_called_with(main.get_enriched_catalog.return_value) - assert pd.read_json(output_path).to_dict() == dummy_report.to_dict() + + assert main.inputs.fetch_remote_catalog.call_count == 2 + main.inputs.fetch_remote_catalog.assert_has_calls( + [ + mocker.call(main.OSS_CATALOG_URL), + mocker.call(main.CLOUD_CATALOG_URL) + ] + ) + main.enrichments.get_enriched_catalog.assert_called_with( + mock_oss_catalog, + mock_cloud_catalog, + main.inputs.fetch_adoption_metrics_per_connector_version.return_value + ) + main.validations.get_qa_report.assert_called_with( + main.enrichments.get_enriched_catalog.return_value, + len(mock_oss_catalog) + ) + diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_outputs.py b/tools/ci_connector_ops/tests/test_qa_engine/test_outputs.py new file mode 100644 index 0000000000000..7507b6b5876cd --- /dev/null +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_outputs.py @@ -0,0 +1,24 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import pandas as pd +import pytest + +from ci_connector_ops.qa_engine import outputs + +@pytest.mark.parametrize("public_fields_only", [True, False]) +def test_persist_qa_report_public_fields_only(tmp_path, dummy_qa_report, public_fields_only): + output_path = tmp_path / "qa_report.json" + outputs.persist_qa_report(dummy_qa_report, output_path, public_fields_only=public_fields_only) + qa_report_from_disk = pd.read_json(output_path) + private_fields = { + field.name for field in outputs.ConnectorQAReport.__fields__.values() + if not field.field_info.extra["is_public"] + } + available_fields = set(qa_report_from_disk.columns) + if public_fields_only: + assert not private_fields.issubset(available_fields) + else: + assert private_fields.issubset(available_fields) diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py b/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py index a56a5678e009c..3535700bc0aeb 100644 --- a/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_validations.py @@ -9,13 +9,17 @@ from ci_connector_ops.qa_engine import enrichments, inputs, models, validations @pytest.fixture -def enriched_catalog() -> pd.DataFrame: - return enrichments.get_enriched_catalog(inputs.OSS_CATALOG, inputs.CLOUD_CATALOG) +def enriched_catalog(oss_catalog, cloud_catalog, adoption_metrics_per_connector_version) -> pd.DataFrame: + return enrichments.get_enriched_catalog( + oss_catalog, + cloud_catalog, + adoption_metrics_per_connector_version + ) @pytest.fixture def qa_report(enriched_catalog, mocker) -> pd.DataFrame: mocker.patch.object(validations, "url_is_reachable", mocker.Mock(return_value=True)) - return validations.get_qa_report(enriched_catalog) + return validations.get_qa_report(enriched_catalog, len(enriched_catalog)) @pytest.fixture def qa_report_columns(qa_report: pd.DataFrame) -> set: @@ -31,7 +35,7 @@ def test_not_null_values_after_validation(qa_report: pd.DataFrame): def test_report_generation_error(enriched_catalog, mocker): mocker.patch.object(validations, "url_is_reachable", mocker.Mock(return_value=True)) with pytest.raises(validations.QAReportGenerationError): - return validations.get_qa_report(enriched_catalog.sample(10)) + return validations.get_qa_report(enriched_catalog.sample(1), 2) @pytest.mark.parametrize( "connector_qa_data, expected_to_be_eligible", From b1a0a4d402f3f052f72fae3ab5e15983b2bca198 Mon Sep 17 00:00:00 2001 From: Denys Davydov Date: Fri, 27 Jan 2023 18:48:21 +0200 Subject: [PATCH 141/195] Source Amplitude: handle null values and ampty strings in datetimefields (#21957) * #1347 source Amplitude: handle null values and ampty strings in datetime fields * #1347 source Amplitude: upd changelog * #1347 source amplitude: fix tests * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-amplitude/Dockerfile | 2 +- .../integration_tests/acceptance.py | 13 +++++++++++-- .../source-amplitude/source_amplitude/api.py | 11 ++++++++--- .../source-amplitude/source_amplitude/source.py | 2 +- .../source-amplitude/unit_tests/test_api.py | 4 +++- docs/integrations/sources/amplitude.md | 9 +++++---- 8 files changed, 31 insertions(+), 14 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 0cf1cf725f17d..30c4996749ef6 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -81,7 +81,7 @@ - name: Amplitude sourceDefinitionId: fa9f58c6-2d03-4237-aaa4-07d75e0c1396 dockerRepository: airbyte/source-amplitude - dockerImageTag: 0.1.19 + dockerImageTag: 0.1.20 documentationUrl: https://docs.airbyte.com/integrations/sources/amplitude icon: amplitude.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 29b5c718ec1d7..481e08abc4970 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -1275,7 +1275,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-amplitude:0.1.19" +- dockerImage: "airbyte/source-amplitude:0.1.20" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/amplitude" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-amplitude/Dockerfile b/airbyte-integrations/connectors/source-amplitude/Dockerfile index d1a4466b53053..97c29296b0ecf 100644 --- a/airbyte-integrations/connectors/source-amplitude/Dockerfile +++ b/airbyte-integrations/connectors/source-amplitude/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.19 +LABEL io.airbyte.version=0.1.20 LABEL io.airbyte.name=airbyte/source-amplitude diff --git a/airbyte-integrations/connectors/source-amplitude/integration_tests/acceptance.py b/airbyte-integrations/connectors/source-amplitude/integration_tests/acceptance.py index 480378d7bf203..1302b2f57e10e 100644 --- a/airbyte-integrations/connectors/source-amplitude/integration_tests/acceptance.py +++ b/airbyte-integrations/connectors/source-amplitude/integration_tests/acceptance.py @@ -3,5 +3,14 @@ # -def test_dummy_test(): - assert True +import pytest + +pytest_plugins = ("source_acceptance_test.plugin",) + + +@pytest.fixture(scope="session", autouse=True) +def connector_setup(): + """This fixture is a placeholder for external resources that acceptance test might require.""" + # TODO: setup test dependencies if needed. otherwise remove the TODO comments + yield + # TODO: clean up test dependencies diff --git a/airbyte-integrations/connectors/source-amplitude/source_amplitude/api.py b/airbyte-integrations/connectors/source-amplitude/source_amplitude/api.py index 89289c795ec65..25d93810f4c36 100644 --- a/airbyte-integrations/connectors/source-amplitude/source_amplitude/api.py +++ b/airbyte-integrations/connectors/source-amplitude/source_amplitude/api.py @@ -88,14 +88,19 @@ def _get_date_time_items_from_schema(self): result.append(key) return result - def _date_time_to_rfc3339(self, record: Mapping[str, Any]) -> Mapping[str, Any]: + def _date_time_to_rfc3339(self, record: MutableMapping[str, Any]) -> MutableMapping[str, Any]: """ Transform 'date-time' items to RFC3339 format """ date_time_fields = self._get_date_time_items_from_schema() for item in record: if item in date_time_fields: - record[item] = pendulum.parse(record[item]).to_rfc3339_string() + dt_value = record[item] + if not dt_value: + # either null or empty string, leave it as it + record[item] = dt_value + else: + record[item] = pendulum.parse(dt_value).to_rfc3339_string() return record def _get_end_date(self, current_date: pendulum, end_date: pendulum = pendulum.now()): @@ -168,7 +173,7 @@ def parse_response(self, response: requests.Response, stream_state: Mapping[str, if record[self.cursor_field] >= state_value: yield self._date_time_to_rfc3339(record) # transform all `date-time` to RFC3339 - def _parse_zip_file(self, zip_file: IO[bytes]) -> Iterable[Mapping]: + def _parse_zip_file(self, zip_file: IO[bytes]) -> Iterable[MutableMapping]: with gzip.open(zip_file) as file: for record in file: yield json.loads(record) diff --git a/airbyte-integrations/connectors/source-amplitude/source_amplitude/source.py b/airbyte-integrations/connectors/source-amplitude/source_amplitude/source.py index e77f6a3210725..721d2f2ebd36d 100644 --- a/airbyte-integrations/connectors/source-amplitude/source_amplitude/source.py +++ b/airbyte-integrations/connectors/source-amplitude/source_amplitude/source.py @@ -26,7 +26,7 @@ def _convert_auth_to_token(self, username: str, password: str) -> str: def check_connection(self, logger: AirbyteLogger, config: Mapping[str, Any]) -> Tuple[bool, any]: try: auth = TokenAuthenticator(token=self._convert_auth_to_token(config["api_key"], config["secret_key"]), auth_method="Basic") - list(Cohorts(authenticator=auth, data_region=config["data_region"]).read_records(SyncMode.full_refresh)) + list(Cohorts(authenticator=auth, data_region=config.get("data_region", "Standard Server")).read_records(SyncMode.full_refresh)) return True, None except Exception as error: return False, f"Unable to connect to Amplitude API with the provided credentials - {repr(error)}" diff --git a/airbyte-integrations/connectors/source-amplitude/unit_tests/test_api.py b/airbyte-integrations/connectors/source-amplitude/unit_tests/test_api.py index 1f781aa95a943..0d9a2e35a79e9 100644 --- a/airbyte-integrations/connectors/source-amplitude/unit_tests/test_api.py +++ b/airbyte-integrations/connectors/source-amplitude/unit_tests/test_api.py @@ -237,8 +237,10 @@ def test_get_date_time_items_from_schema(self): [ ({}, {}), ({"event_time": "2021-05-27 11:59:53.710000"}, {"event_time": "2021-05-27T11:59:53.710000+00:00"}), + ({"event_time": None}, {"event_time": None}), + ({"event_time": ""}, {"event_time": ""}), ], - ids=["empty_record", "transformed_record"], + ids=["empty_record", "transformed_record", "null_value", "empty_value"], ) def test_date_time_to_rfc3339(self, record, expected): stream = Events(pendulum.now().isoformat(), data_region="Standard Server") diff --git a/docs/integrations/sources/amplitude.md b/docs/integrations/sources/amplitude.md index 265226a6ed743..a4e89b0821950 100644 --- a/docs/integrations/sources/amplitude.md +++ b/docs/integrations/sources/amplitude.md @@ -43,10 +43,11 @@ The Amplitude connector ideally should gracefully handle Amplitude API limitatio | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:------------------------------------------------------------------------------------------------| -| 0.1.19 | 2022-12-09 | [19727](https://github.com/airbytehq/airbyte/pull/19727) | Remove `data_region` as required | -| 0.1.18 | 2022-12-08 | [19727](https://github.com/airbytehq/airbyte/pull/19727) | Add parameter to select region | -| 0.1.17 | 2022-10-31 | [18684](https://github.com/airbytehq/airbyte/pull/18684) | Add empty `series` validation for `AverageSessionLength` stream | -| 0.1.16 | 2022-10-11 | [17854](https://github.com/airbytehq/airbyte/pull/17854) | Add empty `series` validation for `ActtiveUsers` steam | +| 0.1.20 | 2023-01-27 | [21957](https://github.com/airbytehq/airbyte/pull/21957) | Handle null values and empty strings in date-time fields | +| 0.1.19 | 2022-12-09 | [19727](https://github.com/airbytehq/airbyte/pull/19727) | Remove `data_region` as required | +| 0.1.18 | 2022-12-08 | [19727](https://github.com/airbytehq/airbyte/pull/19727) | Add parameter to select region | +| 0.1.17 | 2022-10-31 | [18684](https://github.com/airbytehq/airbyte/pull/18684) | Add empty `series` validation for `AverageSessionLength` stream | +| 0.1.16 | 2022-10-11 | [17854](https://github.com/airbytehq/airbyte/pull/17854) | Add empty `series` validation for `ActtiveUsers` steam | | 0.1.15 | 2022-10-03 | [17320](https://github.com/airbytehq/airbyte/pull/17320) | Add validation `start_date` filed if it's in the future | | 0.1.14 | 2022-09-28 | [17326](https://github.com/airbytehq/airbyte/pull/17326) | Migrate to per-stream states. | | 0.1.13 | 2022-08-31 | [16185](https://github.com/airbytehq/airbyte/pull/16185) | Re-release on new `airbyte_cdk==0.1.81` | From 3676a97c469d6ccb966c41b166cf8287d7e7c99e Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 27 Jan 2023 08:56:05 -0800 Subject: [PATCH 142/195] add attempt created event to used codepath (#21955) --- .../activities/JobCreationAndStatusUpdateActivityImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java index 2e321793c832b..862d2364bc555 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java @@ -223,12 +223,13 @@ public AttemptNumberCreationOutput createNewAttemptNumber(final AttemptCreationI try { final long jobId = input.getJobId(); ApmTraceUtils.addTagsToTrace(Map.of(JOB_ID_KEY, jobId)); - final Job createdJob = jobPersistence.getJob(jobId); + final Job job = jobPersistence.getJob(jobId); - final WorkerRun workerRun = temporalWorkerRunFactory.create(createdJob); + final WorkerRun workerRun = temporalWorkerRunFactory.create(job); final Path logFilePath = workerRun.getJobRoot().resolve(LogClientSingleton.LOG_FILENAME); final int persistedAttemptNumber = jobPersistence.createAttempt(jobId, logFilePath); emitJobIdToReleaseStagesMetric(OssMetricsRegistry.ATTEMPT_CREATED_BY_RELEASE_STAGE, jobId); + emitAttemptCreatedEvent(job, persistedAttemptNumber); LogClientSingleton.getInstance().setJobMdc(workerEnvironment, logConfigs, workerRun.getJobRoot()); return new AttemptNumberCreationOutput(persistedAttemptNumber); From 6b0a53b07edc6b4ca4e709bc123e26f57a391d76 Mon Sep 17 00:00:00 2001 From: Arsen Losenko <20901439+arsenlosenko@users.noreply.github.com> Date: Fri, 27 Jan 2023 19:11:39 +0200 Subject: [PATCH 143/195] Source Google Analytics (Universal Analytics): enable SAT high strictness (#21983) --- .../acceptance-test-config.yml | 58 +- .../integration_tests/expected_records.jsonl | 1842 ++++++++++++++++- 2 files changed, 1873 insertions(+), 27 deletions(-) diff --git a/airbyte-integrations/connectors/source-google-analytics-v4/acceptance-test-config.yml b/airbyte-integrations/connectors/source-google-analytics-v4/acceptance-test-config.yml index e47ec41b5e2ab..785755476d25c 100644 --- a/airbyte-integrations/connectors/source-google-analytics-v4/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-google-analytics-v4/acceptance-test-config.yml @@ -1,30 +1,36 @@ -# See [Source Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/source-acceptance-tests-reference) -# for more information about how to configure these tests - -connector_image: airbyte/source-google-analytics-v4:dev -tests: - spec: - - spec_path: "source_google_analytics_v4/spec.json" - connection: - - config_path: "secrets/service_config.json" - status: "succeed" - - config_path: "secrets/old_config.json" - status: "succeed" - - config_path: "integration_tests/invalid_config.json" - status: "failed" - discovery: - - config_path: "secrets/service_config.json" +acceptance_tests: basic_read: - - config_path: "secrets/service_config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - empty_streams: [] + tests: + - config_path: secrets/service_config.json + empty_streams: + - name: users_per_city + bypass_reason: no records in the stream expect_records: - path: "integration_tests/expected_records.jsonl" + path: integration_tests/expected_records.jsonl + connection: + tests: + - config_path: secrets/service_config.json + status: succeed + - config_path: secrets/old_config.json + status: succeed + - config_path: integration_tests/invalid_config.json + status: failed + discovery: + tests: + - config_path: secrets/service_config.json + full_refresh: + tests: + - config_path: secrets/service_config.json + configured_catalog_path: integration_tests/configured_catalog.json incremental: - - config_path: "secrets/service_config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" - future_state_path: "integration_tests/abnormal_state.json" + tests: + - config_path: secrets/service_config.json + configured_catalog_path: integration_tests/configured_catalog.json + future_state: + future_state_path: integration_tests/abnormal_state.json threshold_days: 2 - full_refresh: - - config_path: "secrets/service_config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" + spec: + tests: + - spec_path: source_google_analytics_v4/spec.json +connector_image: airbyte/source-google-analytics-v4:dev +test_strictness_level: high diff --git a/airbyte-integrations/connectors/source-google-analytics-v4/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-google-analytics-v4/integration_tests/expected_records.jsonl index 0a2dd91721f28..97a147616e447 100644 --- a/airbyte-integrations/connectors/source-google-analytics-v4/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-google-analytics-v4/integration_tests/expected_records.jsonl @@ -3,4 +3,1844 @@ {"stream": "daily_active_users", "data": {"ga_date": "2021-12-10", "ga_1dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1639563251092} {"stream": "weekly_active_users", "data": {"ga_date": "2021-12-15", "ga_7dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1639563249172} {"stream": "locations", "data": {"ga_date": "2021-12-10", "ga_continent": "Americas", "ga_subContinent": "Northern America", "ga_country": "United States", "ga_region": "Washington", "ga_metro": "Seattle-Tacoma WA", "ga_city": "Seattle", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1639563230934} -{"stream": "pages", "data": {"ga_date": "2021-12-10", "ga_hostname": "www.surveymonkey.com", "ga_pagePath": "/apps/NKI5TOTqk4tS5BZyJXU9YQ_3D_3D/preview", "ga_pageviews": 1, "ga_uniquePageviews": 1, "ga_avgTimeOnPage": 0.0, "ga_entrances": 1, "ga_entranceRate": 100.0, "ga_bounceRate": 100.0, "ga_exits": 1, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1639563227527} \ No newline at end of file +{"stream": "pages", "data": {"ga_date": "2021-12-10", "ga_hostname": "www.surveymonkey.com", "ga_pagePath": "/apps/NKI5TOTqk4tS5BZyJXU9YQ_3D_3D/preview", "ga_pageviews": 1, "ga_uniquePageviews": 1, "ga_avgTimeOnPage": 0.0, "ga_entrances": 1, "ga_entranceRate": 100.0, "ga_bounceRate": 100.0, "ga_exits": 1, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1639563227527} +{"stream": "website_overview", "data": {"ga_date": "2021-11-10", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 219.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 219.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006448} +{"stream": "website_overview", "data": {"ga_date": "2021-11-12", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006449} +{"stream": "website_overview", "data": {"ga_date": "2021-11-17", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006450} +{"stream": "website_overview", "data": {"ga_date": "2021-11-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 23.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006450} +{"stream": "website_overview", "data": {"ga_date": "2021-12-06", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006450} +{"stream": "website_overview", "data": {"ga_date": "2021-12-10", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006892} +{"stream": "website_overview", "data": {"ga_date": "2021-12-21", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006893} +{"stream": "website_overview", "data": {"ga_date": "2021-12-30", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 4.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 2.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006894} +{"stream": "website_overview", "data": {"ga_date": "2022-01-05", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 6.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006895} +{"stream": "website_overview", "data": {"ga_date": "2022-01-10", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006896} +{"stream": "website_overview", "data": {"ga_date": "2022-01-12", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006898} +{"stream": "website_overview", "data": {"ga_date": "2022-01-13", "ga_users": 2, "ga_newUsers": 0, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006898} +{"stream": "website_overview", "data": {"ga_date": "2022-01-14", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006899} +{"stream": "website_overview", "data": {"ga_date": "2022-01-16", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006899} +{"stream": "website_overview", "data": {"ga_date": "2022-01-17", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 4, "ga_sessionsPerUser": 1.3333333333333333, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006899} +{"stream": "website_overview", "data": {"ga_date": "2022-01-18", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006900} +{"stream": "website_overview", "data": {"ga_date": "2022-01-19", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006900} +{"stream": "website_overview", "data": {"ga_date": "2022-01-21", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006901} +{"stream": "website_overview", "data": {"ga_date": "2022-01-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006901} +{"stream": "website_overview", "data": {"ga_date": "2022-01-24", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 85.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.3333333333333333, "ga_avgTimeOnPage": 255.0, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 75.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006902} +{"stream": "website_overview", "data": {"ga_date": "2022-01-25", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 201.66666666666666, "ga_pageviews": 33, "ga_pageviewsPerSession": 11.0, "ga_avgTimeOnPage": 20.233333333333334, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 9.090909090909092, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006903} +{"stream": "website_overview", "data": {"ga_date": "2022-01-26", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006903} +{"stream": "website_overview", "data": {"ga_date": "2022-01-27", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 32.75, "ga_pageviews": 5, "ga_pageviewsPerSession": 1.25, "ga_avgTimeOnPage": 131.0, "ga_bounceRate": 75.0, "ga_exitRate": 80.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006904} +{"stream": "website_overview", "data": {"ga_date": "2022-01-28", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 4, "ga_sessionsPerUser": 1.3333333333333333, "ga_avgSessionDuration": 0.75, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 75.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006904} +{"stream": "website_overview", "data": {"ga_date": "2022-01-31", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 320.3333333333333, "ga_pageviews": 6, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 320.3333333333333, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006905} +{"stream": "website_overview", "data": {"ga_date": "2022-02-01", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 239.33333333333334, "ga_pageviews": 33, "ga_pageviewsPerSession": 11.0, "ga_avgTimeOnPage": 23.933333333333334, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 9.090909090909092, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006905} +{"stream": "website_overview", "data": {"ga_date": "2022-02-03", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 36.5, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 36.5, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006906} +{"stream": "website_overview", "data": {"ga_date": "2022-02-07", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006906} +{"stream": "website_overview", "data": {"ga_date": "2022-02-08", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 371.5, "ga_pageviews": 31, "ga_pageviewsPerSession": 15.5, "ga_avgTimeOnPage": 25.655172413793103, "ga_bounceRate": 0.0, "ga_exitRate": 6.451612903225806, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006907} +{"stream": "website_overview", "data": {"ga_date": "2022-02-09", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006908} +{"stream": "website_overview", "data": {"ga_date": "2022-02-10", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006908} +{"stream": "website_overview", "data": {"ga_date": "2022-02-13", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006908} +{"stream": "website_overview", "data": {"ga_date": "2022-02-14", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 310.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 4.0, "ga_avgTimeOnPage": 103.33333333333333, "ga_bounceRate": 0.0, "ga_exitRate": 25.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006909} +{"stream": "website_overview", "data": {"ga_date": "2022-02-15", "ga_users": 5, "ga_newUsers": 5, "ga_sessions": 5, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 187.8, "ga_pageviews": 36, "ga_pageviewsPerSession": 7.2, "ga_avgTimeOnPage": 30.258064516129032, "ga_bounceRate": 40.0, "ga_exitRate": 13.88888888888889, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006909} +{"stream": "website_overview", "data": {"ga_date": "2022-02-17", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006909} +{"stream": "website_overview", "data": {"ga_date": "2022-02-19", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 7.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 7.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006910} +{"stream": "website_overview", "data": {"ga_date": "2022-02-21", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006910} +{"stream": "website_overview", "data": {"ga_date": "2022-02-22", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006910} +{"stream": "website_overview", "data": {"ga_date": "2022-02-23", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006911} +{"stream": "website_overview", "data": {"ga_date": "2022-02-24", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006911} +{"stream": "website_overview", "data": {"ga_date": "2022-02-28", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006911} +{"stream": "website_overview", "data": {"ga_date": "2022-03-01", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 195.0, "ga_pageviews": 30, "ga_pageviewsPerSession": 30.0, "ga_avgTimeOnPage": 6.620689655172414, "ga_bounceRate": 0.0, "ga_exitRate": 3.3333333333333335, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006912} +{"stream": "website_overview", "data": {"ga_date": "2022-03-02", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 332.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 332.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006912} +{"stream": "website_overview", "data": {"ga_date": "2022-03-04", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006913} +{"stream": "website_overview", "data": {"ga_date": "2022-03-06", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006913} +{"stream": "website_overview", "data": {"ga_date": "2022-03-08", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 192.0, "ga_pageviews": 29, "ga_pageviewsPerSession": 29.0, "ga_avgTimeOnPage": 6.821428571428571, "ga_bounceRate": 0.0, "ga_exitRate": 3.4482758620689653, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750006913} +{"stream": "website_overview", "data": {"ga_date": "2022-03-09", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007206} +{"stream": "website_overview", "data": {"ga_date": "2022-03-10", "ga_users": 5, "ga_newUsers": 5, "ga_sessions": 5, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 7.0, "ga_pageviews": 6, "ga_pageviewsPerSession": 1.2, "ga_avgTimeOnPage": 35.0, "ga_bounceRate": 80.0, "ga_exitRate": 83.33333333333334, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007206} +{"stream": "website_overview", "data": {"ga_date": "2022-03-11", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007207} +{"stream": "website_overview", "data": {"ga_date": "2022-03-12", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 4, "ga_sessionsPerUser": 4.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007207} +{"stream": "website_overview", "data": {"ga_date": "2022-03-13", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007207} +{"stream": "website_overview", "data": {"ga_date": "2022-03-14", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007208} +{"stream": "website_overview", "data": {"ga_date": "2022-03-15", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 131.0, "ga_pageviews": 30, "ga_pageviewsPerSession": 15.0, "ga_avgTimeOnPage": 9.428571428571429, "ga_bounceRate": 50.0, "ga_exitRate": 6.666666666666667, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007208} +{"stream": "website_overview", "data": {"ga_date": "2022-03-16", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007208} +{"stream": "website_overview", "data": {"ga_date": "2022-03-17", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 185.5, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 185.5, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007208} +{"stream": "website_overview", "data": {"ga_date": "2022-03-18", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 912.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 456.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007209} +{"stream": "website_overview", "data": {"ga_date": "2022-03-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 215.0, "ga_pageviews": 29, "ga_pageviewsPerSession": 29.0, "ga_avgTimeOnPage": 7.785714285714286, "ga_bounceRate": 0.0, "ga_exitRate": 3.4482758620689653, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007209} +{"stream": "website_overview", "data": {"ga_date": "2022-03-23", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.5, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007209} +{"stream": "website_overview", "data": {"ga_date": "2022-03-24", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 115.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 230.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007210} +{"stream": "website_overview", "data": {"ga_date": "2022-03-25", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 34.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.3333333333333333, "ga_avgTimeOnPage": 102.0, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 75.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007210} +{"stream": "website_overview", "data": {"ga_date": "2022-03-26", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007210} +{"stream": "website_overview", "data": {"ga_date": "2022-03-28", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 2.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007210} +{"stream": "website_overview", "data": {"ga_date": "2022-03-29", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 89.66666666666667, "ga_pageviews": 32, "ga_pageviewsPerSession": 10.666666666666666, "ga_avgTimeOnPage": 9.275862068965518, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 9.375, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007211} +{"stream": "website_overview", "data": {"ga_date": "2022-03-30", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007211} +{"stream": "website_overview", "data": {"ga_date": "2022-03-31", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007211} +{"stream": "website_overview", "data": {"ga_date": "2022-04-01", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007211} +{"stream": "website_overview", "data": {"ga_date": "2022-04-04", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 56.0, "ga_pageviews": 30, "ga_pageviewsPerSession": 15.0, "ga_avgTimeOnPage": 4.0, "ga_bounceRate": 50.0, "ga_exitRate": 6.666666666666667, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007212} +{"stream": "website_overview", "data": {"ga_date": "2022-04-05", "ga_users": 4, "ga_newUsers": 2, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007212} +{"stream": "website_overview", "data": {"ga_date": "2022-04-06", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007212} +{"stream": "website_overview", "data": {"ga_date": "2022-04-07", "ga_users": 5, "ga_newUsers": 5, "ga_sessions": 5, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 4.8, "ga_pageviews": 5, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 80.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007213} +{"stream": "website_overview", "data": {"ga_date": "2022-04-08", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007213} +{"stream": "website_overview", "data": {"ga_date": "2022-04-10", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007213} +{"stream": "website_overview", "data": {"ga_date": "2022-04-11", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 26.0, "ga_pageviews": 32, "ga_pageviewsPerSession": 8.0, "ga_avgTimeOnPage": 3.642857142857143, "ga_bounceRate": 75.0, "ga_exitRate": 12.5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007213} +{"stream": "website_overview", "data": {"ga_date": "2022-04-12", "ga_users": 5, "ga_newUsers": 4, "ga_sessions": 5, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 89.4, "ga_pageviews": 5, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 80.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007214} +{"stream": "website_overview", "data": {"ga_date": "2022-04-13", "ga_users": 9, "ga_newUsers": 9, "ga_sessions": 11, "ga_sessionsPerUser": 1.2222222222222223, "ga_avgSessionDuration": 41.63636363636363, "ga_pageviews": 12, "ga_pageviewsPerSession": 1.0909090909090908, "ga_avgTimeOnPage": 458.0, "ga_bounceRate": 72.72727272727273, "ga_exitRate": 91.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007214} +{"stream": "website_overview", "data": {"ga_date": "2022-04-14", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 359.0, "ga_pageviews": 7, "ga_pageviewsPerSession": 2.3333333333333335, "ga_avgTimeOnPage": 269.25, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 42.857142857142854, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007214} +{"stream": "website_overview", "data": {"ga_date": "2022-04-15", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 47.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 47.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007214} +{"stream": "website_overview", "data": {"ga_date": "2022-04-16", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007215} +{"stream": "website_overview", "data": {"ga_date": "2022-04-18", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 83.33333333333333, "ga_pageviews": 33, "ga_pageviewsPerSession": 11.0, "ga_avgTimeOnPage": 8.2, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 9.090909090909092, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007215} +{"stream": "website_overview", "data": {"ga_date": "2022-04-19", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.6666666666666666, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007215} +{"stream": "website_overview", "data": {"ga_date": "2022-04-20", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007216} +{"stream": "website_overview", "data": {"ga_date": "2022-04-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 342.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 342.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007217} +{"stream": "website_overview", "data": {"ga_date": "2022-04-23", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 4.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007217} +{"stream": "website_overview", "data": {"ga_date": "2022-04-24", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 3256.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 1627.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007217} +{"stream": "website_overview", "data": {"ga_date": "2022-04-26", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007217} +{"stream": "website_overview", "data": {"ga_date": "2022-04-27", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 24.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007218} +{"stream": "website_overview", "data": {"ga_date": "2022-04-29", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007218} +{"stream": "website_overview", "data": {"ga_date": "2022-05-02", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007218} +{"stream": "website_overview", "data": {"ga_date": "2022-05-03", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 23.0, "ga_pageviews": 5, "ga_pageviewsPerSession": 1.6666666666666667, "ga_avgTimeOnPage": 34.5, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 60.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007219} +{"stream": "website_overview", "data": {"ga_date": "2022-05-04", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007219} +{"stream": "website_overview", "data": {"ga_date": "2022-05-09", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007219} +{"stream": "website_overview", "data": {"ga_date": "2022-05-10", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 78.0, "ga_pageviews": 29, "ga_pageviewsPerSession": 14.5, "ga_avgTimeOnPage": 5.703703703703703, "ga_bounceRate": 50.0, "ga_exitRate": 6.896551724137931, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007219} +{"stream": "website_overview", "data": {"ga_date": "2022-05-11", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 18.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 18.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007220} +{"stream": "website_overview", "data": {"ga_date": "2022-05-16", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 225.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 225.0, "ga_bounceRate": 50.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007220} +{"stream": "website_overview", "data": {"ga_date": "2022-05-17", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007220} +{"stream": "website_overview", "data": {"ga_date": "2022-05-18", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007221} +{"stream": "website_overview", "data": {"ga_date": "2022-05-19", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007221} +{"stream": "website_overview", "data": {"ga_date": "2022-05-20", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1228.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 1228.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007221} +{"stream": "website_overview", "data": {"ga_date": "2022-05-25", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 93.5, "ga_pageviews": 6, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 46.75, "ga_bounceRate": 50.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007222} +{"stream": "website_overview", "data": {"ga_date": "2022-05-30", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 35.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 35.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007222} +{"stream": "website_overview", "data": {"ga_date": "2022-05-31", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 4, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007222} +{"stream": "website_overview", "data": {"ga_date": "2022-06-01", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 20.5, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 41.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007223} +{"stream": "website_overview", "data": {"ga_date": "2022-06-02", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007223} +{"stream": "website_overview", "data": {"ga_date": "2022-06-03", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007223} +{"stream": "website_overview", "data": {"ga_date": "2022-06-06", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 3.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007224} +{"stream": "website_overview", "data": {"ga_date": "2022-06-07", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 69.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 69.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007224} +{"stream": "website_overview", "data": {"ga_date": "2022-06-08", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007554} +{"stream": "website_overview", "data": {"ga_date": "2022-06-09", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007555} +{"stream": "website_overview", "data": {"ga_date": "2022-06-13", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007555} +{"stream": "website_overview", "data": {"ga_date": "2022-06-14", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 120.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 240.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007556} +{"stream": "website_overview", "data": {"ga_date": "2022-06-15", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 0, "ga_pageviewsPerSession": 0.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 0.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007556} +{"stream": "website_overview", "data": {"ga_date": "2022-06-16", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 80.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 160.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007556} +{"stream": "website_overview", "data": {"ga_date": "2022-06-18", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007557} +{"stream": "website_overview", "data": {"ga_date": "2022-06-21", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 53.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 53.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007557} +{"stream": "website_overview", "data": {"ga_date": "2022-06-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 50.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 25.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007558} +{"stream": "website_overview", "data": {"ga_date": "2022-06-27", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007558} +{"stream": "website_overview", "data": {"ga_date": "2022-06-28", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007559} +{"stream": "website_overview", "data": {"ga_date": "2022-06-29", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 256.0, "ga_pageviews": 9, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 127.83333333333333, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007559} +{"stream": "website_overview", "data": {"ga_date": "2022-07-01", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 15.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 30.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007560} +{"stream": "website_overview", "data": {"ga_date": "2022-07-05", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1246.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007560} +{"stream": "website_overview", "data": {"ga_date": "2022-07-06", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 306.6666666666667, "ga_pageviews": 6, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 306.6666666666667, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007561} +{"stream": "website_overview", "data": {"ga_date": "2022-07-07", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007561} +{"stream": "website_overview", "data": {"ga_date": "2022-07-08", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007561} +{"stream": "website_overview", "data": {"ga_date": "2022-07-09", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 971.0, "ga_pageviews": 8, "ga_pageviewsPerSession": 4.0, "ga_avgTimeOnPage": 323.6666666666667, "ga_bounceRate": 50.0, "ga_exitRate": 25.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007562} +{"stream": "website_overview", "data": {"ga_date": "2022-07-11", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007563} +{"stream": "website_overview", "data": {"ga_date": "2022-07-12", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007564} +{"stream": "website_overview", "data": {"ga_date": "2022-07-13", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007564} +{"stream": "website_overview", "data": {"ga_date": "2022-07-14", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 158.0, "ga_pageviews": 7, "ga_pageviewsPerSession": 3.5, "ga_avgTimeOnPage": 63.4, "ga_bounceRate": 0.0, "ga_exitRate": 28.57142857142857, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007565} +{"stream": "website_overview", "data": {"ga_date": "2022-07-15", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007566} +{"stream": "website_overview", "data": {"ga_date": "2022-07-19", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.25, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 75.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007568} +{"stream": "website_overview", "data": {"ga_date": "2022-07-20", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007568} +{"stream": "website_overview", "data": {"ga_date": "2022-07-21", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007568} +{"stream": "website_overview", "data": {"ga_date": "2022-07-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007569} +{"stream": "website_overview", "data": {"ga_date": "2022-07-26", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 102.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 51.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007569} +{"stream": "website_overview", "data": {"ga_date": "2022-07-27", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 61.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007569} +{"stream": "website_overview", "data": {"ga_date": "2022-07-28", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 4.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007570} +{"stream": "website_overview", "data": {"ga_date": "2022-07-29", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1918.0, "ga_pageviews": 7, "ga_pageviewsPerSession": 7.0, "ga_avgTimeOnPage": 319.5, "ga_bounceRate": 0.0, "ga_exitRate": 14.285714285714285, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007570} +{"stream": "website_overview", "data": {"ga_date": "2022-07-30", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007571} +{"stream": "website_overview", "data": {"ga_date": "2022-07-31", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007571} +{"stream": "website_overview", "data": {"ga_date": "2022-08-01", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 251.5, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 503.0, "ga_bounceRate": 0.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007571} +{"stream": "website_overview", "data": {"ga_date": "2022-08-02", "ga_users": 5, "ga_newUsers": 5, "ga_sessions": 6, "ga_sessionsPerUser": 1.2, "ga_avgSessionDuration": 44.5, "ga_pageviews": 8, "ga_pageviewsPerSession": 1.3333333333333333, "ga_avgTimeOnPage": 133.5, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 75.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007572} +{"stream": "website_overview", "data": {"ga_date": "2022-08-04", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007572} +{"stream": "website_overview", "data": {"ga_date": "2022-08-08", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007572} +{"stream": "website_overview", "data": {"ga_date": "2022-08-10", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 256.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 256.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007573} +{"stream": "website_overview", "data": {"ga_date": "2022-08-12", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007573} +{"stream": "website_overview", "data": {"ga_date": "2022-08-16", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007573} +{"stream": "website_overview", "data": {"ga_date": "2022-08-17", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007574} +{"stream": "website_overview", "data": {"ga_date": "2022-08-18", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 586.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 586.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007574} +{"stream": "website_overview", "data": {"ga_date": "2022-08-20", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 371.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 371.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007574} +{"stream": "website_overview", "data": {"ga_date": "2022-08-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007575} +{"stream": "website_overview", "data": {"ga_date": "2022-08-23", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 5, "ga_sessionsPerUser": 1.25, "ga_avgSessionDuration": 0.0, "ga_pageviews": 5, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007575} +{"stream": "website_overview", "data": {"ga_date": "2022-08-24", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007576} +{"stream": "website_overview", "data": {"ga_date": "2022-08-26", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007576} +{"stream": "website_overview", "data": {"ga_date": "2022-08-27", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 301.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 301.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007576} +{"stream": "website_overview", "data": {"ga_date": "2022-08-28", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007577} +{"stream": "website_overview", "data": {"ga_date": "2022-08-29", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 154.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 77.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007577} +{"stream": "website_overview", "data": {"ga_date": "2022-08-31", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 223.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 223.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007577} +{"stream": "website_overview", "data": {"ga_date": "2022-09-01", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007578} +{"stream": "website_overview", "data": {"ga_date": "2022-09-02", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007578} +{"stream": "website_overview", "data": {"ga_date": "2022-09-05", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007578} +{"stream": "website_overview", "data": {"ga_date": "2022-09-06", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 39.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 39.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750007578} +{"stream": "website_overview", "data": {"ga_date": "2022-09-13", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008024} +{"stream": "website_overview", "data": {"ga_date": "2022-09-15", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008024} +{"stream": "website_overview", "data": {"ga_date": "2022-09-18", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 75.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 75.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008025} +{"stream": "website_overview", "data": {"ga_date": "2022-09-19", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008025} +{"stream": "website_overview", "data": {"ga_date": "2022-09-20", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 5, "ga_sessionsPerUser": 1.25, "ga_avgSessionDuration": 0.0, "ga_pageviews": 5, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008025} +{"stream": "website_overview", "data": {"ga_date": "2022-09-21", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 357.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 714.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008026} +{"stream": "website_overview", "data": {"ga_date": "2022-09-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008026} +{"stream": "website_overview", "data": {"ga_date": "2022-09-23", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008026} +{"stream": "website_overview", "data": {"ga_date": "2022-09-27", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008027} +{"stream": "website_overview", "data": {"ga_date": "2022-09-29", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008027} +{"stream": "website_overview", "data": {"ga_date": "2022-10-02", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008027} +{"stream": "website_overview", "data": {"ga_date": "2022-10-03", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 10.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 10.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008028} +{"stream": "website_overview", "data": {"ga_date": "2022-10-06", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 114.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 114.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008028} +{"stream": "website_overview", "data": {"ga_date": "2022-10-07", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008028} +{"stream": "website_overview", "data": {"ga_date": "2022-10-10", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008029} +{"stream": "website_overview", "data": {"ga_date": "2022-10-12", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 18.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008029} +{"stream": "website_overview", "data": {"ga_date": "2022-10-13", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 107.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008029} +{"stream": "website_overview", "data": {"ga_date": "2022-10-14", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 7.5, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 15.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008029} +{"stream": "website_overview", "data": {"ga_date": "2022-10-22", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008030} +{"stream": "website_overview", "data": {"ga_date": "2022-10-25", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.5, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008030} +{"stream": "website_overview", "data": {"ga_date": "2022-10-28", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008030} +{"stream": "website_overview", "data": {"ga_date": "2022-10-29", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008031} +{"stream": "website_overview", "data": {"ga_date": "2022-10-30", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1347.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 673.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008031} +{"stream": "website_overview", "data": {"ga_date": "2022-11-01", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 405.5, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008031} +{"stream": "website_overview", "data": {"ga_date": "2022-11-02", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008032} +{"stream": "website_overview", "data": {"ga_date": "2022-11-04", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008032} +{"stream": "website_overview", "data": {"ga_date": "2022-11-05", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008032} +{"stream": "website_overview", "data": {"ga_date": "2022-11-07", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 8.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 16.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008032} +{"stream": "website_overview", "data": {"ga_date": "2022-11-09", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 13.0, "ga_pageviews": 5, "ga_pageviewsPerSession": 2.5, "ga_avgTimeOnPage": 8.666666666666666, "ga_bounceRate": 50.0, "ga_exitRate": 40.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008033} +{"stream": "website_overview", "data": {"ga_date": "2022-11-10", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008033} +{"stream": "website_overview", "data": {"ga_date": "2022-11-14", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008033} +{"stream": "website_overview", "data": {"ga_date": "2022-11-15", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008034} +{"stream": "website_overview", "data": {"ga_date": "2022-11-16", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 107.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 214.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008034} +{"stream": "website_overview", "data": {"ga_date": "2022-11-17", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008034} +{"stream": "website_overview", "data": {"ga_date": "2022-11-18", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008035} +{"stream": "website_overview", "data": {"ga_date": "2022-11-19", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008035} +{"stream": "website_overview", "data": {"ga_date": "2022-11-23", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008035} +{"stream": "website_overview", "data": {"ga_date": "2022-11-24", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 66.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 132.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008035} +{"stream": "website_overview", "data": {"ga_date": "2022-11-25", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 33.333333333333336, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.3333333333333333, "ga_avgTimeOnPage": 100.0, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 75.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008036} +{"stream": "website_overview", "data": {"ga_date": "2022-11-28", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 4, "ga_sessionsPerUser": 1.3333333333333333, "ga_avgSessionDuration": 144.25, "ga_pageviews": 6, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 288.5, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008036} +{"stream": "website_overview", "data": {"ga_date": "2022-11-29", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008036} +{"stream": "website_overview", "data": {"ga_date": "2022-11-30", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008037} +{"stream": "website_overview", "data": {"ga_date": "2022-12-02", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 27.0, "ga_pageviews": 6, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 13.5, "ga_bounceRate": 50.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008037} +{"stream": "website_overview", "data": {"ga_date": "2022-12-05", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008037} +{"stream": "website_overview", "data": {"ga_date": "2022-12-06", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008038} +{"stream": "website_overview", "data": {"ga_date": "2022-12-07", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008331} +{"stream": "website_overview", "data": {"ga_date": "2022-12-08", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008331} +{"stream": "website_overview", "data": {"ga_date": "2022-12-09", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008332} +{"stream": "website_overview", "data": {"ga_date": "2022-12-10", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008332} +{"stream": "website_overview", "data": {"ga_date": "2022-12-12", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008332} +{"stream": "website_overview", "data": {"ga_date": "2022-12-14", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008333} +{"stream": "website_overview", "data": {"ga_date": "2022-12-15", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008333} +{"stream": "website_overview", "data": {"ga_date": "2022-12-19", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 352.25, "ga_pageviews": 11, "ga_pageviewsPerSession": 2.75, "ga_avgTimeOnPage": 201.14285714285714, "ga_bounceRate": 25.0, "ga_exitRate": 36.36363636363637, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008333} +{"stream": "website_overview", "data": {"ga_date": "2022-12-20", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 2.5, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 2.5, "ga_bounceRate": 50.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008333} +{"stream": "website_overview", "data": {"ga_date": "2022-12-21", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1120.0, "ga_pageviews": 42, "ga_pageviewsPerSession": 14.0, "ga_avgTimeOnPage": 86.12820512820512, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 7.142857142857142, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008334} +{"stream": "website_overview", "data": {"ga_date": "2022-12-22", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 4, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 29.75, "ga_pageviews": 6, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 59.5, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008334} +{"stream": "website_overview", "data": {"ga_date": "2022-12-26", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008335} +{"stream": "website_overview", "data": {"ga_date": "2022-12-27", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008335} +{"stream": "website_overview", "data": {"ga_date": "2022-12-28", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008335} +{"stream": "website_overview", "data": {"ga_date": "2022-12-29", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008335} +{"stream": "website_overview", "data": {"ga_date": "2022-12-30", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008336} +{"stream": "website_overview", "data": {"ga_date": "2022-12-31", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 0, "ga_sessionsPerUser": 0.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 0, "ga_pageviewsPerSession": 0.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 0.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008336} +{"stream": "website_overview", "data": {"ga_date": "2023-01-02", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008337} +{"stream": "website_overview", "data": {"ga_date": "2023-01-04", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 257.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 257.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008337} +{"stream": "website_overview", "data": {"ga_date": "2023-01-05", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008337} +{"stream": "website_overview", "data": {"ga_date": "2023-01-06", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 146.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 146.0, "ga_bounceRate": 50.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008338} +{"stream": "website_overview", "data": {"ga_date": "2023-01-08", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008340} +{"stream": "website_overview", "data": {"ga_date": "2023-01-09", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008341} +{"stream": "website_overview", "data": {"ga_date": "2023-01-11", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 478.5, "ga_pageviews": 7, "ga_pageviewsPerSession": 3.5, "ga_avgTimeOnPage": 191.4, "ga_bounceRate": 50.0, "ga_exitRate": 28.57142857142857, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008342} +{"stream": "website_overview", "data": {"ga_date": "2023-01-12", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 9.5, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 19.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008343} +{"stream": "website_overview", "data": {"ga_date": "2023-01-14", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008344} +{"stream": "website_overview", "data": {"ga_date": "2023-01-15", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008344} +{"stream": "website_overview", "data": {"ga_date": "2023-01-16", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008344} +{"stream": "website_overview", "data": {"ga_date": "2023-01-17", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008348} +{"stream": "website_overview", "data": {"ga_date": "2023-01-18", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 90.5, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 90.5, "ga_bounceRate": 50.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008348} +{"stream": "website_overview", "data": {"ga_date": "2023-01-19", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008349} +{"stream": "website_overview", "data": {"ga_date": "2023-01-24", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008349} +{"stream": "website_overview", "data": {"ga_date": "2023-01-25", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750008349} +{"stream": "traffic_sources", "data": {"ga_date": "2021-11-10", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 219.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 219.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008681} +{"stream": "traffic_sources", "data": {"ga_date": "2021-11-12", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008682} +{"stream": "traffic_sources", "data": {"ga_date": "2021-11-17", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008682} +{"stream": "traffic_sources", "data": {"ga_date": "2021-11-22", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 23.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008683} +{"stream": "traffic_sources", "data": {"ga_date": "2021-12-06", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008683} +{"stream": "traffic_sources", "data": {"ga_date": "2021-12-10", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008946} +{"stream": "traffic_sources", "data": {"ga_date": "2021-12-21", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008947} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-05", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 6.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008948} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-10", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008948} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-12", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008949} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-13", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008949} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-13", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008949} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-14", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008950} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-16", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008950} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-17", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008950} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-17", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008951} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-18", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008951} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-19", "ga_source": "api.surveymonkey.net", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008951} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-21", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008952} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008952} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-24", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 86.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.3333333333333333, "ga_avgTimeOnPage": 258.0, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 75.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008952} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-25", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 204.33333333333334, "ga_pageviews": 33, "ga_pageviewsPerSession": 11.0, "ga_avgTimeOnPage": 20.5, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 9.090909090909092, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008953} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-26", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008953} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-27", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008954} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-27", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 133.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 133.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008954} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-27", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008955} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-28", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 4, "ga_sessionsPerUser": 1.3333333333333333, "ga_avgSessionDuration": 0.75, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 75.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008955} +{"stream": "traffic_sources", "data": {"ga_date": "2022-01-31", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 324.6666666666667, "ga_pageviews": 6, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 324.6666666666667, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008956} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-01", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 242.66666666666666, "ga_pageviews": 33, "ga_pageviewsPerSession": 11.0, "ga_avgTimeOnPage": 24.266666666666666, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 9.090909090909092, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008956} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-03", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 37.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 37.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008957} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-07", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008957} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-08", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 297.0, "ga_pageviews": 30, "ga_pageviewsPerSession": 30.0, "ga_avgTimeOnPage": 10.275862068965518, "ga_bounceRate": 0.0, "ga_exitRate": 3.3333333333333335, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008958} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-08", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 456.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008958} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-09", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008958} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-10", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008959} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-13", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008959} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-14", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 314.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 4.0, "ga_avgTimeOnPage": 104.66666666666667, "ga_bounceRate": 0.0, "ga_exitRate": 25.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008960} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-15", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 69.66666666666667, "ga_pageviews": 32, "ga_pageviewsPerSession": 10.666666666666666, "ga_avgTimeOnPage": 7.172413793103448, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 9.375, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008960} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-15", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 371.5, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 371.5, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008960} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-17", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008961} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-19", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 7.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 7.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008961} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-21", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008962} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008962} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-23", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008964} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-23", "ga_source": "api.surveymonkey.net", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008964} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-24", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008965} +{"stream": "traffic_sources", "data": {"ga_date": "2022-02-28", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008966} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-01", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 198.0, "ga_pageviews": 30, "ga_pageviewsPerSession": 30.0, "ga_avgTimeOnPage": 6.724137931034483, "ga_bounceRate": 0.0, "ga_exitRate": 3.3333333333333335, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008966} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-02", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 336.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 336.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008966} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-04", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008967} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-06", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008967} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-08", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 195.0, "ga_pageviews": 29, "ga_pageviewsPerSession": 29.0, "ga_avgTimeOnPage": 6.928571428571429, "ga_bounceRate": 0.0, "ga_exitRate": 3.4482758620689653, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750008967} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-09", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009206} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-10", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009207} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-10", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 35.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 35.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009207} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-11", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009208} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-12", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 4, "ga_sessionsPerUser": 4.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009208} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-13", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009208} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-14", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009208} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-15", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 131.0, "ga_pageviews": 30, "ga_pageviewsPerSession": 15.0, "ga_avgTimeOnPage": 9.428571428571429, "ga_bounceRate": 50.0, "ga_exitRate": 6.666666666666667, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009209} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-16", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009209} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-17", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 185.5, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 185.5, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009209} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-18", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 912.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 456.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009210} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 215.0, "ga_pageviews": 29, "ga_pageviewsPerSession": 29.0, "ga_avgTimeOnPage": 7.785714285714286, "ga_bounceRate": 0.0, "ga_exitRate": 3.4482758620689653, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009210} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-23", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009210} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-23", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009211} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-24", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 115.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 230.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009211} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-25", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 51.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 102.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009211} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-25", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009212} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-26", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009212} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-28", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 6.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009213} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-28", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009213} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-28", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009213} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-29", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 101.5, "ga_pageviews": 30, "ga_pageviewsPerSession": 15.0, "ga_avgTimeOnPage": 7.25, "ga_bounceRate": 50.0, "ga_exitRate": 6.666666666666667, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009214} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-29", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 66.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 66.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009214} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-30", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009214} +{"stream": "traffic_sources", "data": {"ga_date": "2022-03-31", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009215} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-01", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009215} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-04", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 56.0, "ga_pageviews": 30, "ga_pageviewsPerSession": 15.0, "ga_avgTimeOnPage": 4.0, "ga_bounceRate": 50.0, "ga_exitRate": 6.666666666666667, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009216} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-05", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009216} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-05", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009217} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-06", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009217} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-07", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 5, "ga_newUsers": 5, "ga_sessions": 5, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 4.8, "ga_pageviews": 5, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 80.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009218} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-08", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009218} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-10", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009218} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-11", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 4, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 26.0, "ga_pageviews": 32, "ga_pageviewsPerSession": 8.0, "ga_avgTimeOnPage": 3.642857142857143, "ga_bounceRate": 75.0, "ga_exitRate": 12.5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009220} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-12", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009236} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-12", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 223.5, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009236} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-13", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 9, "ga_newUsers": 9, "ga_sessions": 10, "ga_sessionsPerUser": 1.1111111111111112, "ga_avgSessionDuration": 45.8, "ga_pageviews": 11, "ga_pageviewsPerSession": 1.1, "ga_avgTimeOnPage": 458.0, "ga_bounceRate": 70.0, "ga_exitRate": 90.9090909090909, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009237} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-13", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009237} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-14", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 496.5, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 496.5, "ga_bounceRate": 50.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009237} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-14", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 84.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 42.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009238} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-15", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 47.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 47.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009238} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-16", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009238} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-18", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 179.0, "ga_pageviews": 29, "ga_pageviewsPerSession": 29.0, "ga_avgTimeOnPage": 6.285714285714286, "ga_bounceRate": 0.0, "ga_exitRate": 3.4482758620689653, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009239} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-18", "ga_source": "admin.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 71.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 35.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009239} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-18", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009239} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-19", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.6666666666666666, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009239} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-20", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009240} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 342.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 342.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009240} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-23", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 4.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009240} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-24", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 3256.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 1627.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009241} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-26", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009241} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-27", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 24.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009241} +{"stream": "traffic_sources", "data": {"ga_date": "2022-04-29", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009242} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-02", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009242} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-03", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 69.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 34.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009242} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-03", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009242} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-04", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009243} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-09", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009243} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-09", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009243} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-10", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 78.0, "ga_pageviews": 29, "ga_pageviewsPerSession": 14.5, "ga_avgTimeOnPage": 5.703703703703703, "ga_bounceRate": 50.0, "ga_exitRate": 6.896551724137931, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009244} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-11", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 18.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 18.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009244} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-16", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009244} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-16", "ga_source": "api.surveymonkey.net", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 450.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 225.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009245} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-17", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009245} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-17", "ga_source": "api.surveymonkey.net", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009245} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-18", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009246} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-19", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009246} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-19", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009247} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-20", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1228.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 1228.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009247} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-25", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 187.0, "ga_pageviews": 5, "ga_pageviewsPerSession": 5.0, "ga_avgTimeOnPage": 46.75, "ga_bounceRate": 0.0, "ga_exitRate": 20.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009247} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-25", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009248} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-30", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 35.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 35.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009248} +{"stream": "traffic_sources", "data": {"ga_date": "2022-05-31", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 4, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009248} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-01", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 20.5, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 41.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009249} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-02", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009249} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-03", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009249} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-06", "ga_source": "bing", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 6.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009250} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-06", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009250} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-07", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 69.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 69.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009250} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-08", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009504} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-09", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009505} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-13", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009505} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-14", "ga_source": "api.surveymonkey.net", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 240.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 240.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009506} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-14", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009507} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-15", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 0, "ga_pageviewsPerSession": 0.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 0.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009507} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-16", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 80.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 160.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009508} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-18", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009508} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-21", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 53.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 53.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009508} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-22", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 50.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 25.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009509} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-27", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009509} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-28", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009509} +{"stream": "traffic_sources", "data": {"ga_date": "2022-06-29", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 256.0, "ga_pageviews": 9, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 127.83333333333333, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009510} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-01", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 15.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 30.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009510} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-05", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1246.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009510} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-06", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 306.6666666666667, "ga_pageviews": 6, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 306.6666666666667, "ga_bounceRate": 33.33333333333333, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009511} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-07", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009511} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-08", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009511} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-09", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009512} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-09", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1942.0, "ga_pageviews": 7, "ga_pageviewsPerSession": 7.0, "ga_avgTimeOnPage": 323.6666666666667, "ga_bounceRate": 0.0, "ga_exitRate": 14.285714285714285, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009512} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-11", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009513} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-11", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009513} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-12", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009514} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-13", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009514} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-14", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 158.0, "ga_pageviews": 7, "ga_pageviewsPerSession": 3.5, "ga_avgTimeOnPage": 63.4, "ga_bounceRate": 0.0, "ga_exitRate": 28.57142857142857, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009514} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-15", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009515} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-19", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009515} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-19", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009516} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-20", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009516} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-21", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009516} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009517} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-26", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 102.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 51.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009517} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-27", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 61.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009517} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-28", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 4.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009518} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-29", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1918.0, "ga_pageviews": 7, "ga_pageviewsPerSession": 7.0, "ga_avgTimeOnPage": 319.5, "ga_bounceRate": 0.0, "ga_exitRate": 14.285714285714285, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009518} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-30", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009518} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-31", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009519} +{"stream": "traffic_sources", "data": {"ga_date": "2022-07-31", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009519} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-01", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 251.5, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 503.0, "ga_bounceRate": 0.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009519} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-02", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 4, "ga_newUsers": 4, "ga_sessions": 5, "ga_sessionsPerUser": 1.25, "ga_avgSessionDuration": 53.4, "ga_pageviews": 7, "ga_pageviewsPerSession": 1.4, "ga_avgTimeOnPage": 133.5, "ga_bounceRate": 60.0, "ga_exitRate": 71.42857142857143, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009519} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-02", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009520} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-04", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009520} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-08", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009520} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-10", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 256.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 256.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009521} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-12", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009521} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-16", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009521} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-17", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009522} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-18", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 586.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 586.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009522} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-20", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 371.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 371.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009522} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009523} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-23", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009523} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-23", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009523} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-23", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009524} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-24", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009524} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-26", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009524} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-27", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 301.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 301.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009525} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-28", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009525} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-28", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009525} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-29", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 154.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 77.0, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009525} +{"stream": "traffic_sources", "data": {"ga_date": "2022-08-31", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 223.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 223.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009526} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-01", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009526} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-02", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009526} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-02", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009527} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-05", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009527} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-06", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 39.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 39.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009528} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-13", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009803} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-15", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009804} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-18", "ga_source": "api.surveymonkey.net", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 75.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 75.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009804} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-19", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009805} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-19", "ga_source": "adwords", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009805} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-20", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009806} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-20", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009806} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-21", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 357.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 714.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009807} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009807} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-23", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009808} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-27", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009808} +{"stream": "traffic_sources", "data": {"ga_date": "2022-09-29", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009809} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-02", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009809} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-03", "ga_source": "adwords", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 10.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 10.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009810} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-06", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 114.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 114.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009810} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-07", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009810} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-10", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009810} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-12", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009811} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-12", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 36.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009811} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-13", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 211.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009811} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-13", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 3.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009812} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-14", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 7.5, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 15.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009812} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009813} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-25", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009813} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-25", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009813} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-28", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009814} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-29", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009814} +{"stream": "traffic_sources", "data": {"ga_date": "2022-10-30", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1347.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 673.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009814} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-01", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 405.5, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 50.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009815} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-02", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009816} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-04", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009816} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-05", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009817} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-07", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 16.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 16.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009817} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-07", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009818} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-09", "ga_source": "airbyte.workable.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 26.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 4.0, "ga_avgTimeOnPage": 8.666666666666666, "ga_bounceRate": 0.0, "ga_exitRate": 25.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009818} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-09", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009818} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-10", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009819} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-14", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009819} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-15", "ga_source": "api.surveymonkey.net", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009819} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-15", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009820} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-15", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009820} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-16", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 107.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 214.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009820} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-17", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009821} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-18", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009821} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-19", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009821} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-23", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009822} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-24", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 66.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 132.0, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009822} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-25", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 100.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 100.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009822} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-25", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009823} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-25", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009823} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-28", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 121.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 1.3333333333333333, "ga_avgTimeOnPage": 363.0, "ga_bounceRate": 66.66666666666666, "ga_exitRate": 75.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009823} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-28", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 214.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 214.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009823} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-29", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009824} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-30", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009824} +{"stream": "traffic_sources", "data": {"ga_date": "2022-11-30", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009824} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-02", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 54.0, "ga_pageviews": 5, "ga_pageviewsPerSession": 5.0, "ga_avgTimeOnPage": 13.5, "ga_bounceRate": 0.0, "ga_exitRate": 20.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009824} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-02", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009824} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-05", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009825} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-05", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009825} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-05", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009825} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-06", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750009825} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-07", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010097} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-08", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010098} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-09", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010099} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-09", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010099} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-09", "ga_source": "bing", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010100} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-10", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010101} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-12", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010101} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-14", "ga_source": "bing", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010101} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-15", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010102} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-19", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 3, "ga_newUsers": 3, "ga_sessions": 3, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 469.6666666666667, "ga_pageviews": 10, "ga_pageviewsPerSession": 3.3333333333333335, "ga_avgTimeOnPage": 201.14285714285714, "ga_bounceRate": 0.0, "ga_exitRate": 30.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010102} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-19", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010103} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-20", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 5.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 2.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010104} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-20", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010105} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-21", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 1680.0, "ga_pageviews": 41, "ga_pageviewsPerSession": 20.5, "ga_avgTimeOnPage": 86.12820512820512, "ga_bounceRate": 0.0, "ga_exitRate": 4.878048780487805, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010106} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-21", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010107} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-22", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 1, "ga_sessions": 4, "ga_sessionsPerUser": 2.0, "ga_avgSessionDuration": 29.75, "ga_pageviews": 6, "ga_pageviewsPerSession": 1.5, "ga_avgTimeOnPage": 59.5, "ga_bounceRate": 50.0, "ga_exitRate": 66.66666666666666, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010107} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-26", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010108} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-27", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 0, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010108} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-28", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010109} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-29", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010109} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-30", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010110} +{"stream": "traffic_sources", "data": {"ga_date": "2022-12-31", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 0, "ga_sessionsPerUser": 0.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 0, "ga_pageviewsPerSession": 0.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 0.0, "ga_exitRate": 0.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010110} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-02", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010111} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-02", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010111} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-04", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 257.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 257.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010112} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-05", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 3, "ga_sessionsPerUser": 1.5, "ga_avgSessionDuration": 0.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010113} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-06", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 146.0, "ga_pageviews": 4, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 146.0, "ga_bounceRate": 50.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010115} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-08", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010115} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-09", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 2, "ga_newUsers": 2, "ga_sessions": 2, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010116} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-11", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 957.0, "ga_pageviews": 6, "ga_pageviewsPerSession": 6.0, "ga_avgTimeOnPage": 191.4, "ga_bounceRate": 0.0, "ga_exitRate": 16.666666666666664, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010116} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-11", "ga_source": "developer.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010116} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-12", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 19.0, "ga_pageviews": 2, "ga_pageviewsPerSession": 2.0, "ga_avgTimeOnPage": 19.0, "ga_bounceRate": 0.0, "ga_exitRate": 50.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010116} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-12", "ga_source": "google", "ga_medium": "organic", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-14", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-15", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-16", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-17", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-18", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-18", "ga_source": "api.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 181.0, "ga_pageviews": 3, "ga_pageviewsPerSession": 3.0, "ga_avgTimeOnPage": 90.5, "ga_bounceRate": 0.0, "ga_exitRate": 33.33333333333333, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-19", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-19", "ga_source": "bing", "ga_medium": "cpc", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010117} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-24", "ga_source": "help.surveymonkey.com", "ga_medium": "referral", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010118} +{"stream": "traffic_sources", "data": {"ga_date": "2023-01-25", "ga_source": "(direct)", "ga_medium": "(none)", "ga_socialNetwork": "(not set)", "ga_users": 1, "ga_newUsers": 1, "ga_sessions": 1, "ga_sessionsPerUser": 1.0, "ga_avgSessionDuration": 0.0, "ga_pageviews": 1, "ga_pageviewsPerSession": 1.0, "ga_avgTimeOnPage": 0.0, "ga_bounceRate": 100.0, "ga_exitRate": 100.0, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750010118} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-10", "ga_30dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010462} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-11", "ga_30dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010462} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-12", "ga_30dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010462} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-13", "ga_30dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010463} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-14", "ga_30dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010463} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-15", "ga_30dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010463} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-16", "ga_30dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010463} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-17", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010463} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-18", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010463} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-19", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010464} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-20", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010464} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-21", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010464} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-22", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010464} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-23", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010464} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-24", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010465} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-25", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010465} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-26", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010465} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-27", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010465} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-28", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010465} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-29", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010465} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-11-30", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010466} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-01", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010466} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-02", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010466} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-03", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010466} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-04", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010466} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-05", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010467} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-06", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010467} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-07", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010467} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-08", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010725} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-09", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010725} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-10", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010726} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-11", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010726} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-12", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010726} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-13", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010726} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-14", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010726} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-15", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010726} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-16", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010727} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-17", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010727} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-18", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010727} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-19", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010727} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-20", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010727} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-21", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010728} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-22", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010728} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-23", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010728} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-24", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010728} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-25", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010729} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-26", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010729} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-27", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010729} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-28", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010729} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-29", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010730} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-30", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010730} +{"stream": "monthly_active_users", "data": {"ga_date": "2021-12-31", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010730} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-01", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010730} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-02", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010731} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-03", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010731} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-04", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010732} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-05", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010732} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-06", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010732} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-07", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010732} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-08", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010733} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-09", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010733} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-10", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010733} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-11", "ga_30dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010733} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-12", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010734} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-13", "ga_30dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010734} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-14", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010734} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-15", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010734} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-16", "ga_30dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010734} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-17", "ga_30dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010734} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-18", "ga_30dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010735} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-19", "ga_30dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010735} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-20", "ga_30dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010735} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-21", "ga_30dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010735} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-22", "ga_30dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010735} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-23", "ga_30dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010736} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-24", "ga_30dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010736} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-25", "ga_30dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010736} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-26", "ga_30dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010736} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-27", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010736} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-28", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010737} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-29", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010737} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-30", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010737} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-01-31", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010737} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-01", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010738} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-02", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010738} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-03", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010738} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-04", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010738} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-05", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010738} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-06", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010738} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-07", "ga_30dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010739} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-08", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010739} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-09", "ga_30dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010739} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-10", "ga_30dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010739} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-11", "ga_30dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010739} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-12", "ga_30dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010740} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-13", "ga_30dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010740} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-14", "ga_30dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010740} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-15", "ga_30dayUsers": 40, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010740} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-16", "ga_30dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010740} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-17", "ga_30dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010740} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-18", "ga_30dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010741} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-19", "ga_30dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010741} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-20", "ga_30dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010741} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-21", "ga_30dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010741} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-22", "ga_30dayUsers": 40, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010741} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-23", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010742} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-24", "ga_30dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010742} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-25", "ga_30dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010742} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-26", "ga_30dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010742} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-27", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010742} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-02-28", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010742} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-01", "ga_30dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010743} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-02", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010743} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-03", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010743} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-04", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010743} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-05", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010743} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-06", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010744} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-07", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010744} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-08", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750010744} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-09", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011055} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-10", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011056} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-11", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011056} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-12", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011057} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-13", "ga_30dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011057} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-14", "ga_30dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011057} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-15", "ga_30dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011058} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-16", "ga_30dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011058} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-17", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011058} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-18", "ga_30dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011058} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-19", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011059} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-20", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011059} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-21", "ga_30dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011059} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-22", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011059} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-23", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011060} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-24", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011060} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-25", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011060} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-26", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011060} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-27", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011060} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-28", "ga_30dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011061} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-29", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011061} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-30", "ga_30dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011061} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-03-31", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011061} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-01", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011062} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-02", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011062} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-03", "ga_30dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011062} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-04", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011063} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-05", "ga_30dayUsers": 40, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011063} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-06", "ga_30dayUsers": 41, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011063} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-07", "ga_30dayUsers": 45, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011064} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-08", "ga_30dayUsers": 44, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011064} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-09", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011065} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-10", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011065} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-11", "ga_30dayUsers": 42, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011065} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-12", "ga_30dayUsers": 45, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011065} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-13", "ga_30dayUsers": 53, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011066} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-14", "ga_30dayUsers": 53, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011066} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-15", "ga_30dayUsers": 52, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011067} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-16", "ga_30dayUsers": 51, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011067} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-17", "ga_30dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011068} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-18", "ga_30dayUsers": 53, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011068} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-19", "ga_30dayUsers": 55, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011068} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-20", "ga_30dayUsers": 56, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011069} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-21", "ga_30dayUsers": 55, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011069} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-22", "ga_30dayUsers": 54, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011069} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-23", "ga_30dayUsers": 53, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011070} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-24", "ga_30dayUsers": 51, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011070} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-25", "ga_30dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011071} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-26", "ga_30dayUsers": 51, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011071} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-27", "ga_30dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011072} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-28", "ga_30dayUsers": 47, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011072} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-29", "ga_30dayUsers": 49, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011073} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-04-30", "ga_30dayUsers": 47, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011073} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-01", "ga_30dayUsers": 46, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011074} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-02", "ga_30dayUsers": 47, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011074} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-03", "ga_30dayUsers": 49, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011075} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-04", "ga_30dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011075} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-05", "ga_30dayUsers": 46, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011076} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-06", "ga_30dayUsers": 45, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011077} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-07", "ga_30dayUsers": 40, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011078} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-08", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011079} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-09", "ga_30dayUsers": 41, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011080} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-10", "ga_30dayUsers": 41, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011081} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-11", "ga_30dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011081} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-12", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011082} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-13", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011082} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-14", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011082} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-15", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011082} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-16", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011082} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-17", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011083} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-18", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011083} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-19", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011083} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-20", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011083} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-21", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011084} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-22", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011084} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-23", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011084} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-24", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011084} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-25", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011084} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-26", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011084} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-27", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011085} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-28", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011085} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-29", "ga_30dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011085} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-30", "ga_30dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011085} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-05-31", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011085} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-01", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011085} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-02", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011086} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-03", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011086} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-04", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011086} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-05", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011086} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-06", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011086} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-07", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011087} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-08", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011357} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-09", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011357} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-10", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011358} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-11", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011358} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-12", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011358} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-13", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011358} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-14", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011359} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-15", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011359} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-16", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011359} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-17", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011360} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-18", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011360} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-19", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011360} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-20", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011360} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-21", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011361} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-22", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011361} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-23", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011361} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-24", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011361} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-25", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011362} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-26", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011362} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-27", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011362} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-28", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011363} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-29", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011363} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-06-30", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011363} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-01", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011364} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-02", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011364} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-03", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011364} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-04", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011365} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-05", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011365} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-06", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011365} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-07", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011366} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-08", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011366} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-09", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011367} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-10", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011367} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-11", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011368} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-12", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011368} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-13", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011368} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-14", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011369} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-15", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011369} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-16", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011369} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-17", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011370} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-18", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011370} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-19", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011371} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-20", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011371} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-21", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011371} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-22", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011372} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-23", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011372} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-24", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011372} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-25", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011372} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-26", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011373} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-27", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011373} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-28", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011373} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-29", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011374} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-30", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011374} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-07-31", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011374} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-01", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011375} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-02", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011375} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-03", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011375} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-04", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011375} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-05", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011376} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-06", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011376} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-07", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011376} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-08", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011376} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-09", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011377} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-10", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011377} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-11", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011377} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-12", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011378} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-13", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011378} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-14", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011380} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-15", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011380} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-16", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011381} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-17", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011381} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-18", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011384} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-19", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011385} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-20", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011385} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-21", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011385} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-22", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011386} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-23", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011386} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-24", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011386} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-25", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011387} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-26", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011387} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-27", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011387} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-28", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011388} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-29", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011388} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-30", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011388} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-08-31", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011388} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-01", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011388} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-02", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011389} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-03", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011389} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-04", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011389} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-05", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011389} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-06", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011390} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-07", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011665} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-08", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011666} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-09", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011667} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-10", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011668} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-11", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011668} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-12", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011668} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-13", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011668} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-14", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011669} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-15", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011669} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-16", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011669} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-17", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011669} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-18", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011669} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-19", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011670} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-20", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011670} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-21", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011670} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-22", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011670} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-23", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011670} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-24", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011671} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-25", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011671} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-26", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011671} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-27", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011671} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-28", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011671} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-29", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011672} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-09-30", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011672} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-01", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011672} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-02", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011672} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-03", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011672} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-04", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011673} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-05", "ga_30dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011673} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-06", "ga_30dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011673} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-07", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011673} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-08", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011673} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-09", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011673} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-10", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011674} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-11", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011674} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-12", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011674} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-13", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011674} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-14", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011674} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-15", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011675} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-16", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011675} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-17", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011675} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-18", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011675} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-19", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011675} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-20", "ga_30dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011675} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-21", "ga_30dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011676} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-22", "ga_30dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011676} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-23", "ga_30dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011676} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-24", "ga_30dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011676} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-25", "ga_30dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011677} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-26", "ga_30dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011677} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-27", "ga_30dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011677} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-28", "ga_30dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011677} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-29", "ga_30dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011677} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-30", "ga_30dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011678} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-10-31", "ga_30dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011678} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-01", "ga_30dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011678} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-02", "ga_30dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011678} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-03", "ga_30dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011678} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-04", "ga_30dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011679} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-05", "ga_30dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011679} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-06", "ga_30dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011680} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-07", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011680} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-08", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011680} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-09", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011680} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-10", "ga_30dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011681} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-11", "ga_30dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011681} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-12", "ga_30dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011681} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-13", "ga_30dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011681} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-14", "ga_30dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011681} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-15", "ga_30dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011681} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-16", "ga_30dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011682} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-17", "ga_30dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011682} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-18", "ga_30dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011682} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-19", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011682} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-20", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011682} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-21", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011683} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-22", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011683} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-23", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011683} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-24", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011683} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-25", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011683} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-26", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011684} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-27", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011684} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-28", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011684} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-29", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011684} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-11-30", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011685} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-01", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011685} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-02", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011685} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-03", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011685} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-04", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011685} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-05", "ga_30dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011685} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-06", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750011686} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-07", "ga_30dayUsers": 32, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011945} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-08", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011946} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-09", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011946} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-10", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011946} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-11", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011946} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-12", "ga_30dayUsers": 35, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011947} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-13", "ga_30dayUsers": 35, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011947} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-14", "ga_30dayUsers": 35, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011947} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-15", "ga_30dayUsers": 32, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011947} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-16", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011947} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-17", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011948} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-18", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011948} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-19", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011948} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-20", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011948} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-21", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011948} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-22", "ga_30dayUsers": 34, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011949} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-23", "ga_30dayUsers": 33, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011949} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-24", "ga_30dayUsers": 32, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011949} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-25", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011950} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-26", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011950} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-27", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011950} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-28", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011950} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-29", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011950} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-30", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011951} +{"stream": "monthly_active_users", "data": {"ga_date": "2022-12-31", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011951} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-01", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011951} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-02", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011951} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-03", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011952} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-04", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011952} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-05", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011952} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-06", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011952} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-07", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011952} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-08", "ga_30dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011952} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-09", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011953} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-10", "ga_30dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011953} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-11", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011953} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-12", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011953} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-13", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011953} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-14", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011953} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-15", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011954} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-16", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011954} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-17", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011954} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-18", "ga_30dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011954} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-19", "ga_30dayUsers": 31, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011954} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-20", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011955} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-21", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011955} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-22", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011955} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-23", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011955} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-24", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011955} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-25", "ga_30dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011955} +{"stream": "monthly_active_users", "data": {"ga_date": "2023-01-26", "ga_30dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750011956} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-08", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012519} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-09", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012519} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-10", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012519} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-11", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012520} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-12", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012520} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-13", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012520} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-14", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012520} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-15", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012521} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-16", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012521} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-17", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012521} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-18", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012521} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-19", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012521} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-20", "ga_28dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012522} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-21", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012522} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-22", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012522} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-23", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012522} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-24", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012523} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-25", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012524} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-26", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012528} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-27", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012531} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-28", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012532} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-29", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012532} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-30", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012532} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2021-12-31", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012532} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-01", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012532} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-02", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012533} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-03", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012533} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-04", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012533} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-05", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012533} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-06", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012533} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-07", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012533} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-08", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012534} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-09", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012534} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-10", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012534} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-11", "ga_28dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012534} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-12", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012534} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-13", "ga_28dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012535} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-14", "ga_28dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012535} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-15", "ga_28dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012535} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-16", "ga_28dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012535} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-17", "ga_28dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012535} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-18", "ga_28dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012535} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-19", "ga_28dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012536} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-20", "ga_28dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012536} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-21", "ga_28dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012536} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-22", "ga_28dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012536} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-23", "ga_28dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012536} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-24", "ga_28dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012537} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-25", "ga_28dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012537} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-26", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012537} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-27", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012537} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-28", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012537} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-29", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012538} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-30", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012538} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-01-31", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012538} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-01", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012538} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-02", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012538} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-03", "ga_28dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012538} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-04", "ga_28dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012539} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-05", "ga_28dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012539} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-06", "ga_28dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012539} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-07", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012539} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-08", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012539} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-09", "ga_28dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012540} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-10", "ga_28dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012540} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-11", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012540} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-12", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012540} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-13", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012540} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-14", "ga_28dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012540} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-15", "ga_28dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012541} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-16", "ga_28dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012541} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-17", "ga_28dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012541} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-18", "ga_28dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012541} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-19", "ga_28dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012541} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-20", "ga_28dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012542} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-21", "ga_28dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012542} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-22", "ga_28dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012542} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-23", "ga_28dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012542} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-24", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012542} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-25", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012542} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-26", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012543} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-27", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012543} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-02-28", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012543} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-01", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012543} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-02", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012543} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-03", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012543} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-04", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012543} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-05", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012544} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-06", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012544} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-07", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012544} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-08", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012544} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-09", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012836} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-10", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012837} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-11", "ga_28dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012837} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-12", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012837} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-13", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012837} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-14", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012837} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-15", "ga_28dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012838} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-16", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012838} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-17", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012838} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-18", "ga_28dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012838} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-19", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012838} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-20", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012838} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-21", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012839} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-22", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012839} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-23", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012839} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-24", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012839} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-25", "ga_28dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012839} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-26", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012840} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-27", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012840} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-28", "ga_28dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012840} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-29", "ga_28dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012840} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-30", "ga_28dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012840} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-03-31", "ga_28dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012840} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-01", "ga_28dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012841} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-02", "ga_28dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012841} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-03", "ga_28dayUsers": 36, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012841} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-04", "ga_28dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012841} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-05", "ga_28dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012841} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-06", "ga_28dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012841} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-07", "ga_28dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012842} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-08", "ga_28dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012842} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-09", "ga_28dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012842} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-10", "ga_28dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012842} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-11", "ga_28dayUsers": 40, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012843} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-12", "ga_28dayUsers": 42, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012843} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-13", "ga_28dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012843} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-14", "ga_28dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012843} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-15", "ga_28dayUsers": 49, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012844} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-16", "ga_28dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012844} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-17", "ga_28dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012844} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-18", "ga_28dayUsers": 53, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012844} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-19", "ga_28dayUsers": 54, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012844} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-20", "ga_28dayUsers": 53, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012844} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-21", "ga_28dayUsers": 51, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012845} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-22", "ga_28dayUsers": 49, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012845} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-23", "ga_28dayUsers": 49, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012845} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-24", "ga_28dayUsers": 50, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012845} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-25", "ga_28dayUsers": 48, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012845} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-26", "ga_28dayUsers": 46, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012846} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-27", "ga_28dayUsers": 46, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012846} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-28", "ga_28dayUsers": 44, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012846} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-29", "ga_28dayUsers": 46, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012846} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-04-30", "ga_28dayUsers": 46, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012846} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-01", "ga_28dayUsers": 46, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012847} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-02", "ga_28dayUsers": 47, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012847} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-03", "ga_28dayUsers": 45, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012847} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-04", "ga_28dayUsers": 45, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012847} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-05", "ga_28dayUsers": 40, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012847} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-06", "ga_28dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012847} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-07", "ga_28dayUsers": 39, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012848} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-08", "ga_28dayUsers": 38, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012848} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-09", "ga_28dayUsers": 37, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012848} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-10", "ga_28dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012848} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-11", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012848} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-12", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012849} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-13", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012849} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-14", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012849} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-15", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012849} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-16", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012849} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-17", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012850} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-18", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012850} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-19", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012850} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-20", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012850} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-21", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012850} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-22", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012850} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-23", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012851} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-24", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012851} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-25", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012851} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-26", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012851} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-27", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012851} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-28", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012852} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-29", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012852} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-30", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012852} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-05-31", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012852} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-01", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012852} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-02", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012852} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-03", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012853} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-04", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012853} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-05", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012853} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-06", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012853} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-07", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750012854} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-08", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013099} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-09", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013103} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-10", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013104} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-11", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013105} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-12", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013105} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-13", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013106} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-14", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013106} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-15", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013109} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-16", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013109} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-17", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013109} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-18", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013109} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-19", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013110} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-20", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013110} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-21", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013110} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-22", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013110} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-23", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013111} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-24", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013111} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-25", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013111} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-26", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013112} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-27", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013112} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-28", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013112} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-29", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013113} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-06-30", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013113} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-01", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013113} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-02", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013114} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-03", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013114} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-04", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013114} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-05", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013115} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-06", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013115} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-07", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013115} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-08", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013115} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-09", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013116} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-10", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013117} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-11", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013118} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-12", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013118} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-13", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013119} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-14", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013119} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-15", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013119} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-16", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013119} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-17", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013119} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-18", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013120} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-19", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013120} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-20", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013120} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-21", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013120} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-22", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013120} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-23", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013121} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-24", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013121} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-25", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013121} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-26", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013121} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-27", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013121} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-28", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013122} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-29", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013122} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-30", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013122} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-07-31", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013122} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-01", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013122} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-02", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013122} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-03", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013123} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-04", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013123} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-05", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013123} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-06", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013123} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-07", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013123} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-08", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013124} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-09", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013124} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-10", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013124} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-11", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013124} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-12", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013124} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-13", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013125} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-14", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013125} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-15", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013125} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-16", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013125} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-17", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013125} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-18", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-19", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-20", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-21", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-22", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-23", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-24", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-25", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-26", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-27", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-28", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-29", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-30", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-08-31", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-01", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-02", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013126} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-03", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013127} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-04", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013127} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-05", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013127} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-06", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013127} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-07", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013369} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-08", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013369} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-09", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013369} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-10", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013370} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-11", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013370} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-12", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013370} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-13", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013370} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-14", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013370} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-15", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013370} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-16", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013371} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-17", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013371} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-18", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013371} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-19", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013371} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-20", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013371} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-21", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013372} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-22", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013372} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-23", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013372} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-24", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013372} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-25", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013372} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-26", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013372} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-27", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013373} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-28", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013373} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-29", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013373} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-09-30", "ga_28dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013373} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-01", "ga_28dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013374} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-02", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013374} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-03", "ga_28dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013374} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-04", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013374} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-05", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013375} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-06", "ga_28dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013375} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-07", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013375} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-08", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013375} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-09", "ga_28dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013375} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-10", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013376} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-11", "ga_28dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013376} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-12", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013376} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-13", "ga_28dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013376} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-14", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013377} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-15", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013377} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-16", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013377} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-17", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013377} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-18", "ga_28dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013378} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-19", "ga_28dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013378} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-20", "ga_28dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013378} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-21", "ga_28dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013378} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-22", "ga_28dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013378} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-23", "ga_28dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013378} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-24", "ga_28dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013379} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-25", "ga_28dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013379} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-26", "ga_28dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013379} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-27", "ga_28dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013380} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-28", "ga_28dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013380} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-29", "ga_28dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013380} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-30", "ga_28dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013380} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-10-31", "ga_28dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013380} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-01", "ga_28dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013381} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-02", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013381} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-03", "ga_28dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013381} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-04", "ga_28dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013381} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-05", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013381} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-06", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013382} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-07", "ga_28dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013382} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-08", "ga_28dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013382} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-09", "ga_28dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013382} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-10", "ga_28dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013383} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-11", "ga_28dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013383} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-12", "ga_28dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013383} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-13", "ga_28dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013383} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-14", "ga_28dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013383} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-15", "ga_28dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013383} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-16", "ga_28dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013384} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-17", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013384} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-18", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013384} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-19", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013384} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-20", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013384} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-21", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013385} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-22", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013385} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-23", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013385} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-24", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013385} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-25", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013385} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-26", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013386} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-27", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013386} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-28", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013386} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-29", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013386} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-11-30", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013386} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-01", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013387} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-02", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013387} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-03", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013387} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-04", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013387} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-05", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013387} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-06", "ga_28dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013388} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-07", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013656} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-08", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013656} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-09", "ga_28dayUsers": 33, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013657} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-10", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013657} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-11", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013657} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-12", "ga_28dayUsers": 34, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013657} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-13", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013658} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-14", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013658} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-15", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013658} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-16", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013658} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-17", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013659} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-18", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013659} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-19", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013659} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-20", "ga_28dayUsers": 31, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013660} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-21", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013660} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-22", "ga_28dayUsers": 32, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013661} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-23", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013661} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-24", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013661} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-25", "ga_28dayUsers": 30, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013662} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-26", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013662} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-27", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013662} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-28", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013663} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-29", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013663} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-30", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013663} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2022-12-31", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013663} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-01", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013664} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-02", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013664} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-03", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013664} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-04", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013665} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-05", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013665} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-06", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013665} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-07", "ga_28dayUsers": 24, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013665} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-08", "ga_28dayUsers": 25, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013666} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-09", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013666} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-10", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013666} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-11", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013667} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-12", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013667} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-13", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013667} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-14", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013667} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-15", "ga_28dayUsers": 29, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013668} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-16", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013668} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-17", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013668} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-18", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013668} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-19", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013668} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-20", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013669} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-21", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013669} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-22", "ga_28dayUsers": 28, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013669} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-23", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013669} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-24", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013669} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-25", "ga_28dayUsers": 27, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013670} +{"stream": "four_weekly_active_users", "data": {"ga_date": "2023-01-26", "ga_28dayUsers": 26, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750013670} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-10", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013980} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-11", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013981} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-12", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013981} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-13", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013982} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-14", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013982} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-15", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013982} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-16", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013983} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-17", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013983} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-18", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013985} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-19", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013986} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-20", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013986} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-21", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013986} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-22", "ga_14dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013987} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-23", "ga_14dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013987} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-24", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013987} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-25", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013987} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-26", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013987} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-27", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013988} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-28", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013988} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-29", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013988} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-11-30", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013988} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-01", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013989} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-02", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013989} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-03", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013989} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-04", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013989} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-05", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013989} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-06", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013990} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-07", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750013990} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-08", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014214} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-09", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014214} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-10", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014215} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-11", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014215} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-12", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014215} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-13", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014216} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-14", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014217} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-15", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014218} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-16", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014218} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-17", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014219} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-18", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014219} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-19", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014219} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-20", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014219} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-21", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014219} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-22", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014220} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-23", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014220} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-24", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014220} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-25", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014220} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-26", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014220} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-27", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014221} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-28", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014221} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-29", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014221} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-30", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014221} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2021-12-31", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014222} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-01", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014222} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-02", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014223} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-03", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014223} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-04", "ga_14dayUsers": 1, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014223} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-05", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014223} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-06", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014224} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-07", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014224} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-08", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014224} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-09", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014224} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-10", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014225} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-11", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014225} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-12", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014225} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-13", "ga_14dayUsers": 2, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014225} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-14", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014225} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-15", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014226} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-16", "ga_14dayUsers": 3, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014226} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-17", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014226} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-18", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014226} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-19", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014227} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-20", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014227} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-21", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014227} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-22", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014227} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-23", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014228} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-24", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014228} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-25", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014228} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-26", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014228} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-27", "ga_14dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014228} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-28", "ga_14dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014229} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-29", "ga_14dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014230} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-30", "ga_14dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014230} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-01-31", "ga_14dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014234} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-01", "ga_14dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014241} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-02", "ga_14dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014242} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-03", "ga_14dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014242} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-04", "ga_14dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014242} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-05", "ga_14dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014242} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-06", "ga_14dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014242} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-07", "ga_14dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014243} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-08", "ga_14dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014243} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-09", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014243} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-10", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014244} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-11", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014244} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-12", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014244} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-13", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014244} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-14", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014244} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-15", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014245} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-16", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014245} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-17", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014245} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-18", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014245} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-19", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014245} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-20", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014246} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-21", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014246} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-22", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014246} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-23", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014246} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-24", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014246} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-25", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014246} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-26", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014246} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-27", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-02-28", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-01", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-02", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-03", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-04", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-05", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-06", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-07", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014247} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-08", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014248} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-09", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014478} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-10", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014478} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-11", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014479} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-12", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014479} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-13", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014479} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-14", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014480} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-15", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014480} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-16", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014480} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-17", "ga_14dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014481} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-18", "ga_14dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014481} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-19", "ga_14dayUsers": 19, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014481} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-20", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014482} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-21", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014482} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-22", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014483} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-23", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014483} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-24", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014483} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-25", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014484} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-26", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014484} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-27", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014485} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-28", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014485} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-29", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014485} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-30", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014486} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-03-31", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014486} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-01", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014486} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-02", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014487} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-03", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014488} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-04", "ga_14dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014488} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-05", "ga_14dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014488} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-06", "ga_14dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014489} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-07", "ga_14dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014489} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-08", "ga_14dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014489} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-09", "ga_14dayUsers": 20, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014489} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-10", "ga_14dayUsers": 21, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014490} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-11", "ga_14dayUsers": 23, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014490} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-12", "ga_14dayUsers": 24, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014491} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-13", "ga_14dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014491} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-14", "ga_14dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014491} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-15", "ga_14dayUsers": 31, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014492} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-16", "ga_14dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014492} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-17", "ga_14dayUsers": 32, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014492} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-18", "ga_14dayUsers": 35, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014493} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-19", "ga_14dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014493} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-20", "ga_14dayUsers": 33, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014493} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-21", "ga_14dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014493} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-22", "ga_14dayUsers": 28, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014494} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-23", "ga_14dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014494} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-24", "ga_14dayUsers": 29, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014494} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-25", "ga_14dayUsers": 26, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014494} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-26", "ga_14dayUsers": 22, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014495} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-27", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014495} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-28", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014495} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-29", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014495} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-04-30", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014496} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-01", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014496} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-02", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014496} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-03", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014497} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-04", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014497} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-05", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014497} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-06", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014497} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-07", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014498} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-08", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014498} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-09", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014501} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-10", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014501} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-11", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014501} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-12", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014502} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-13", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014502} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-14", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014502} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-15", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014502} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-16", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014503} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-17", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014503} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-18", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014503} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-19", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014503} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-20", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014503} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-21", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014504} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-22", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014504} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-23", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014504} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-24", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014504} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-25", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014504} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-26", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014504} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-27", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-28", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-29", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-30", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-05-31", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-01", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-02", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-03", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-04", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-05", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-06", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-07", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014505} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-08", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014731} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-09", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014732} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-10", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014733} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-11", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014733} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-12", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014734} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-13", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014734} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-14", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014734} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-15", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014735} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-16", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014735} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-17", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014735} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-18", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014736} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-19", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014736} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-20", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014736} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-21", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014736} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-22", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014737} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-23", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014737} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-24", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014737} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-25", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014737} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-26", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014738} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-27", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014738} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-28", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014738} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-29", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014739} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-06-30", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014739} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-01", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014739} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-02", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014739} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-03", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014740} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-04", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014740} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-05", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014740} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-06", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014741} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-07", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014741} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-08", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014741} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-09", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014741} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-10", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014742} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-11", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014742} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-12", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014742} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-13", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014743} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-14", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014743} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-15", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014743} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-16", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014744} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-17", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014744} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-18", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014744} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-19", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014744} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-20", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014745} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-21", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014745} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-22", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014745} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-23", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014745} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-24", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014746} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-25", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014746} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-26", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014746} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-27", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014747} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-28", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014747} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-29", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014747} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-30", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014747} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-07-31", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014747} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-01", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014748} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-02", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014748} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-03", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014748} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-04", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014748} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-05", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014749} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-06", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014749} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-07", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014750} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-08", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014750} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-09", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014751} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-10", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014751} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-11", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014751} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-12", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014751} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-13", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014752} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-14", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014752} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-15", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014752} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-16", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-17", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-18", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-19", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-20", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-21", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-22", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-23", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-24", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-25", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014753} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-26", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-27", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-28", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-29", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-30", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-08-31", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-01", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-02", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-03", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-04", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-05", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-06", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014754} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-07", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014990} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-08", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014991} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-09", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014991} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-10", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014991} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-11", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014992} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-12", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014992} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-13", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014992} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-14", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014992} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-15", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014992} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-16", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014993} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-17", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014993} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-18", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014993} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-19", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014994} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-20", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014994} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-21", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014994} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-22", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014994} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-23", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014995} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-24", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014995} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-25", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014995} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-26", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014995} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-27", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014996} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-28", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014996} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-29", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014996} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-09-30", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014997} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-01", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014997} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-02", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014997} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-03", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014997} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-04", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014998} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-05", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014998} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-06", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014998} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-07", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014998} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-08", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014999} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-09", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014999} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-10", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014999} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-11", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014999} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-12", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750014999} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-13", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015000} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-14", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015000} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-15", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015000} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-16", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015000} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-17", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015000} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-18", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015001} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-19", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015001} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-20", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015001} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-21", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015001} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-22", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015002} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-23", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015002} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-24", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015002} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-25", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015002} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-26", "ga_14dayUsers": 7, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015002} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-27", "ga_14dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015003} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-28", "ga_14dayUsers": 4, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015003} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-29", "ga_14dayUsers": 5, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015003} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-30", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015003} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-10-31", "ga_14dayUsers": 6, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015004} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-01", "ga_14dayUsers": 8, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015004} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-02", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015004} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-03", "ga_14dayUsers": 9, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015004} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-04", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015004} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-05", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015005} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-06", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015005} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-07", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015005} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-08", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015005} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-09", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015005} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-10", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015006} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-11", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015006} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-12", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015006} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-13", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015006} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-14", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015007} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-15", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015007} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-16", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015007} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-17", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015007} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-18", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015008} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-19", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015008} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-20", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015008} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-21", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015008} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-22", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015008} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-23", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015009} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-24", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015009} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-25", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015009} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-26", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015009} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-27", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015009} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-28", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015010} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-29", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015010} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-11-30", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015010} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-01", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015010} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-02", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015010} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-03", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015011} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-04", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015011} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-05", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015011} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-06", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": true}, "emitted_at": 1674750015012} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-07", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015250} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-08", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015251} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-09", "ga_14dayUsers": 18, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015251} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-10", "ga_14dayUsers": 19, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015251} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-11", "ga_14dayUsers": 19, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015251} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-12", "ga_14dayUsers": 17, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015251} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-13", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015252} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-14", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015252} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-15", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015252} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-16", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015252} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-17", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015252} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-18", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015253} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-19", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015253} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-20", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015253} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-21", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015253} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-22", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015253} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-23", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015253} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-24", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015254} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-25", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015254} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-26", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015254} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-27", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015254} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-28", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015254} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-29", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015254} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-30", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015255} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2022-12-31", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015255} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-01", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015255} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-02", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015255} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-03", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015255} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-04", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015256} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-05", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015256} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-06", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015256} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-07", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015256} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-08", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015256} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-09", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015256} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-10", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015257} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-11", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015257} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-12", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015257} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-13", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015257} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-14", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015257} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-15", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015257} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-16", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015258} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-17", "ga_14dayUsers": 15, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015258} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-18", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015258} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-19", "ga_14dayUsers": 16, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015258} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-20", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015258} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-21", "ga_14dayUsers": 14, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015259} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-22", "ga_14dayUsers": 13, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015259} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-23", "ga_14dayUsers": 11, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015259} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-24", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015259} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-25", "ga_14dayUsers": 12, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015259} +{"stream": "two_weekly_active_users", "data": {"ga_date": "2023-01-26", "ga_14dayUsers": 10, "view_id": "211669975", "isDataGolden": false}, "emitted_at": 1674750015259} \ No newline at end of file From 00a1de5e901d3d7110e61dff6ca15a3969c0db07 Mon Sep 17 00:00:00 2001 From: Evan Tahler Date: Fri, 27 Jan 2023 09:29:00 -0800 Subject: [PATCH 144/195] Support config sub-values for `allowedHosts` (#21950) * Support config sub-values for `allowedHosts` * Support numeric values * smarter support for empty allowedHosts --- .../resources/seed/source_definitions.yaml | 1 + .../airbyte/workers/utils/ConfigReplacer.java | 41 +++++++++++++++---- .../workers/utils/ConfigReplacerTest.java | 38 ++++++++++++++++- 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 30c4996749ef6..23e6e951e1e54 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1349,6 +1349,7 @@ allowedHosts: hosts: - "${host}" + - "${tunnel_method.tunnel_host}" - name: Postmark App sourceDefinitionId: cde75ca1-1e28-4a0f-85bb-90c546de9f1f dockerRepository: airbyte/source-postmarkapp diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java b/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java index 6af5d9053a30c..7b2549263231b 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/utils/ConfigReplacer.java @@ -42,11 +42,35 @@ public AllowedHosts getAllowedHosts(AllowedHosts allowedHosts, JsonNode config) final List resolvedHosts = new ArrayList<>(); final Map valuesMap = new HashMap<>(); final JsonParser jsonParser = config.traverse(); + + List prefixes = new ArrayList<>(); while (!jsonParser.isClosed()) { - if (jsonParser.nextToken() == JsonToken.FIELD_NAME) { + final JsonToken type = jsonParser.nextToken(); + if (type == JsonToken.FIELD_NAME) { final String key = jsonParser.getCurrentName(); - if (config.get(key) != null) { - valuesMap.put(key, config.get(key).textValue()); + // the interface for allowedHosts is dot notation, e.g. `"${tunnel_method.tunnel_host}"` + final String fullKey = (prefixes.isEmpty() ? "" : String.join(".", prefixes) + ".") + key; + // the search path for JSON nodes is slash notation, e.g. `"/tunnel_method/tunnel_host"` + final String lookupKey = "/" + (prefixes.isEmpty() ? "" : String.join("/", prefixes) + "/") + key; + + String value = config.at(lookupKey).textValue(); + if (value == null) { + final Number numberValue = config.at(lookupKey).numberValue(); + if (numberValue != null) { + value = numberValue.toString(); + } + } + + if (value != null) { + valuesMap.put(fullKey, value); + } + } else if (type == JsonToken.START_OBJECT) { + if (jsonParser.getCurrentName() != null) { + prefixes.add(jsonParser.getCurrentName()); + } + } else if (type == JsonToken.END_OBJECT) { + if (!prefixes.isEmpty()) { + prefixes.remove(prefixes.size() - 1); } } } @@ -55,11 +79,14 @@ public AllowedHosts getAllowedHosts(AllowedHosts allowedHosts, JsonNode config) final List hosts = allowedHosts.getHosts(); for (String host : hosts) { final String replacedString = sub.replace(host); - if (replacedString.contains("${")) { - this.logger.error( - "The allowedHost value, '" + host + "', is expecting an interpolation value from the connector's configuration, but none is present"); + if (!replacedString.contains("${")) { + resolvedHosts.add(replacedString); } - resolvedHosts.add(replacedString); + } + + if (resolvedHosts.isEmpty() && !hosts.isEmpty()) { + this.logger.error( + "All allowedHosts values are un-replaced. Check this connector's configuration or actor definition - " + allowedHosts.getHosts()); } final AllowedHosts resolvedAllowedHosts = new AllowedHosts(); diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java index 0c6148f3a2b24..11f80493d3346 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/utils/ConfigReplacerTest.java @@ -24,22 +24,58 @@ class ConfigReplacerTest { final ObjectMapper mapper = new ObjectMapper(); @Test + @SuppressWarnings("PMD.AvoidUsingHardCodedIP") void getAllowedHostsGeneralTest() throws IOException { final AllowedHosts allowedHosts = new AllowedHosts(); final List hosts = new ArrayList(); hosts.add("localhost"); hosts.add("static-site.com"); hosts.add("${host}"); + hosts.add("${number}"); hosts.add("${subdomain}.vendor.com"); + hosts.add("${tunnel_method.tunnel_host}"); allowedHosts.setHosts(hosts); final List expected = new ArrayList<>(); expected.add("localhost"); expected.add("static-site.com"); expected.add("foo.com"); + expected.add("123"); expected.add("account.vendor.com"); + expected.add("1.2.3.4"); - final String configJson = "{\"host\": \"foo.com\", \"subdomain\": \"account\", \"password\": \"abc123\"}"; + final String configJson = + "{\"host\": \"foo.com\", \"number\": 123, \"subdomain\": \"account\", \"password\": \"abc123\", \"tunnel_method\": {\"tunnel_host\": \"1.2.3.4\"}}"; + final JsonNode config = mapper.readValue(configJson, JsonNode.class); + final AllowedHosts response = replacer.getAllowedHosts(allowedHosts, config); + + assertThat(response.getHosts()).isEqualTo(expected); + } + + @Test + void getAllowedHostsNestingTest() throws IOException { + final AllowedHosts allowedHosts = new AllowedHosts(); + final List hosts = new ArrayList(); + hosts.add("value-${a.b.c.d}"); + allowedHosts.setHosts(hosts); + + final List expected = new ArrayList<>(); + expected.add("value-100"); + + final String configJson = "{\"a\": {\"b\": {\"c\": {\"d\": 100 }}}, \"array\": [1,2,3]}"; + final JsonNode config = mapper.readValue(configJson, JsonNode.class); + final AllowedHosts response = replacer.getAllowedHosts(allowedHosts, config); + + assertThat(response.getHosts()).isEqualTo(expected); + } + + @Test + void ensureEmptyArrayRemains() throws IOException { + final AllowedHosts allowedHosts = new AllowedHosts(); + allowedHosts.setHosts(new ArrayList()); + final List expected = new ArrayList<>(); + + final String configJson = "{}"; final JsonNode config = mapper.readValue(configJson, JsonNode.class); final AllowedHosts response = replacer.getAllowedHosts(allowedHosts, config); From 9583fc15c15309921cd6aab2ee567f768129a070 Mon Sep 17 00:00:00 2001 From: Lake Mossman Date: Fri, 27 Jan 2023 09:32:13 -0800 Subject: [PATCH 145/195] =?UTF-8?q?=F0=9F=8E=89=20=F0=9F=AA=9F=20=20[Conne?= =?UTF-8?q?ctor=20Builder]=20Resolve=20manifest=20before=20converting=20to?= =?UTF-8?q?=20builder=20form=20values=20(#21898)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * call /manifest/resolve before converting to builder form values * fix test --------- Co-authored-by: Joe Reuter --- .../YamlEditor/YamlEditor.tsx | 14 +- ...st.ts => useManifestToBuilderForm.test.ts} | 166 +++++------------- ...derForm.ts => useManifestToBuilderForm.ts} | 34 ++-- .../ConnectorBuilderRequestService.ts | 6 + .../ConnectorBuilderApiService.ts | 10 ++ 5 files changed, 90 insertions(+), 140 deletions(-) rename airbyte-webapp/src/components/connectorBuilder/{manifestToBuilderForm.test.ts => useManifestToBuilderForm.test.ts} (69%) rename airbyte-webapp/src/components/connectorBuilder/{manifestToBuilderForm.ts => useManifestToBuilderForm.ts} (94%) diff --git a/airbyte-webapp/src/components/connectorBuilder/YamlEditor/YamlEditor.tsx b/airbyte-webapp/src/components/connectorBuilder/YamlEditor/YamlEditor.tsx index 92e2902af97f9..85abd79db6b0b 100644 --- a/airbyte-webapp/src/components/connectorBuilder/YamlEditor/YamlEditor.tsx +++ b/airbyte-webapp/src/components/connectorBuilder/YamlEditor/YamlEditor.tsx @@ -12,16 +12,13 @@ import { Action, Namespace } from "core/analytics"; import { ConnectorManifest } from "core/request/ConnectorManifest"; import { useAnalyticsService } from "hooks/services/Analytics"; import { useConfirmationModalService } from "hooks/services/ConfirmationModal"; -import { - useConnectorBuilderFormState, - useConnectorBuilderTestState, -} from "services/connectorBuilder/ConnectorBuilderStateService"; +import { useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService"; import styles from "./YamlEditor.module.scss"; import { UiYamlToggleButton } from "../Builder/UiYamlToggleButton"; import { DownloadYamlButton } from "../DownloadYamlButton"; -import { convertToBuilderFormValues } from "../manifestToBuilderForm"; import { convertToManifest } from "../types"; +import { useManifestToBuilderForm } from "../useManifestToBuilderForm"; interface YamlEditorProps { toggleYamlEditor: () => void; @@ -41,8 +38,8 @@ export const YamlEditor: React.FC = ({ toggleYamlEditor }) => { setYamlIsValid, setJsonManifest, } = useConnectorBuilderFormState(); - const { streamListErrorMessage } = useConnectorBuilderTestState(); const [yamlValue, setYamlValue] = useState(yamlManifest); + const { convertToBuilderFormValues } = useManifestToBuilderForm(); // debounce the setJsonManifest calls so that it doesnt result in a network call for every keystroke const debouncedSetJsonManifest = useMemo(() => debounce(setJsonManifest, 200), [setJsonManifest]); @@ -90,10 +87,11 @@ export const YamlEditor: React.FC = ({ toggleYamlEditor }) => { return !isEqual(convertToManifest(builderFormValues), jsonManifest); }, [jsonManifest, builderFormValues]); - const handleToggleYamlEditor = () => { + const handleToggleYamlEditor = async () => { if (yamlIsDirty) { try { - setValues(convertToBuilderFormValues(jsonManifest, builderFormValues, streamListErrorMessage)); + const convertedFormValues = await convertToBuilderFormValues(jsonManifest, builderFormValues); + setValues(convertedFormValues); toggleYamlEditor(); } catch (e) { openConfirmationModal({ diff --git a/airbyte-webapp/src/components/connectorBuilder/manifestToBuilderForm.test.ts b/airbyte-webapp/src/components/connectorBuilder/useManifestToBuilderForm.test.ts similarity index 69% rename from airbyte-webapp/src/components/connectorBuilder/manifestToBuilderForm.test.ts rename to airbyte-webapp/src/components/connectorBuilder/useManifestToBuilderForm.test.ts index ce3bcfcf5fe14..be685f15a2955 100644 --- a/airbyte-webapp/src/components/connectorBuilder/manifestToBuilderForm.test.ts +++ b/airbyte-webapp/src/components/connectorBuilder/useManifestToBuilderForm.test.ts @@ -1,14 +1,9 @@ import merge from "lodash/merge"; -import { - ConnectorManifest, - DeclarativeStream, - DeclarativeStreamRetriever, - HttpRequester, -} from "core/request/ConnectorManifest"; +import { ConnectorManifest, DeclarativeStream } from "core/request/ConnectorManifest"; -import { convertToBuilderFormValues } from "./manifestToBuilderForm"; import { DEFAULT_BUILDER_FORM_VALUES } from "./types"; +import { convertToBuilderFormValues } from "./useManifestToBuilderForm"; const baseManifest: ConnectorManifest = { type: "DeclarativeSource", @@ -53,89 +48,24 @@ const stream2: DeclarativeStream = merge({}, stream1, { }, }); -describe("Conversion throws error when", () => { - it("streamListErrorMessage is present", () => { - const streamListErrorMessage = "Some error message"; - const convert = () => { - convertToBuilderFormValues({} as ConnectorManifest, DEFAULT_BUILDER_FORM_VALUES, streamListErrorMessage); - }; - expect(convert).toThrow(streamListErrorMessage); - }); +const noOpResolve = (manifest: ConnectorManifest) => { + return Promise.resolve({ manifest }); +}; - it("manifest contains refs", () => { - const convert = () => { - const manifest: ConnectorManifest = { - ...baseManifest, - definitions: { - retriever: { - name: "pokemon", - primary_key: "id", - requester: { - name: "pokemon", - path: "/pokemon/{{config['pokemon_name']}}", - url_base: "https://pokeapi.co/api/v2", - http_method: "GET", - }, - record_selector: { - extractor: { - type: "DpathExtractor", - field_pointer: [], - }, - }, - }, - }, - streams: [ - { - type: "DeclarativeStream", - name: "pokemon", - retriever: { - $ref: "*ref(definitions.retriever)", - } as unknown as DeclarativeStreamRetriever, - }, - ], - }; - convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); +describe("Conversion throws error when", () => { + it("resolve throws error", async () => { + const errorMessage = "Some resolve error message"; + const resolve = (_manifest: ConnectorManifest) => { + throw new Error(errorMessage); }; - expect(convert).toThrow("contains refs"); - }); - - it("manifest contains options", () => { - const convert = () => { - const manifest: ConnectorManifest = { - ...baseManifest, - streams: [ - { - type: "DeclarativeStream", - $options: { - name: "pokemon", - primary_key: "id", - path: "/pokemon/{{config['pokemon_name']}}", - }, - retriever: { - type: "SimpleRetriever", - requester: { - type: "HttpRequester", - url_base: "https://pokeapi.co/api/v2", - http_method: "GET", - } as unknown as HttpRequester, - record_selector: { - type: "RecordSelector", - extractor: { - type: "DpathExtractor", - field_pointer: [], - }, - }, - }, - }, - ], - }; - convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const convert = async () => { + return convertToBuilderFormValues(resolve, {} as ConnectorManifest, DEFAULT_BUILDER_FORM_VALUES); }; - expect(convert).toThrow("contains refs"); + await expect(convert).rejects.toThrow(errorMessage); }); - it("manifests has incorrect retriever type", () => { - const convert = () => { + it("manifests has incorrect retriever type", async () => { + const convert = async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -149,13 +79,13 @@ describe("Conversion throws error when", () => { }, ], }; - convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + return convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); }; - expect(convert).toThrow("doesn't use a SimpleRetriever"); + await expect(convert).rejects.toThrow("doesn't use a SimpleRetriever"); }); - it("manifest has incorrect requester type", () => { - const convert = () => { + it("manifest has incorrect requester type", async () => { + const convert = async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -169,13 +99,13 @@ describe("Conversion throws error when", () => { }), ], }; - convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + return convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); }; - expect(convert).toThrow("doesn't use a HttpRequester"); + await expect(convert).rejects.toThrow("doesn't use a HttpRequester"); }); - it("manifest has an authenticator with a non-interpolated secret key", () => { - const convert = () => { + it("manifest has an authenticator with a non-interpolated secret key", async () => { + const convert = async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -192,12 +122,12 @@ describe("Conversion throws error when", () => { }), ], }; - convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + return convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); }; - expect(convert).toThrow("api_token value must be of the form {{ config["); + await expect(convert).rejects.toThrow("api_token value must be of the form {{ config["); }); - it("manifest has an OAuthAuthenticator with a refresh_request_body containing non-string values", () => { + it("manifest has an OAuthAuthenticator with a refresh_request_body containing non-string values", async () => { const convert = () => { const manifest: ConnectorManifest = { ...baseManifest, @@ -225,19 +155,19 @@ describe("Conversion throws error when", () => { }), ], }; - convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + return convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); }; - expect(convert).toThrow("OAuthAuthenticator contains a refresh_request_body with non-string values"); + await expect(convert).rejects.toThrow("OAuthAuthenticator contains a refresh_request_body with non-string values"); }); }); describe("Conversion successfully results in", () => { - it("default values if manifest is empty", () => { - const formValues = convertToBuilderFormValues(baseManifest, DEFAULT_BUILDER_FORM_VALUES); + it("default values if manifest is empty", async () => { + const formValues = await convertToBuilderFormValues(noOpResolve, baseManifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues).toEqual(DEFAULT_BUILDER_FORM_VALUES); }); - it("spec properties converted to inputs if no streams present", () => { + it("spec properties converted to inputs if no streams present", async () => { const manifest: ConnectorManifest = { ...baseManifest, spec: { @@ -256,7 +186,7 @@ describe("Conversion successfully results in", () => { }, }, }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.inferredInputOverrides).toEqual({}); expect(formValues.inputs).toEqual([ { @@ -267,7 +197,7 @@ describe("Conversion successfully results in", () => { ]); }); - it("spec properties converted to input overrides on matching auth keys", () => { + it("spec properties converted to input overrides on matching auth keys", async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -303,7 +233,7 @@ describe("Conversion successfully results in", () => { }, }, }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.inputs).toEqual([ { key: "numeric_key", @@ -316,7 +246,7 @@ describe("Conversion successfully results in", () => { }); }); - it("request options converted to key-value list", () => { + it("request options converted to key-value list", async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -335,14 +265,14 @@ describe("Conversion successfully results in", () => { }), ], }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.streams[0].requestOptions.requestParameters).toEqual([ ["k1", "v1"], ["k2", "v2"], ]); }); - it("primary key string converted to array", () => { + it("primary key string converted to array", async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -354,11 +284,11 @@ describe("Conversion successfully results in", () => { }), ], }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.streams[0].primaryKey).toEqual(["id"]); }); - it("cartesian product stream slicer converted to builder cartesian product slicer", () => { + it("cartesian product stream slicer converted to builder cartesian product slicer", async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -387,11 +317,11 @@ describe("Conversion successfully results in", () => { }), ], }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.streams[0].streamSlicer).toEqual(manifest.streams[0].retriever.stream_slicer); }); - it("substream stream slicer converted to builder substream slicer", () => { + it("substream stream slicer converted to builder substream slicer", async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -413,7 +343,7 @@ describe("Conversion successfully results in", () => { }), ], }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.streams[1].streamSlicer).toEqual({ type: "SubstreamSlicer", parent_key: "key", @@ -422,7 +352,7 @@ describe("Conversion successfully results in", () => { }); }); - it("schema loader converted to schema", () => { + it("schema loader converted to schema", async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -436,7 +366,7 @@ describe("Conversion successfully results in", () => { }), ], }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.streams[0].schema).toEqual( `{ "key": "value" @@ -444,7 +374,7 @@ describe("Conversion successfully results in", () => { ); }); - it("stores unsupported fields", () => { + it("stores unsupported fields", async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -473,7 +403,7 @@ describe("Conversion successfully results in", () => { }), ], }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.streams[0].unsupportedFields).toEqual({ transformations: manifest.streams[0].transformations, checkpoint_interval: manifest.streams[0].checkpoint_interval, @@ -488,7 +418,7 @@ describe("Conversion successfully results in", () => { }); }); - it("OAuth authenticator refresh_request_body converted to array", () => { + it("OAuth authenticator refresh_request_body converted to array", async () => { const manifest: ConnectorManifest = { ...baseManifest, streams: [ @@ -512,7 +442,7 @@ describe("Conversion successfully results in", () => { }), ], }; - const formValues = convertToBuilderFormValues(manifest, DEFAULT_BUILDER_FORM_VALUES); + const formValues = await convertToBuilderFormValues(noOpResolve, manifest, DEFAULT_BUILDER_FORM_VALUES); expect(formValues.global.authenticator).toEqual({ type: "OAuthAuthenticator", client_id: "{{ config['client_id'] }}", diff --git a/airbyte-webapp/src/components/connectorBuilder/manifestToBuilderForm.ts b/airbyte-webapp/src/components/connectorBuilder/useManifestToBuilderForm.ts similarity index 94% rename from airbyte-webapp/src/components/connectorBuilder/manifestToBuilderForm.ts rename to airbyte-webapp/src/components/connectorBuilder/useManifestToBuilderForm.ts index 64908c9fbbf35..0454f178416da 100644 --- a/airbyte-webapp/src/components/connectorBuilder/manifestToBuilderForm.ts +++ b/airbyte-webapp/src/components/connectorBuilder/useManifestToBuilderForm.ts @@ -1,6 +1,7 @@ import isEqual from "lodash/isEqual"; import { AirbyteJSONSchema } from "core/jsonSchema/types"; +import { ResolveManifest } from "core/request/ConnectorBuilderClient"; import { CartesianProductStreamSlicer, ConnectorManifest, @@ -19,6 +20,7 @@ import { Spec, SubstreamSlicer, } from "core/request/ConnectorManifest"; +import { useResolveManifest } from "services/connectorBuilder/ConnectorBuilderApiService"; import { authTypeToKeyToInferredInput, @@ -33,14 +35,21 @@ import { } from "./types"; import { formatJson } from "./utils"; -export const convertToBuilderFormValues = ( +export const useManifestToBuilderForm = () => { + const { resolve } = useResolveManifest(); + return { convertToBuilderFormValues: convertToBuilderFormValues.bind(this, resolve) }; +}; + +export const convertToBuilderFormValues = async ( + resolve: (manifest: ConnectorManifest) => Promise, manifest: ConnectorManifest, - currentBuilderFormValues: BuilderFormValues, - streamListErrorMessage?: string + currentBuilderFormValues: BuilderFormValues ) => { - // TODO: replace these checks with a call to the soon-to-be /manifest/resolve endpoint, to resolve refs, options, and validate the manifest against the schema - if (streamListErrorMessage) { - let errorMessage = streamListErrorMessage; + let resolveResult: ResolveManifest; + try { + resolveResult = await resolve(manifest); + } catch (e) { + let errorMessage = e.message; if (errorMessage[0] === '"') { errorMessage = errorMessage.substring(1, errorMessage.length); } @@ -49,18 +58,15 @@ export const convertToBuilderFormValues = ( } throw new ManifestCompatibilityError(undefined, errorMessage.trim()); } - const manifestString = JSON.stringify(manifest); - if (manifestString.includes("*ref") || manifestString.includes("$ref") || manifestString.includes("$options")) { - throw new ManifestCompatibilityError(undefined, "Manifest contains refs or $options, which are unsupported"); - } + const resolvedManifest = resolveResult.manifest as ConnectorManifest; const builderFormValues = DEFAULT_BUILDER_FORM_VALUES; builderFormValues.global.connectorName = currentBuilderFormValues.global.connectorName; - builderFormValues.checkStreams = manifest.check.stream_names; + builderFormValues.checkStreams = resolvedManifest.check.stream_names; - const streams = manifest.streams; + const streams = resolvedManifest.streams; if (streams === undefined || streams.length === 0) { - const { inputs, inferredInputOverrides } = manifestSpecAndAuthToBuilder(manifest.spec, undefined); + const { inputs, inferredInputOverrides } = manifestSpecAndAuthToBuilder(resolvedManifest.spec, undefined); builderFormValues.inputs = inputs; builderFormValues.inferredInputOverrides = inferredInputOverrides; @@ -72,7 +78,7 @@ export const convertToBuilderFormValues = ( builderFormValues.global.urlBase = streams[0].retriever.requester.url_base; const { inputs, inferredInputOverrides, auth } = manifestSpecAndAuthToBuilder( - manifest.spec, + resolvedManifest.spec, streams[0].retriever.requester.authenticator ); builderFormValues.inputs = inputs; diff --git a/airbyte-webapp/src/core/domain/connectorBuilder/ConnectorBuilderRequestService.ts b/airbyte-webapp/src/core/domain/connectorBuilder/ConnectorBuilderRequestService.ts index 9e72857f8bfcc..3d8e7d0059fdb 100644 --- a/airbyte-webapp/src/core/domain/connectorBuilder/ConnectorBuilderRequestService.ts +++ b/airbyte-webapp/src/core/domain/connectorBuilder/ConnectorBuilderRequestService.ts @@ -2,6 +2,8 @@ import { getManifestTemplate, listStreams, readStream, + resolveManifest, + ResolveManifestRequestBody, StreamRead, StreamReadRequestBody, StreamsListRead, @@ -21,4 +23,8 @@ export class ConnectorBuilderRequestService extends AirbyteRequestService { public getManifestTemplate(): Promise { return getManifestTemplate(this.requestOptions); } + + public resolveManifest(resolveParams: ResolveManifestRequestBody) { + return resolveManifest(resolveParams, this.requestOptions); + } } diff --git a/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderApiService.ts b/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderApiService.ts index 2f2674c1c3f4b..8f90a4f7e9fdf 100644 --- a/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderApiService.ts +++ b/airbyte-webapp/src/services/connectorBuilder/ConnectorBuilderApiService.ts @@ -3,11 +3,13 @@ import { useQuery } from "react-query"; import { useConfig } from "config"; import { ConnectorBuilderRequestService } from "core/domain/connectorBuilder/ConnectorBuilderRequestService"; import { + ResolveManifestRequestBodyManifest, StreamReadRequestBody, StreamsListRequestBody, StreamsListRequestBodyConfig, StreamsListRequestBodyManifest, } from "core/request/ConnectorBuilderClient"; +import { ConnectorManifest } from "core/request/ConnectorManifest"; import { useSuspenseQuery } from "services/connector/useSuspenseQuery"; import { useInitService } from "services/useInitService"; @@ -17,6 +19,8 @@ const connectorBuilderKeys = { list: (manifest: StreamsListRequestBodyManifest, config: StreamsListRequestBodyConfig) => [...connectorBuilderKeys.all, "list", { manifest, config }] as const, template: ["template"] as const, + resolve: (manifest: ResolveManifestRequestBodyManifest) => + [...connectorBuilderKeys.all, "resolve", { manifest }] as const, }; function useConnectorBuilderService() { @@ -51,3 +55,9 @@ export const useManifestTemplate = () => { return useSuspenseQuery(connectorBuilderKeys.template, () => service.getManifestTemplate()); }; + +export const useResolveManifest = () => { + const service = useConnectorBuilderService(); + + return { resolve: (manifest: ConnectorManifest) => service.resolveManifest({ manifest }) }; +}; From dc73b19e8e5ade4f5331e01f8d297db2b89e9dbf Mon Sep 17 00:00:00 2001 From: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> Date: Fri, 27 Jan 2023 12:43:19 -0500 Subject: [PATCH 146/195] Update load more button style and margins in connection status page (#21979) --- .../ConnectionStatusPage/ConnectionStatusPage.module.scss | 1 + .../connections/ConnectionStatusPage/ConnectionStatusPage.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.module.scss b/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.module.scss index 8badacf0e8551..a6b12e945b35f 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.module.scss +++ b/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.module.scss @@ -32,6 +32,7 @@ } .footer { + padding-top: variables.$spacing-xl; width: 100%; display: flex; align-items: center; diff --git a/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.tsx b/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.tsx index c5f87cbf6a4bd..fcf352c63f838 100644 --- a/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.tsx +++ b/airbyte-webapp/src/pages/connections/ConnectionStatusPage/ConnectionStatusPage.tsx @@ -211,7 +211,7 @@ export const ConnectionStatusPage: React.FC = () => { {(moreJobPagesAvailable || isJobPageLoading) && (
    -
    From 908a93f3c68863a65f1be7e3b21e74b9394aac31 Mon Sep 17 00:00:00 2001 From: Augustin Date: Fri, 27 Jan 2023 19:00:19 +0100 Subject: [PATCH 147/195] cloud-availability-updater: implement git interactions (#21976) --- .../qa_engine/cloud_availability_updater.py | 99 ++++++++++++ .../ci_connector_ops/qa_engine/constants.py | 2 + tools/ci_connector_ops/pytest.ini | 4 + tools/ci_connector_ops/setup.py | 2 +- .../test_cloud_availability_updater.py | 145 ++++++++++++++++++ 5 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 tools/ci_connector_ops/ci_connector_ops/qa_engine/cloud_availability_updater.py create mode 100644 tools/ci_connector_ops/pytest.ini create mode 100644 tools/ci_connector_ops/tests/test_qa_engine/test_cloud_availability_updater.py diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/cloud_availability_updater.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/cloud_availability_updater.py new file mode 100644 index 0000000000000..f51c07185a338 --- /dev/null +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/cloud_availability_updater.py @@ -0,0 +1,99 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import os +import logging +from pathlib import Path +import subprocess +from typing import Optional + +import git + +from .models import ConnectorQAReport +from .constants import ( + AIRBYTE_CLOUD_GITHUB_REPO_URL, + AIRBYTE_CLOUD_MAIN_BRANCH_NAME +) + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +def clone_airbyte_cloud_repo(local_repo_path: Path) -> git.Repo: + logging.info(f"Cloning {AIRBYTE_CLOUD_GITHUB_REPO_URL} to {local_repo_path}") + return git.Repo.clone_from(AIRBYTE_CLOUD_GITHUB_REPO_URL, local_repo_path, branch=AIRBYTE_CLOUD_MAIN_BRANCH_NAME) + +def get_definitions_mask_path(local_repo_path, definition_type: str) -> Path: + definitions_mask_path = local_repo_path / f"cloud-config/cloud-config-seed/src/main/resources/seed/{definition_type}_definitions_mask.yaml" + if not definitions_mask_path.exists(): + raise FileNotFoundError(f"Can't find the {definition_type} definitions mask") + return definitions_mask_path + +def checkout_new_branch(airbyte_cloud_repo: git.Repo, new_branch_name: str) -> git.Head: + new_branch = airbyte_cloud_repo.create_head(new_branch_name) + new_branch.checkout() + logging.info(f"Checked out branch {new_branch_name}.") + return new_branch + +def update_definitions_mask(connector: ConnectorQAReport, definitions_mask_path: Path) -> Optional[Path]: + with open(definitions_mask_path, "r") as definition_mask: + connector_already_in_mask = connector.connector_definition_id in definition_mask.read() + if connector_already_in_mask: + logging.warning(f"{connector.connector_name}'s definition id is already in {definitions_mask_path}.") + return None + + to_append = f"""# {connector.connector_name} (from cloud availability updater) +- {connector.connector_type}DefinitionId: {connector.connector_definition_id} +""" + + with open(definitions_mask_path, "a") as f: + f.write(to_append) + logging.info(f"Updated {definitions_mask_path} with {connector.connector_name}'s definition id.") + return definitions_mask_path + +def run_generate_cloud_connector_catalog(airbyte_cloud_repo_path: Path) -> str: + result = subprocess.check_output( + f"cd {airbyte_cloud_repo_path} && ./gradlew :cloud-config:cloud-config-seed:generateCloudConnectorCatalog", + shell=True + ) + logging.info("Ran generateCloudConnectorCatalog Gradle Task") + return result.decode() + +def commit_all_files(airbyte_cloud_repo: git.Repo, commit_message: str): + airbyte_cloud_repo.git.add('--all') + airbyte_cloud_repo.git.commit(m=commit_message) + logging.info(f"Committed file changes.") + +def push_branch(airbyte_cloud_repo: git.Repo, branch:str): + airbyte_cloud_repo.git.push("--set-upstream", "origin", branch) + logging.info(f"Pushed branch {branch} to origin") + +def deploy_new_connector_to_cloud_repo( + airbyte_cloud_repo_path: Path, + airbyte_cloud_repo: git.Repo, + connector: ConnectorQAReport + ): + """Updates the local definitions mask on Airbyte cloud repo. + Calls the generateCloudConnectorCatalog gradle task. + Commits these changes on a new branch. + Pushes these new branch to the origin. + + Args: + airbyte_cloud_repo_path (Path): The local path to Airbyte Cloud repository. + airbyte_cloud_repo (git.Repo): The Airbyte Cloud repo instance. + connector (ConnectorQAReport): The connector to add to a definitions mask. + """ + airbyte_cloud_repo.git.checkout(AIRBYTE_CLOUD_MAIN_BRANCH_NAME) + new_branch_name = f"cloud-availability-updater/deploy-{connector.connector_technical_name}" + checkout_new_branch(airbyte_cloud_repo, new_branch_name) + definitions_mask_path = get_definitions_mask_path(airbyte_cloud_repo_path, connector.connector_type) + update_definitions_mask(connector, definitions_mask_path) + run_generate_cloud_connector_catalog(airbyte_cloud_repo_path) + commit_all_files( + airbyte_cloud_repo, + f"🤖 Add {connector.connector_name} connector to cloud" + ) + push_branch(airbyte_cloud_repo, new_branch_name) + airbyte_cloud_repo.git.checkout(AIRBYTE_CLOUD_MAIN_BRANCH_NAME) diff --git a/tools/ci_connector_ops/ci_connector_ops/qa_engine/constants.py b/tools/ci_connector_ops/ci_connector_ops/qa_engine/constants.py index c007c7328cb6d..c8d7e1f7b9717 100644 --- a/tools/ci_connector_ops/ci_connector_ops/qa_engine/constants.py +++ b/tools/ci_connector_ops/ci_connector_ops/qa_engine/constants.py @@ -13,3 +13,5 @@ ] GCS_QA_REPORT_PATH = "gs://prod-airbyte-cloud-connector-metadata-service/qa_report.json" +AIRBYTE_CLOUD_GITHUB_REPO_URL = "https://github.com/airbytehq/airbyte-cloud.git" +AIRBYTE_CLOUD_MAIN_BRANCH_NAME = "master" diff --git a/tools/ci_connector_ops/pytest.ini b/tools/ci_connector_ops/pytest.ini new file mode 100644 index 0000000000000..6df308df74d57 --- /dev/null +++ b/tools/ci_connector_ops/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +markers = + slow: marks tests as slow (deselect with '-m "not slow"') + serial diff --git a/tools/ci_connector_ops/setup.py b/tools/ci_connector_ops/setup.py index 50cc3f0fe40b3..f71eca90fd79c 100644 --- a/tools/ci_connector_ops/setup.py +++ b/tools/ci_connector_ops/setup.py @@ -23,7 +23,7 @@ setup( - version="0.1.8", + version="0.1.9", name="ci_connector_ops", description="Packaged maintained by the connector operations team to perform CI for connectors", author="Airbyte", diff --git a/tools/ci_connector_ops/tests/test_qa_engine/test_cloud_availability_updater.py b/tools/ci_connector_ops/tests/test_qa_engine/test_cloud_availability_updater.py new file mode 100644 index 0000000000000..adf61249da874 --- /dev/null +++ b/tools/ci_connector_ops/tests/test_qa_engine/test_cloud_availability_updater.py @@ -0,0 +1,145 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +from datetime import datetime +from pathlib import Path + +import pytest +import git +import yaml + +from ci_connector_ops.qa_engine import cloud_availability_updater, models + +@pytest.fixture(scope="module") +def dummy_repo_path(tmp_path_factory) -> Path: + repo_path = tmp_path_factory.mktemp("cloud_availability_updater_tests") / "airbyte-cloud" + repo_path.mkdir() + return repo_path + +@pytest.fixture(scope="module") +def dummy_repo(dummy_repo_path) -> git.Repo: + seed_dir = dummy_repo_path / "cloud-config/cloud-config-seed/src/main/resources/seed" + seed_dir.mkdir(parents=True) + repo = git.Repo.init(dummy_repo_path) + source_definitions_mask_path = seed_dir / "source_definitions_mask.yaml" + destination_definitions_mask_path = seed_dir / "destination_definitions_mask.yaml" + source_definitions_mask_path.touch() + destination_definitions_mask_path.touch() + repo.git.add("--all") + repo.git.commit(m=f"🤖 Initialized the repo") + return repo + + +@pytest.fixture +def checkout_master(dummy_repo): + """ + Ensure we're always on dummy repo master before and after each test using this fixture + """ + yield dummy_repo.heads.master.checkout() + dummy_repo.heads.master.checkout() + +def test_get_definitions_mask_path(checkout_master, dummy_repo_path: Path): + path = cloud_availability_updater.get_definitions_mask_path(dummy_repo_path, "source") + assert path.exists() and path.name == "source_definitions_mask.yaml" + path = cloud_availability_updater.get_definitions_mask_path(dummy_repo_path, "destination") + assert path.exists() and path.name == "destination_definitions_mask.yaml" + with pytest.raises(FileNotFoundError): + cloud_availability_updater.get_definitions_mask_path(dummy_repo_path, "foobar") + +def test_checkout_new_branch(mocker, checkout_master, dummy_repo): + new_branch = cloud_availability_updater.checkout_new_branch(dummy_repo, "test-branch") + assert new_branch.name == dummy_repo.active_branch.name == "test-branch" + + +@pytest.mark.parametrize( + "definitions_mask_content_before_update, definition_id, expect_update", + [ + ("", "abcdefg", True), + ("abcdefg", "abcdefg", False), + ] + +) +def test_update_definitions_mask( + mocker, + tmp_path, + definitions_mask_content_before_update, + definition_id, + expect_update +): + connector = mocker.Mock( + connector_name="foobar", + connector_definition_id=definition_id, + connector_type="unknown" + ) + definitions_mask_path = tmp_path / "definitions_mask.yaml" + with open(definitions_mask_path, "w") as definitions_mask: + definitions_mask.write(definitions_mask_content_before_update) + updated_path = cloud_availability_updater.update_definitions_mask(connector, definitions_mask_path) + if not expect_update: + assert updated_path is None + else: + with open(updated_path, "r") as definitions_mask: + raw_content = definitions_mask.read() + definitions = yaml.safe_load(raw_content) + assert isinstance(definitions, list) + assert definitions[0]["unknownDefinitionId"] == definition_id + assert len( + [ + d for d in definitions + if d["unknownDefinitionId"] == definition_id + ]) == 1 + assert "# foobar (from cloud availability updater)" in raw_content + assert raw_content[-1] == "\n" + +def test_commit_files(checkout_master, dummy_repo, dummy_repo_path): + cloud_availability_updater.checkout_new_branch(dummy_repo, "test-commit-files") + commit_message = "🤖 Add new connector to cloud" + with open(dummy_repo_path / "test_file.txt", "w") as f: + f.write(".") + + cloud_availability_updater.commit_all_files(dummy_repo, commit_message) + + assert dummy_repo.head.reference.commit.message == commit_message + "\n" + edited_files = dummy_repo.git.diff("--name-only", checkout_master.name).split("\n") + assert "test_file.txt" in edited_files + +def test_push_branch(mocker): + mock_repo = mocker.Mock() + cloud_availability_updater.push_branch(mock_repo, "new_branch") + mock_repo.git.push.assert_called_once_with("--set-upstream", "origin", "new_branch") + +@pytest.mark.slow +def test_deploy_new_connector_to_cloud_repo(mocker, tmp_path): + mocker.patch.object(cloud_availability_updater, "push_branch") + mocker.patch.object(cloud_availability_updater, "run_generate_cloud_connector_catalog") + + repo_path = tmp_path / "airbyte-cloud" + repo_path.mkdir() + airbyte_cloud_repo = cloud_availability_updater.clone_airbyte_cloud_repo(repo_path) + source_definitions_mask_path = repo_path / "cloud-config/cloud-config-seed/src/main/resources/seed/source_definitions_mask.yaml" + destination_definitions_mask_path = repo_path / "cloud-config/cloud-config-seed/src/main/resources/seed/destination_definitions_mask.yaml" + assert source_definitions_mask_path.exists() and destination_definitions_mask_path.exists() + + connector = models.ConnectorQAReport( + connector_type="source", + connector_name="foobar", + connector_technical_name="source-foobar", + connector_definition_id="abcdefg", + connector_version="0.0.0", + release_stage="alpha", + is_on_cloud=False, + is_appropriate_for_cloud_use=True, + latest_build_is_successful=True, + documentation_is_available=True + ) + cloud_availability_updater.deploy_new_connector_to_cloud_repo(repo_path, airbyte_cloud_repo, connector) + new_branch_name = f"cloud-availability-updater/deploy-{connector.connector_technical_name}" + + cloud_availability_updater.push_branch.assert_called_once_with(airbyte_cloud_repo, new_branch_name) + cloud_availability_updater.run_generate_cloud_connector_catalog.assert_called_once_with(repo_path) + airbyte_cloud_repo.git.checkout(new_branch_name) + edited_files = airbyte_cloud_repo.git.diff("--name-only", "master").split("\n") + assert edited_files == ['cloud-config/cloud-config-seed/src/main/resources/seed/source_definitions_mask.yaml'] + assert airbyte_cloud_repo.head.reference.commit.message == "🤖 Add foobar connector to cloud\n" From b9e3c8a7f26b5fb108cc63a6f2a9878ad062547d Mon Sep 17 00:00:00 2001 From: Evan Tahler Date: Fri, 27 Jan 2023 10:07:01 -0800 Subject: [PATCH 148/195] Suggested Streams via Actor Definition (#21577) * Suggested Streams in in the Actor Definition * Fix steam addition * fix tests * enable faker streams * test resilaince. * lint * fig configLookup * fixup definition load in webBackend * fix build/tests * Include 'suggested' in discover API response * fix test * Update airbyte-api/src/main/openapi/config.yaml Co-authored-by: Pedro S. Lopez * update build with typo * fix test * remove comment * add more context --------- Co-authored-by: Pedro S. Lopez --- airbyte-api/src/main/openapi/config.yaml | 15 ++- .../io/airbyte/bootloader/BootloaderTest.java | 2 +- .../server/handlers/ConnectionsHandler.java | 5 +- .../server/handlers/SchedulerHandler.java | 11 +- .../WebBackendConnectionsHandler.java | 4 +- .../handlers/helpers/CatalogConverter.java | 37 +++++- .../server/handlers/SchedulerHandlerTest.java | 112 ++++++++++-------- .../server/handlers/SourceHandlerTest.java | 4 +- .../types/StandardSourceDefinition.yaml | 2 + .../resources/types/SuggestedStreams.yaml | 14 +++ .../config/persistence/ConfigWriter.java | 4 + .../config/persistence/DbConverter.java | 6 +- .../resources/seed/source_definitions.yaml | 17 +++ .../V0_40_28_001__AddSuggestedStreams.java | 39 ++++++ .../configs_database/schema_dump.txt | 1 + .../test/acceptance/BasicAcceptanceTests.java | 4 +- .../api/generated-api-html/index.html | 31 ++++- 17 files changed, 234 insertions(+), 74 deletions(-) create mode 100644 airbyte-config/config-models/src/main/resources/types/SuggestedStreams.yaml create mode 100644 airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_28_001__AddSuggestedStreams.java diff --git a/airbyte-api/src/main/openapi/config.yaml b/airbyte-api/src/main/openapi/config.yaml index 3d22973efe42e..9d4dd02ce2102 100644 --- a/airbyte-api/src/main/openapi/config.yaml +++ b/airbyte-api/src/main/openapi/config.yaml @@ -1240,7 +1240,7 @@ paths: description: | Apply a patch-style update to a connection. Only fields present on the update request body will be updated. Note that if a catalog is present in the request body, the connection's entire catalog will be replaced - with the catalog from the request. This means that to modify a single stream, the entire new catalog + with the catalog from the request. This means that to modify a single stream, the entire new catalog containing the updated stream needs to be sent. operationId: updateConnection requestBody: @@ -1883,7 +1883,7 @@ paths: connection along with the rest of the operationIds in the request body. Apply a patch-style update to a connection. Only fields present on the update request body will be updated. Note that if a catalog is present in the request body, the connection's entire catalog will be replaced - with the catalog from the request. This means that to modify a single stream, the entire new catalog + with the catalog from the request. This means that to modify a single stream, the entire new catalog containing the updated stream needs to be sent. operationId: webBackendUpdateConnection requestBody: @@ -1952,9 +1952,9 @@ paths: - web_backend description: Returns all available geographies in which a data sync can run. summary: | - Returns available geographies can be selected to run data syncs in a particular geography. - The 'auto' entry indicates that the sync will be automatically assigned to a geography according - to the platform default behavior. Entries other than 'auto' are two-letter country codes that + Returns available geographies can be selected to run data syncs in a particular geography. + The 'auto' entry indicates that the sync will be automatically assigned to a geography according + to the platform default behavior. Entries other than 'auto' are two-letter country codes that follow the ISO 3166-1 alpha-2 standard. operationId: webBackendListGeographies responses: @@ -3879,7 +3879,10 @@ components: description: Alias name to the stream to be used in the destination type: string selected: - description: If this is true, the stream is selected with all of its properties. + description: If this is true, the stream is selected with all of its properties. For new connections, this considers if the stream is suggested or not + type: boolean + suggested: + description: Does the connector suggest that this stream be enabled by default? type: boolean fieldSelectionEnabled: description: Whether field selection should be enabled. If this is true, only the properties in `selectedFields` will be included. diff --git a/airbyte-bootloader/src/test/java/io/airbyte/bootloader/BootloaderTest.java b/airbyte-bootloader/src/test/java/io/airbyte/bootloader/BootloaderTest.java index 4939a3e2ea6b0..032ec01e66c43 100644 --- a/airbyte-bootloader/src/test/java/io/airbyte/bootloader/BootloaderTest.java +++ b/airbyte-bootloader/src/test/java/io/airbyte/bootloader/BootloaderTest.java @@ -82,7 +82,7 @@ class BootloaderTest { // ⚠️ This line should change with every new migration to show that you meant to make a new // migration to the prod database - private static final String CURRENT_MIGRATION_VERSION = "0.40.27.001"; + private static final String CURRENT_MIGRATION_VERSION = "0.40.28.001"; @BeforeEach void setup() { diff --git a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/ConnectionsHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/ConnectionsHandler.java index 698d66716c7dd..3efb3e68dfd71 100644 --- a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/ConnectionsHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/ConnectionsHandler.java @@ -519,8 +519,9 @@ public Optional getConnectionAirbyteCatalog(final UUID connectio return Optional.empty(); } final ActorCatalog catalog = configRepository.getActorCatalogById(connection.getSourceCatalogId()); - return Optional.of(CatalogConverter.toApi(Jsons.object(catalog.getCatalog(), - io.airbyte.protocol.models.AirbyteCatalog.class))); + final StandardSourceDefinition sourceDefinition = configRepository.getSourceDefinitionFromSource(connection.getSourceId()); + final io.airbyte.protocol.models.AirbyteCatalog jsonCatalog = Jsons.object(catalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); + return Optional.of(CatalogConverter.toApi(jsonCatalog, sourceDefinition)); } public ConnectionReadList searchConnections(final ConnectionSearch connectionSearch) diff --git a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SchedulerHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SchedulerHandler.java index 51c38b824b283..e0bd34451a7cd 100644 --- a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SchedulerHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/SchedulerHandler.java @@ -267,7 +267,7 @@ public SourceDiscoverSchemaRead discoverSchemaForSourceFromSourceId(final Source connectorVersion, new Version(sourceDef.getProtocolVersion()), isCustomConnector); - final SourceDiscoverSchemaRead discoveredSchema = retrieveDiscoveredSchema(persistedCatalogId); + final SourceDiscoverSchemaRead discoveredSchema = retrieveDiscoveredSchema(persistedCatalogId, sourceDef); if (discoverSchemaRequestBody.getConnectionId() != null) { // modify discoveredSchema object to add CatalogDiff, containsBreakingChange, and connectionStatus @@ -286,7 +286,7 @@ public SourceDiscoverSchemaRead discoverSchemaForSourceFromSourceId(final Source .logs(new LogRead().logLines(new ArrayList<>())) .succeeded(true); return new SourceDiscoverSchemaRead() - .catalog(CatalogConverter.toApi(airbyteCatalog)) + .catalog(CatalogConverter.toApi(airbyteCatalog, sourceDef)) .jobInfo(emptyJob) .catalogId(currentCatalog.get().getId()); } @@ -313,10 +313,11 @@ public SourceDiscoverSchemaRead discoverSchemaForSourceFromSourceCreate(final So new Version( sourceDef.getProtocolVersion()), isCustomConnector); - return retrieveDiscoveredSchema(response); + return retrieveDiscoveredSchema(response, sourceDef); } - private SourceDiscoverSchemaRead retrieveDiscoveredSchema(final SynchronousResponse response) throws ConfigNotFoundException, IOException { + private SourceDiscoverSchemaRead retrieveDiscoveredSchema(final SynchronousResponse response, final StandardSourceDefinition sourceDef) + throws ConfigNotFoundException, IOException { final SourceDiscoverSchemaRead sourceDiscoverSchemaRead = new SourceDiscoverSchemaRead() .jobInfo(jobConverter.getSynchronousJobRead(response)); @@ -324,7 +325,7 @@ private SourceDiscoverSchemaRead retrieveDiscoveredSchema(final SynchronousRespo final ActorCatalog catalog = configRepository.getActorCatalogById(response.getOutput()); final AirbyteCatalog persistenceCatalog = Jsons.object(catalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); - sourceDiscoverSchemaRead.catalog(CatalogConverter.toApi(persistenceCatalog)); + sourceDiscoverSchemaRead.catalog(CatalogConverter.toApi(persistenceCatalog, sourceDef)); sourceDiscoverSchemaRead.catalogId(response.getOutput()); } diff --git a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandler.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandler.java index 3e71207370573..106a892ab38c1 100644 --- a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandler.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/WebBackendConnectionsHandler.java @@ -54,6 +54,7 @@ import io.airbyte.commons.server.scheduler.EventRunner; import io.airbyte.config.ActorCatalog; import io.airbyte.config.ActorCatalogFetchEvent; +import io.airbyte.config.StandardSourceDefinition; import io.airbyte.config.StandardSync; import io.airbyte.config.persistence.ConfigNotFoundException; import io.airbyte.config.persistence.ConfigRepository; @@ -544,8 +545,9 @@ public WebBackendConnectionRead webBackendUpdateConnection(final WebBackendConne if (mostRecentActorCatalog.isPresent()) { final io.airbyte.protocol.models.AirbyteCatalog mostRecentAirbyteCatalog = Jsons.object(mostRecentActorCatalog.get().getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); + final StandardSourceDefinition sourceDefinition = configRepository.getSourceDefinitionFromSource(originalConnectionRead.getSourceId()); final CatalogDiff catalogDiff = - connectionsHandler.getDiff(newAirbyteCatalog, CatalogConverter.toApi(mostRecentAirbyteCatalog), + connectionsHandler.getDiff(newAirbyteCatalog, CatalogConverter.toApi(mostRecentAirbyteCatalog, sourceDefinition), CatalogConverter.toConfiguredProtocol(newAirbyteCatalog)); breakingChange = containsBreakingChange(catalogDiff); } diff --git a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/CatalogConverter.java b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/CatalogConverter.java index 48ae8630b2059..75fb0eda27f08 100644 --- a/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/CatalogConverter.java +++ b/airbyte-commons-server/src/main/java/io/airbyte/commons/server/handlers/helpers/CatalogConverter.java @@ -18,6 +18,7 @@ import io.airbyte.commons.json.Jsons; import io.airbyte.commons.text.Names; import io.airbyte.config.FieldSelectionData; +import io.airbyte.config.StandardSourceDefinition; import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; import io.airbyte.validation.json.JsonValidationException; import java.util.ArrayList; @@ -103,29 +104,57 @@ private static io.airbyte.protocol.models.AirbyteStream toConfiguredProtocol(fin .withNamespace(stream.getNamespace()); } - public static io.airbyte.api.model.generated.AirbyteCatalog toApi(final io.airbyte.protocol.models.AirbyteCatalog catalog) { + public static io.airbyte.api.model.generated.AirbyteCatalog toApi(final io.airbyte.protocol.models.AirbyteCatalog catalog, + StandardSourceDefinition sourceDefinition) { + List suggestedStreams = new ArrayList<>(); + Boolean suggestingStreams; + + // There are occasions in tests where we have not seeded the sourceDefinition fully. This is to + // prevent those tests from failing + if (sourceDefinition != null) { + suggestingStreams = sourceDefinition.getSuggestedStreams() != null; + if (suggestingStreams) { + suggestedStreams.addAll(sourceDefinition.getSuggestedStreams().getStreams()); + } + } else { + suggestingStreams = false; + } + return new io.airbyte.api.model.generated.AirbyteCatalog() .streams(catalog.getStreams() .stream() .map(CatalogConverter::toApi) .map(s -> new io.airbyte.api.model.generated.AirbyteStreamAndConfiguration() .stream(s) - .config(generateDefaultConfiguration(s))) + .config(generateDefaultConfiguration(s, suggestingStreams, suggestedStreams))) .collect(Collectors.toList())); } - private static io.airbyte.api.model.generated.AirbyteStreamConfiguration generateDefaultConfiguration(final io.airbyte.api.model.generated.AirbyteStream stream) { + private static io.airbyte.api.model.generated.AirbyteStreamConfiguration generateDefaultConfiguration(final io.airbyte.api.model.generated.AirbyteStream stream, + Boolean suggestingStreams, + List suggestedStreams) { final io.airbyte.api.model.generated.AirbyteStreamConfiguration result = new io.airbyte.api.model.generated.AirbyteStreamConfiguration() .aliasName(Names.toAlphanumericAndUnderscore(stream.getName())) .cursorField(stream.getDefaultCursorField()) .destinationSyncMode(io.airbyte.api.model.generated.DestinationSyncMode.APPEND) .primaryKey(stream.getSourceDefinedPrimaryKey()) - .selected(true); + .selected(!suggestingStreams) + .suggested(true); + + if (suggestingStreams) { + if (suggestedStreams.contains(stream.getName())) { + result.setSelected(true); + } else { + result.setSuggested(false); + } + } + if (stream.getSupportedSyncModes().size() > 0) { result.setSyncMode(stream.getSupportedSyncModes().get(0)); } else { result.setSyncMode(io.airbyte.api.model.generated.SyncMode.INCREMENTAL); } + return result; } diff --git a/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SchedulerHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SchedulerHandlerTest.java index b495ab19e1a19..5b4e2773112a6 100644 --- a/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SchedulerHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SchedulerHandlerTest.java @@ -570,12 +570,13 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreaking() throws IOExcept final StreamTransform streamTransform = new StreamTransform().transformType(TransformTypeEnum.REMOVE_STREAM) .streamDescriptor(new io.airbyte.api.model.generated.StreamDescriptor().name(DOGS)); final CatalogDiff catalogDiff = new CatalogDiff().addTransformsItem(streamTransform); + final StandardSourceDefinition sourceDef = new StandardSourceDefinition() + .withDockerRepository(SOURCE_DOCKER_REPO) + .withDockerImageTag(SOURCE_DOCKER_TAG) + .withProtocolVersion(SOURCE_PROTOCOL_VERSION) + .withSourceDefinitionId(source.getSourceDefinitionId()); when(configRepository.getStandardSourceDefinition(source.getSourceDefinitionId())) - .thenReturn(new StandardSourceDefinition() - .withDockerRepository(SOURCE_DOCKER_REPO) - .withDockerImageTag(SOURCE_DOCKER_TAG) - .withProtocolVersion(SOURCE_PROTOCOL_VERSION) - .withSourceDefinitionId(source.getSourceDefinitionId())); + .thenReturn(sourceDef); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), false)) @@ -588,7 +589,8 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreaking() throws IOExcept CatalogHelpers.createAirbyteStream(SHOES, Field.of(SKU, JsonSchemaType.STRING)), CatalogHelpers.createAirbyteStream(DOGS, Field.of(NAME, JsonSchemaType.STRING)))); - final ConnectionRead connectionRead = new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).connectionId(connectionId); + final ConnectionRead connectionRead = + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).connectionId(connectionId); when(connectionsHandler.getConnection(request.getConnectionId())).thenReturn(connectionRead); when(connectionsHandler.getDiff(any(), any(), any())).thenReturn(catalogDiff); final ConnectionReadList connectionReadList = new ConnectionReadList().connections(List.of(connectionRead)); @@ -602,7 +604,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreaking() throws IOExcept final AirbyteCatalog persistenceCatalog = Jsons.object(actorCatalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); - final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog); + final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog, sourceDef); final SourceDiscoverSchemaRead actual = schedulerHandler.discoverSchemaForSourceFromSourceId(request); assertEquals(actual.getCatalogDiff(), catalogDiff); @@ -621,13 +623,14 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP final StreamTransform streamTransform = new StreamTransform().transformType(TransformTypeEnum.REMOVE_STREAM) .streamDescriptor(new io.airbyte.api.model.generated.StreamDescriptor().name(DOGS)); final CatalogDiff catalogDiff = new CatalogDiff().addTransformsItem(streamTransform); + final StandardSourceDefinition sourceDef = new StandardSourceDefinition() + .withDockerRepository(SOURCE_DOCKER_REPO) + .withDockerImageTag(SOURCE_DOCKER_TAG) + .withProtocolVersion(SOURCE_PROTOCOL_VERSION) + .withSourceDefinitionId(source.getSourceDefinitionId()); when(envVariableFeatureFlags.autoDetectSchema()).thenReturn(false); when(configRepository.getStandardSourceDefinition(source.getSourceDefinitionId())) - .thenReturn(new StandardSourceDefinition() - .withDockerRepository(SOURCE_DOCKER_REPO) - .withDockerImageTag(SOURCE_DOCKER_TAG) - .withProtocolVersion(SOURCE_PROTOCOL_VERSION) - .withSourceDefinitionId(source.getSourceDefinitionId())); + .thenReturn(sourceDef); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), false)) @@ -641,7 +644,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP CatalogHelpers.createAirbyteStream(DOGS, Field.of(NAME, JsonSchemaType.STRING)))); final ConnectionRead connectionRead = - new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).nonBreakingChangesPreference( + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).nonBreakingChangesPreference( NonBreakingChangesPreference.DISABLE).status(ConnectionStatus.ACTIVE).connectionId(connectionId); when(connectionsHandler.getConnection(request.getConnectionId())).thenReturn(connectionRead); when(connectionsHandler.getDiff(any(), any(), any())).thenReturn(catalogDiff); @@ -656,7 +659,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP final AirbyteCatalog persistenceCatalog = Jsons.object(actorCatalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); - final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog); + final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog, sourceDef); final SourceDiscoverSchemaRead actual = schedulerHandler.discoverSchemaForSourceFromSourceId(request); assertEquals(actual.getCatalogDiff(), catalogDiff); @@ -676,13 +679,14 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP final StreamTransform streamTransform = new StreamTransform().transformType(TransformTypeEnum.REMOVE_STREAM) .streamDescriptor(new io.airbyte.api.model.generated.StreamDescriptor().name(DOGS)); final CatalogDiff catalogDiff = new CatalogDiff().addTransformsItem(streamTransform); + final StandardSourceDefinition sourceDef = new StandardSourceDefinition() + .withDockerRepository(SOURCE_DOCKER_REPO) + .withDockerImageTag(SOURCE_DOCKER_TAG) + .withProtocolVersion(SOURCE_PROTOCOL_VERSION) + .withSourceDefinitionId(source.getSourceDefinitionId()); when(envVariableFeatureFlags.autoDetectSchema()).thenReturn(true); when(configRepository.getStandardSourceDefinition(source.getSourceDefinitionId())) - .thenReturn(new StandardSourceDefinition() - .withDockerRepository(SOURCE_DOCKER_REPO) - .withDockerImageTag(SOURCE_DOCKER_TAG) - .withProtocolVersion(SOURCE_PROTOCOL_VERSION) - .withSourceDefinitionId(source.getSourceDefinitionId())); + .thenReturn(sourceDef); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), false)) @@ -696,7 +700,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP CatalogHelpers.createAirbyteStream(DOGS, Field.of(NAME, JsonSchemaType.STRING)))); final ConnectionRead connectionRead = - new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).nonBreakingChangesPreference( + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).nonBreakingChangesPreference( NonBreakingChangesPreference.DISABLE).connectionId(connectionId); when(connectionsHandler.getConnection(request.getConnectionId())).thenReturn(connectionRead); when(connectionsHandler.getDiff(any(), any(), any())).thenReturn(catalogDiff); @@ -711,7 +715,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP final AirbyteCatalog persistenceCatalog = Jsons.object(actorCatalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); - final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog); + final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog, sourceDef); final SourceDiscoverSchemaRead actual = schedulerHandler.discoverSchemaForSourceFromSourceId(request); assertEquals(actual.getCatalogDiff(), catalogDiff); @@ -731,12 +735,13 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdBreaking() throws IOException .streamDescriptor(new io.airbyte.api.model.generated.StreamDescriptor().name(DOGS)).addUpdateStreamItem(new FieldTransform().transformType( FieldTransform.TransformTypeEnum.REMOVE_FIELD).breaking(true)); final CatalogDiff catalogDiff = new CatalogDiff().addTransformsItem(streamTransform); + final StandardSourceDefinition sourceDef = new StandardSourceDefinition() + .withDockerRepository(SOURCE_DOCKER_REPO) + .withDockerImageTag(SOURCE_DOCKER_TAG) + .withProtocolVersion(SOURCE_PROTOCOL_VERSION) + .withSourceDefinitionId(source.getSourceDefinitionId()); when(configRepository.getStandardSourceDefinition(source.getSourceDefinitionId())) - .thenReturn(new StandardSourceDefinition() - .withDockerRepository(SOURCE_DOCKER_REPO) - .withDockerImageTag(SOURCE_DOCKER_TAG) - .withProtocolVersion(SOURCE_PROTOCOL_VERSION) - .withSourceDefinitionId(source.getSourceDefinitionId())); + .thenReturn(sourceDef); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), false)) @@ -750,7 +755,8 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdBreaking() throws IOException CatalogHelpers.createAirbyteStream(DOGS, Field.of(NAME, JsonSchemaType.STRING)))); final ConnectionRead connectionRead = - new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).status(ConnectionStatus.ACTIVE).connectionId(connectionId); + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).status(ConnectionStatus.ACTIVE) + .connectionId(connectionId); when(connectionsHandler.getConnection(request.getConnectionId())).thenReturn(connectionRead); when(connectionsHandler.getDiff(any(), any(), any())).thenReturn(catalogDiff); final ConnectionReadList connectionReadList = new ConnectionReadList().connections(List.of(connectionRead)); @@ -764,7 +770,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdBreaking() throws IOException final AirbyteCatalog persistenceCatalog = Jsons.object(actorCatalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); - final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog); + final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog, sourceDef); final ConnectionUpdate expectedConnectionUpdate = new ConnectionUpdate().connectionId(connectionId).breakingChange(true).status(ConnectionStatus.ACTIVE); @@ -787,13 +793,14 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdBreakingFeatureFlagOn() throw .streamDescriptor(new io.airbyte.api.model.generated.StreamDescriptor().name(DOGS)).addUpdateStreamItem(new FieldTransform().transformType( FieldTransform.TransformTypeEnum.REMOVE_FIELD).breaking(true)); final CatalogDiff catalogDiff = new CatalogDiff().addTransformsItem(streamTransform); + final StandardSourceDefinition sourceDef = new StandardSourceDefinition() + .withDockerRepository(SOURCE_DOCKER_REPO) + .withDockerImageTag(SOURCE_DOCKER_TAG) + .withProtocolVersion(SOURCE_PROTOCOL_VERSION) + .withSourceDefinitionId(source.getSourceDefinitionId()); when(envVariableFeatureFlags.autoDetectSchema()).thenReturn(true); when(configRepository.getStandardSourceDefinition(source.getSourceDefinitionId())) - .thenReturn(new StandardSourceDefinition() - .withDockerRepository(SOURCE_DOCKER_REPO) - .withDockerImageTag(SOURCE_DOCKER_TAG) - .withProtocolVersion(SOURCE_PROTOCOL_VERSION) - .withSourceDefinitionId(source.getSourceDefinitionId())); + .thenReturn(sourceDef); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), false)) @@ -806,7 +813,8 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdBreakingFeatureFlagOn() throw CatalogHelpers.createAirbyteStream(SHOES, Field.of(SKU, JsonSchemaType.STRING)), CatalogHelpers.createAirbyteStream(DOGS, Field.of(NAME, JsonSchemaType.STRING)))); - final ConnectionRead connectionRead = new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).connectionId(connectionId); + final ConnectionRead connectionRead = + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).connectionId(connectionId); when(connectionsHandler.getConnection(request.getConnectionId())).thenReturn(connectionRead); when(connectionsHandler.getDiff(any(), any(), any())).thenReturn(catalogDiff); final ConnectionReadList connectionReadList = new ConnectionReadList().connections(List.of(connectionRead)); @@ -820,7 +828,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdBreakingFeatureFlagOn() throw final AirbyteCatalog persistenceCatalog = Jsons.object(actorCatalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); - final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog); + final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog, sourceDef); final ConnectionUpdate expectedConnectionUpdate = new ConnectionUpdate().connectionId(connectionId).breakingChange(true).status(ConnectionStatus.INACTIVE); @@ -841,13 +849,14 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP final SourceDiscoverSchemaRequestBody request = new SourceDiscoverSchemaRequestBody().sourceId(source.getSourceId()).connectionId(connectionId).disableCache(true); final CatalogDiff catalogDiff = new CatalogDiff(); + final StandardSourceDefinition sourceDef = new StandardSourceDefinition() + .withDockerRepository(SOURCE_DOCKER_REPO) + .withDockerImageTag(SOURCE_DOCKER_TAG) + .withProtocolVersion(SOURCE_PROTOCOL_VERSION) + .withSourceDefinitionId(source.getSourceDefinitionId()); when(envVariableFeatureFlags.autoDetectSchema()).thenReturn(true); when(configRepository.getStandardSourceDefinition(source.getSourceDefinitionId())) - .thenReturn(new StandardSourceDefinition() - .withDockerRepository(SOURCE_DOCKER_REPO) - .withDockerImageTag(SOURCE_DOCKER_TAG) - .withProtocolVersion(SOURCE_PROTOCOL_VERSION) - .withSourceDefinitionId(source.getSourceDefinitionId())); + .thenReturn(sourceDef); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), false)) @@ -861,7 +870,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP CatalogHelpers.createAirbyteStream(DOGS, Field.of(NAME, JsonSchemaType.STRING)))); final ConnectionRead connectionRead = - new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).nonBreakingChangesPreference( + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).nonBreakingChangesPreference( NonBreakingChangesPreference.DISABLE).status(ConnectionStatus.INACTIVE).connectionId(connectionId); when(connectionsHandler.getConnection(request.getConnectionId())).thenReturn(connectionRead); when(connectionsHandler.getDiff(any(), any(), any())).thenReturn(catalogDiff); @@ -876,7 +885,7 @@ void testDiscoverSchemaFromSourceIdWithConnectionIdNonBreakingDisableConnectionP final AirbyteCatalog persistenceCatalog = Jsons.object(actorCatalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); - final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog); + final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog, sourceDef); final SourceDiscoverSchemaRead actual = schedulerHandler.discoverSchemaForSourceFromSourceId(request); assertEquals(actual.getCatalogDiff(), catalogDiff); @@ -907,14 +916,15 @@ void testDiscoverSchemaForSourceMultipleConnectionsFeatureFlagOn() throws IOExce final CatalogDiff catalogDiff1 = new CatalogDiff().addTransformsItem(nonBreakingStreamTransform); final CatalogDiff catalogDiff2 = new CatalogDiff().addTransformsItem(nonBreakingStreamTransform); final CatalogDiff catalogDiff3 = new CatalogDiff().addTransformsItem(breakingStreamTransform); + final StandardSourceDefinition sourceDef = new StandardSourceDefinition() + .withDockerRepository(SOURCE_DOCKER_REPO) + .withDockerImageTag(SOURCE_DOCKER_TAG) + .withProtocolVersion(SOURCE_PROTOCOL_VERSION) + .withSourceDefinitionId(source.getSourceDefinitionId()); when(envVariableFeatureFlags.autoDetectSchema()).thenReturn(true); when(configRepository.getStandardSourceDefinition(source.getSourceDefinitionId())) - .thenReturn(new StandardSourceDefinition() - .withDockerRepository(SOURCE_DOCKER_REPO) - .withDockerImageTag(SOURCE_DOCKER_TAG) - .withProtocolVersion(SOURCE_PROTOCOL_VERSION) - .withSourceDefinitionId(source.getSourceDefinitionId())); + .thenReturn(sourceDef); when(configRepository.getSourceConnection(source.getSourceId())).thenReturn(source); when(synchronousSchedulerClient.createDiscoverSchemaJob(source, SOURCE_DOCKER_IMAGE, SOURCE_DOCKER_TAG, new Version(SOURCE_PROTOCOL_VERSION), false)) @@ -928,15 +938,15 @@ void testDiscoverSchemaForSourceMultipleConnectionsFeatureFlagOn() throws IOExce CatalogHelpers.createAirbyteStream(DOGS, Field.of(NAME, JsonSchemaType.STRING)))); final ConnectionRead connectionRead = - new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).nonBreakingChangesPreference( + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).nonBreakingChangesPreference( NonBreakingChangesPreference.IGNORE).status(ConnectionStatus.ACTIVE).connectionId(connectionId); final ConnectionRead connectionRead2 = - new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).nonBreakingChangesPreference( + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).nonBreakingChangesPreference( NonBreakingChangesPreference.IGNORE).status(ConnectionStatus.ACTIVE).connectionId(connectionId2); final ConnectionRead connectionRead3 = - new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent)).nonBreakingChangesPreference( + new ConnectionRead().syncCatalog(CatalogConverter.toApi(airbyteCatalogCurrent, sourceDef)).nonBreakingChangesPreference( NonBreakingChangesPreference.DISABLE).status(ConnectionStatus.ACTIVE).connectionId(connectionId3); when(connectionsHandler.getConnection(request.getConnectionId())).thenReturn(connectionRead, connectionRead2, connectionRead3); @@ -952,7 +962,7 @@ void testDiscoverSchemaForSourceMultipleConnectionsFeatureFlagOn() throws IOExce final AirbyteCatalog persistenceCatalog = Jsons.object(actorCatalog.getCatalog(), io.airbyte.protocol.models.AirbyteCatalog.class); - final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog); + final io.airbyte.api.model.generated.AirbyteCatalog expectedActorCatalog = CatalogConverter.toApi(persistenceCatalog, sourceDef); final SourceDiscoverSchemaRead actual = schedulerHandler.discoverSchemaForSourceFromSourceId(request); assertEquals(catalogDiff1, actual.getCatalogDiff()); diff --git a/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceHandlerTest.java b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceHandlerTest.java index d36423baeb531..95958f3393c24 100644 --- a/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceHandlerTest.java +++ b/airbyte-commons-server/src/test/java/io/airbyte/commons/server/handlers/SourceHandlerTest.java @@ -387,8 +387,10 @@ void testWriteDiscoverCatalogResult() throws JsonValidationException, IOExceptio UUID catalogId = UUID.randomUUID(); String connectorVersion = "0.0.1"; String hashValue = "0123456789abcd"; + final StandardSourceDefinition sourceDefinition = configRepository.getSourceDefinitionFromSource(actorId); + SourceDiscoverSchemaWriteRequestBody request = new SourceDiscoverSchemaWriteRequestBody().catalog( - CatalogConverter.toApi(airbyteCatalog)).sourceId(actorId).connectorVersion(connectorVersion).configurationHash(hashValue); + CatalogConverter.toApi(airbyteCatalog, sourceDefinition)).sourceId(actorId).connectorVersion(connectorVersion).configurationHash(hashValue); when(configRepository.writeActorCatalogFetchEvent(airbyteCatalog, actorId, connectorVersion, hashValue)).thenReturn(catalogId); DiscoverCatalogResult result = sourceHandler.writeDiscoverCatalogResult(request); diff --git a/airbyte-config/config-models/src/main/resources/types/StandardSourceDefinition.yaml b/airbyte-config/config-models/src/main/resources/types/StandardSourceDefinition.yaml index 905670ac44027..3bf9517028aef 100644 --- a/airbyte-config/config-models/src/main/resources/types/StandardSourceDefinition.yaml +++ b/airbyte-config/config-models/src/main/resources/types/StandardSourceDefinition.yaml @@ -67,3 +67,5 @@ properties: description: the Airbyte Protocol version supported by the connector allowedHosts: "$ref": AllowedHosts.yaml + suggestedStreams: + "$ref": SuggestedStreams.yaml diff --git a/airbyte-config/config-models/src/main/resources/types/SuggestedStreams.yaml b/airbyte-config/config-models/src/main/resources/types/SuggestedStreams.yaml new file mode 100644 index 0000000000000..4d84054dba124 --- /dev/null +++ b/airbyte-config/config-models/src/main/resources/types/SuggestedStreams.yaml @@ -0,0 +1,14 @@ +--- +"$schema": http://json-schema.org/draft-07/schema# +"$id": https://github.com/airbytehq/airbyte/blob/master/airbyte-config/models/src/main/resources/types/SuggestedStreams.yaml +title: SuggestedStreams +description: A source's suggested streams. These will be suggested by default for new connections using this source. Otherwise, all streams will be selected. This is useful for when your source has a lot of streams, but the average user will only want a subset of them synced. +type: object +required: +additionalProperties: true +properties: + streams: + type: array + description: An array of streams that this connector suggests the average user will want. SuggestedStreams not being present for the source means that all streams are suggested. An empty list here means that no streams are suggested. + items: + type: string diff --git a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigWriter.java b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigWriter.java index 662ad2562bccf..a1e95fe5e56b7 100644 --- a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigWriter.java +++ b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/ConfigWriter.java @@ -107,6 +107,8 @@ static void writeStandardSourceDefinition(final List c : JSONB.valueOf(Jsons.serialize(standardSourceDefinition.getResourceRequirements()))) .set(Tables.ACTOR_DEFINITION.ALLOWED_HOSTS, standardSourceDefinition.getAllowedHosts() == null ? null : JSONB.valueOf(Jsons.serialize(standardSourceDefinition.getAllowedHosts()))) + .set(ACTOR_DEFINITION.SUGGESTED_STREAMS, standardSourceDefinition.getSuggestedStreams() == null ? null + : JSONB.valueOf(Jsons.serialize(standardSourceDefinition.getSuggestedStreams()))) .set(Tables.ACTOR_DEFINITION.UPDATED_AT, timestamp) .where(Tables.ACTOR_DEFINITION.ID.eq(standardSourceDefinition.getSourceDefinitionId())) .execute(); @@ -140,6 +142,8 @@ static void writeStandardSourceDefinition(final List c : JSONB.valueOf(Jsons.serialize(standardSourceDefinition.getResourceRequirements()))) .set(ACTOR_DEFINITION.ALLOWED_HOSTS, standardSourceDefinition.getAllowedHosts() == null ? null : JSONB.valueOf(Jsons.serialize(standardSourceDefinition.getAllowedHosts()))) + .set(ACTOR_DEFINITION.SUGGESTED_STREAMS, standardSourceDefinition.getSuggestedStreams() == null ? null + : JSONB.valueOf(Jsons.serialize(standardSourceDefinition.getSuggestedStreams()))) .set(Tables.ACTOR_DEFINITION.CREATED_AT, timestamp) .set(Tables.ACTOR_DEFINITION.UPDATED_AT, timestamp) .execute(); diff --git a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/DbConverter.java b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/DbConverter.java index 58f4b32496d24..2e4ee20c3ca8d 100644 --- a/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/DbConverter.java +++ b/airbyte-config/config-persistence/src/main/java/io/airbyte/config/persistence/DbConverter.java @@ -40,6 +40,7 @@ import io.airbyte.config.StandardSync.ScheduleType; import io.airbyte.config.StandardSync.Status; import io.airbyte.config.StandardWorkspace; +import io.airbyte.config.SuggestedStreams; import io.airbyte.config.WorkspaceServiceAccount; import io.airbyte.protocol.models.ConfiguredAirbyteCatalog; import io.airbyte.protocol.models.ConnectorSpecification; @@ -164,7 +165,10 @@ public static StandardSourceDefinition buildStandardSourceDefinition(final Recor : Jsons.deserialize(record.get(ACTOR_DEFINITION.RESOURCE_REQUIREMENTS).data(), ActorDefinitionResourceRequirements.class)) .withAllowedHosts(record.get(ACTOR_DEFINITION.ALLOWED_HOSTS) == null ? null - : Jsons.deserialize(record.get(ACTOR_DEFINITION.ALLOWED_HOSTS).data(), AllowedHosts.class)); + : Jsons.deserialize(record.get(ACTOR_DEFINITION.ALLOWED_HOSTS).data(), AllowedHosts.class)) + .withSuggestedStreams(record.get(ACTOR_DEFINITION.SUGGESTED_STREAMS) == null + ? null + : Jsons.deserialize(record.get(ACTOR_DEFINITION.SUGGESTED_STREAMS).data(), SuggestedStreams.class)); } public static StandardDestinationDefinition buildStandardDestinationDefinition(final Record record) { diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 23e6e951e1e54..b6c1946f1980d 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -511,6 +511,11 @@ releaseStage: alpha allowedHosts: hosts: [] + suggestedStreams: + streams: + - users + - products + - purchases - name: Fastbill sourceDefinitionId: eb3e9c1c-0467-4eb7-a172-5265e04ccd0a dockerRepository: airbyte/source-fastbill @@ -602,6 +607,18 @@ icon: github.svg sourceType: api releaseStage: generally_available + suggestedStreams: + streams: + - branches + - comments + - issues + - organizations + - pull_requests + - repositories + - stargazers + - tags + - teams + - users allowedHosts: hosts: - api.github.com diff --git a/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_28_001__AddSuggestedStreams.java b/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_28_001__AddSuggestedStreams.java new file mode 100644 index 0000000000000..fd542e7c0ce40 --- /dev/null +++ b/airbyte-db/db-lib/src/main/java/io/airbyte/db/instance/configs/migrations/V0_40_28_001__AddSuggestedStreams.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 Airbyte, Inc., all rights reserved. + */ + +package io.airbyte.db.instance.configs.migrations; + +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; +import org.jooq.DSLContext; +import org.jooq.impl.DSL; +import org.jooq.impl.SQLDataType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class V0_40_28_001__AddSuggestedStreams extends BaseJavaMigration { + + private static final Logger LOGGER = LoggerFactory.getLogger(V0_40_28_001__AddSuggestedStreams.class); + + @Override + public void migrate(final Context context) throws Exception { + LOGGER.info("Running migration: {}", this.getClass().getSimpleName()); + + // Warning: please do not use any jOOQ generated code to write a migration. + // As database schema changes, the generated jOOQ code can be deprecated. So + // old migration may not compile if there is any generated code. + try (final DSLContext ctx = DSL.using(context.getConnection())) { + addSuggestedStreams(ctx); + } + } + + private static void addSuggestedStreams(final DSLContext ctx) { + ctx.alterTable("actor_definition") + .addColumnIfNotExists(DSL.field( + "suggested_streams", + SQLDataType.JSONB.nullable(true))) + .execute(); + } + +} diff --git a/airbyte-db/db-lib/src/main/resources/configs_database/schema_dump.txt b/airbyte-db/db-lib/src/main/resources/configs_database/schema_dump.txt index 30115101e66e5..d83b9eabad512 100644 --- a/airbyte-db/db-lib/src/main/resources/configs_database/schema_dump.txt +++ b/airbyte-db/db-lib/src/main/resources/configs_database/schema_dump.txt @@ -59,6 +59,7 @@ create table "public"."actor_definition"( "supports_dbt" bool null, "normalization_integration_type" varchar(255) null, "allowed_hosts" jsonb null, + "suggested_streams" jsonb null, constraint "actor_definition_pkey" primary key ("id") ); diff --git a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/BasicAcceptanceTests.java b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/BasicAcceptanceTests.java index 92f8f53ce8eb7..71b8d73e658bd 100644 --- a/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/BasicAcceptanceTests.java +++ b/airbyte-tests/src/acceptanceTests/java/io/airbyte/test/acceptance/BasicAcceptanceTests.java @@ -337,7 +337,8 @@ void testDiscoverSourceSchema() throws ApiException { .destinationSyncMode(DestinationSyncMode.APPEND) .primaryKey(Collections.emptyList()) .aliasName(STREAM_NAME.replace(".", "_")) - .selected(true); + .selected(true) + .suggested(true); final AirbyteCatalog expected = new AirbyteCatalog() .streams(Lists.newArrayList(new AirbyteStreamAndConfiguration() .stream(stream) @@ -359,6 +360,7 @@ void testCreateConnection() throws ApiException { catalog.getStreams().forEach(s -> s.getConfig().syncMode(syncMode).destinationSyncMode(destinationSyncMode).setFieldSelectionEnabled(false)); final ConnectionRead createdConnection = testHarness.createConnection(name, sourceId, destinationId, List.of(operationId), catalog, ConnectionScheduleType.BASIC, BASIC_SCHEDULE_DATA); + createdConnection.getSyncCatalog().getStreams().forEach(s -> s.getConfig().setSuggested(true)); assertEquals(sourceId, createdConnection.getSourceId()); assertEquals(destinationId, createdConnection.getDestinationId()); diff --git a/docs/reference/api/generated-api-html/index.html b/docs/reference/api/generated-api-html/index.html index 147055182ed25..c772bcb886bce 100644 --- a/docs/reference/api/generated-api-html/index.html +++ b/docs/reference/api/generated-api-html/index.html @@ -552,6 +552,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -573,6 +574,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -729,6 +731,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -750,6 +753,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -862,6 +866,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -883,6 +888,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -938,6 +944,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -959,6 +966,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1072,6 +1080,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1093,6 +1102,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1148,6 +1158,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1169,6 +1180,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1474,6 +1486,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1495,6 +1508,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1550,6 +1564,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1571,6 +1586,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1875,6 +1891,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -1896,6 +1913,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -6154,6 +6172,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -6175,6 +6194,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -6629,6 +6649,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -6650,6 +6671,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -8839,6 +8861,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -8860,6 +8883,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -9087,6 +9111,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -9108,6 +9133,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -9563,6 +9589,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -9584,6 +9611,7 @@

    Example data

    }, "config" : { "aliasName" : "aliasName", + "suggested" : true, "fieldSelectionEnabled" : true, "selectedFields" : [ { "fieldPath" : [ "fieldPath", "fieldPath" ] @@ -10619,7 +10647,8 @@

    AirbyteStreamConfiguration
    destinationSyncMode
    primaryKey (optional)
    array[array[String]] Paths to the fields that will be used as primary key. This field is REQUIRED if destination_sync_mode is *_dedup. Otherwise it is ignored.
    aliasName (optional)
    String Alias name to the stream to be used in the destination
    -
    selected (optional)
    Boolean If this is true, the stream is selected with all of its properties.
    +
    selected (optional)
    Boolean If this is true, the stream is selected with all of its properties. For new connections, this considers if the stream is suggested or not
    +
    suggested (optional)
    Boolean Does the connector suggest that this stream be enabled by default?
    fieldSelectionEnabled (optional)
    Boolean Whether field selection should be enabled. If this is true, only the properties in selectedFields will be included.
    selectedFields (optional)
    array[SelectedFieldInfo] Paths to the fields that will be included in the configured catalog. This must be set if fieldSelectedEnabled is set. An empty list indicates that no properties will be included.

    From 01b056573e8814a3f19c9aa0c71770823a9a2924 Mon Sep 17 00:00:00 2001 From: "Roman Yermilov [GL]" <86300758+roman-yermilov-gl@users.noreply.github.com> Date: Fri, 27 Jan 2023 22:10:52 +0400 Subject: [PATCH 149/195] Source Stripe: fix stream schemas (#21858) * Source Stripe: fix field name for subscription stream * Source Stripe: bump version * Source Stripe: update changelog * #1364 Source Stripe: fix stream schemas * #1364 source Stripe: bump major version * auto-bump connector version --------- Co-authored-by: Denys Davydov Co-authored-by: Octavia Squidington III --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-stripe/Dockerfile | 2 +- .../source_stripe/schemas/invoices.json | 29 +++++++++++++++++++ .../source_stripe/schemas/subscriptions.json | 4 +-- docs/integrations/sources/stripe.md | 1 + 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index b6c1946f1980d..dc095f42edbbe 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1704,7 +1704,7 @@ - name: Stripe sourceDefinitionId: e094cb9a-26de-4645-8761-65c0c425d1de dockerRepository: airbyte/source-stripe - dockerImageTag: 0.1.40 + dockerImageTag: 1.0.0 documentationUrl: https://docs.airbyte.com/integrations/sources/stripe icon: stripe.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 481e08abc4970..d7430a17d3214 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -14410,7 +14410,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-stripe:0.1.40" +- dockerImage: "airbyte/source-stripe:1.0.0" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/stripe" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-stripe/Dockerfile b/airbyte-integrations/connectors/source-stripe/Dockerfile index 9578c23dcd7b0..3c6f1cc6204e1 100644 --- a/airbyte-integrations/connectors/source-stripe/Dockerfile +++ b/airbyte-integrations/connectors/source-stripe/Dockerfile @@ -12,5 +12,5 @@ COPY main.py ./ ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.40 +LABEL io.airbyte.version=1.0.0 LABEL io.airbyte.name=airbyte/source-stripe diff --git a/airbyte-integrations/connectors/source-stripe/source_stripe/schemas/invoices.json b/airbyte-integrations/connectors/source-stripe/source_stripe/schemas/invoices.json index d268fcd3445a3..3024b188a9146 100644 --- a/airbyte-integrations/connectors/source-stripe/source_stripe/schemas/invoices.json +++ b/airbyte-integrations/connectors/source-stripe/source_stripe/schemas/invoices.json @@ -208,6 +208,35 @@ }, "status": { "type": ["null", "string"] + }, + "status_transitions": { + "type": "object", + "properties": { + "finalized_at": { + "type": [ + "null", + "integer" + ] + }, + "marked_uncollectible_at": { + "type": [ + "null", + "integer" + ] + }, + "paid_at": { + "type": [ + "null", + "integer" + ] + }, + "voided_at": { + "type": [ + "null", + "integer" + ] + } + } } } } diff --git a/airbyte-integrations/connectors/source-stripe/source_stripe/schemas/subscriptions.json b/airbyte-integrations/connectors/source-stripe/source_stripe/schemas/subscriptions.json index d97e5f7895f1e..6ce92c8b9ecc9 100644 --- a/airbyte-integrations/connectors/source-stripe/source_stripe/schemas/subscriptions.json +++ b/airbyte-integrations/connectors/source-stripe/source_stripe/schemas/subscriptions.json @@ -11,7 +11,7 @@ "livemode": { "type": ["null", "boolean"] }, - "start": { + "start_date": { "type": ["null", "integer"] }, "items": { @@ -115,7 +115,7 @@ "customer": { "type": ["null", "string"] }, - "start_date": { + "start": { "type": ["null", "integer"] }, "object": { diff --git a/docs/integrations/sources/stripe.md b/docs/integrations/sources/stripe.md index ce37f6e0a9269..0e1adfe9a435a 100644 --- a/docs/integrations/sources/stripe.md +++ b/docs/integrations/sources/stripe.md @@ -82,6 +82,7 @@ The Stripe connector should not run into Stripe API limitations under normal usa | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.0 | 2023-01-25 | [21858](https://github.com/airbytehq/airbyte/pull/21858) | Update the `Subscriptions` and `Invoices` stream schemas | | 0.1.40 | 2022-10-20 | [18228](https://github.com/airbytehq/airbyte/pull/18228) | Update the `Payment Intents` stream schema | | 0.1.39 | 2022-09-28 | [17304](https://github.com/airbytehq/airbyte/pull/17304) | Migrate to per-stream states. | | 0.1.38 | 2022-09-09 | [16537](https://github.com/airbytehq/airbyte/pull/16537) | Fix `redeem_by` field type for `customers` stream | From 819896ee1e40e000afc8cbffbd1eb8294ffcd6e2 Mon Sep 17 00:00:00 2001 From: Alex Birdsall Date: Fri, 27 Jan 2023 11:39:35 -0800 Subject: [PATCH 150/195] Replace try/catch with .catch (#21763) --- .../EnrollmentModal/useShowEnrollmentModal.tsx | 16 +++++++--------- .../packages/cloud/services/auth/AuthService.tsx | 7 ++----- .../components/EmailVerificationHint.tsx | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/useShowEnrollmentModal.tsx b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/useShowEnrollmentModal.tsx index bf1849e28d7a6..4f5ae8b59047d 100644 --- a/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/useShowEnrollmentModal.tsx +++ b/airbyte-webapp/src/packages/cloud/components/experiments/FreeConnectorProgram/EnrollmentModal/useShowEnrollmentModal.tsx @@ -19,15 +19,13 @@ export const useShowEnrollmentModal = () => { const { registerNotification } = useNotificationService(); const verifyEmail = () => - sendEmailVerification() - .then(() => { - registerNotification({ - id: "fcp/verify-email", - text: formatMessage({ id: "freeConnectorProgram.enrollmentModal.validationEmailConfirmation" }), - type: ToastType.INFO, - }); - }) - .catch(); // don't crash the page on error + sendEmailVerification().then(() => { + registerNotification({ + id: "fcp/verify-email", + text: formatMessage({ id: "freeConnectorProgram.enrollmentModal.validationEmailConfirmation" }), + type: ToastType.INFO, + }); + }); return { showEnrollmentModal: () => { diff --git a/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx b/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx index 2c2f62edd4c0b..549814e435db6 100644 --- a/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx +++ b/airbyte-webapp/src/packages/cloud/services/auth/AuthService.tsx @@ -245,9 +245,7 @@ export const AuthenticationProvider: React.FC> await authService.resetPassword(email); }, async sendEmailVerification(): Promise { - try { - await authService.sendEmailVerifiedLink(); - } catch (error) { + return authService.sendEmailVerifiedLink().catch((error) => { switch (error.code) { case AuthErrorCodes.NETWORK_REQUEST_FAILED: registerNotification({ @@ -276,8 +274,7 @@ export const AuthenticationProvider: React.FC> type: ToastType.ERROR, }); } - throw error; - } + }); }, async verifyEmail(code: string): Promise { await authService.confirmEmailVerify(code); diff --git a/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/EmailVerificationHint.tsx b/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/EmailVerificationHint.tsx index 1c1f02ebb0a2f..93345425b464e 100644 --- a/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/EmailVerificationHint.tsx +++ b/airbyte-webapp/src/packages/cloud/views/credits/CreditsPage/components/EmailVerificationHint.tsx @@ -31,7 +31,7 @@ export const EmailVerificationHint: React.FC = ({ className }) => { const onResendVerificationMail = async () => { // the shared error handling inside `sendEmailVerification` suffices - await sendEmailVerification().catch(); + await sendEmailVerification(); setIsEmailResend(true); }; From c0d39006a58338c7448e1bb5da7025e994c98aa9 Mon Sep 17 00:00:00 2001 From: Ryan Fu Date: Fri, 27 Jan 2023 11:59:56 -0800 Subject: [PATCH 151/195] Fixed mismatch spec variable and updates default value (#21890) * Fixed mismatch spec variable and updates default value * Updates spec default values * Bumps connector version and documentation * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../main/resources/seed/destination_definitions.yaml | 2 +- .../src/main/resources/seed/destination_specs.yaml | 10 +++++----- .../connectors/destination-redshift/Dockerfile | 2 +- .../redshift/RedshiftStagingS3Destination.java | 2 +- .../destination-redshift/src/main/resources/spec.json | 8 ++++---- docs/integrations/destinations/redshift.md | 3 ++- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml index 98f3542a3a1fe..01bc2e8eb9dc7 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_definitions.yaml @@ -290,7 +290,7 @@ - name: Redshift destinationDefinitionId: f7a7d195-377f-cf5b-70a5-be6b819019dc dockerRepository: airbyte/destination-redshift - dockerImageTag: 0.3.55 + dockerImageTag: 0.3.56 documentationUrl: https://docs.airbyte.com/integrations/destinations/redshift icon: redshift.svg normalizationConfig: diff --git a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml index 1ceff75d32cac..a383f60365bd2 100644 --- a/airbyte-config/init/src/main/resources/seed/destination_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/destination_specs.yaml @@ -5123,7 +5123,7 @@ supported_destination_sync_modes: - "overwrite" - "append" -- dockerImage: "airbyte/destination-redshift:0.3.55" +- dockerImage: "airbyte/destination-redshift:0.3.56" spec: documentationUrl: "https://docs.airbyte.com/integrations/destinations/redshift" connectionSpecification: @@ -5337,19 +5337,19 @@ \ or 256 bits. Leave blank to have Airbyte generate an ephemeral\ \ key for each sync." airbyte_secret: true - file_buffer_size: + file_buffer_count: title: "File Buffer Count" type: "integer" - minimum: 15 + minimum: 10 maximum: 50 - default: 15 + default: 10 description: "Number of file buffers allocated for writing data. Increasing\ \ this number is beneficial for connections using Change Data Capture\ \ (CDC) and up to the number of streams within a connection. Increasing\ \ the number of file buffers past the maximum number of streams\ \ has deteriorating effects" examples: - - "15" + - "10" supportsIncremental: true supportsNormalization: true supportsDBT: true diff --git a/airbyte-integrations/connectors/destination-redshift/Dockerfile b/airbyte-integrations/connectors/destination-redshift/Dockerfile index 5ca7be2d9b983..6a56861b7fa51 100644 --- a/airbyte-integrations/connectors/destination-redshift/Dockerfile +++ b/airbyte-integrations/connectors/destination-redshift/Dockerfile @@ -16,5 +16,5 @@ ENV APPLICATION destination-redshift COPY --from=build /airbyte /airbyte -LABEL io.airbyte.version=0.3.55 +LABEL io.airbyte.version=0.3.56 LABEL io.airbyte.name=airbyte/destination-redshift diff --git a/airbyte-integrations/connectors/destination-redshift/src/main/java/io/airbyte/integrations/destination/redshift/RedshiftStagingS3Destination.java b/airbyte-integrations/connectors/destination-redshift/src/main/java/io/airbyte/integrations/destination/redshift/RedshiftStagingS3Destination.java index f185235e4bf8f..6fc5d60710e80 100644 --- a/airbyte-integrations/connectors/destination-redshift/src/main/java/io/airbyte/integrations/destination/redshift/RedshiftStagingS3Destination.java +++ b/airbyte-integrations/connectors/destination-redshift/src/main/java/io/airbyte/integrations/destination/redshift/RedshiftStagingS3Destination.java @@ -170,7 +170,7 @@ public AirbyteMessageConsumer getConsumer(final JsonNode config, */ @VisibleForTesting public int getNumberOfFileBuffers(final JsonNode config) { - int numOfFileBuffers = 1; + int numOfFileBuffers = FileBuffer.DEFAULT_MAX_CONCURRENT_STREAM_IN_BUFFER; if (config.has(FileBuffer.FILE_BUFFER_COUNT_KEY)) { numOfFileBuffers = Math.min(config.get(FileBuffer.FILE_BUFFER_COUNT_KEY).asInt(), FileBuffer.MAX_CONCURRENT_STREAM_IN_BUFFER); } diff --git a/airbyte-integrations/connectors/destination-redshift/src/main/resources/spec.json b/airbyte-integrations/connectors/destination-redshift/src/main/resources/spec.json index 0e62601e81518..53c686b04f914 100644 --- a/airbyte-integrations/connectors/destination-redshift/src/main/resources/spec.json +++ b/airbyte-integrations/connectors/destination-redshift/src/main/resources/spec.json @@ -207,14 +207,14 @@ } ] }, - "file_buffer_size": { + "file_buffer_count": { "title": "File Buffer Count", "type": "integer", - "minimum": 15, + "minimum": 10, "maximum": 50, - "default": 15, + "default": 10, "description": "Number of file buffers allocated for writing data. Increasing this number is beneficial for connections using Change Data Capture (CDC) and up to the number of streams within a connection. Increasing the number of file buffers past the maximum number of streams has deteriorating effects", - "examples": ["15"] + "examples": ["10"] } } } diff --git a/docs/integrations/destinations/redshift.md b/docs/integrations/destinations/redshift.md index 0dbaf74cf3c82..aa20acc9d2760 100644 --- a/docs/integrations/destinations/redshift.md +++ b/docs/integrations/destinations/redshift.md @@ -141,10 +141,11 @@ Each stream will be output into its own raw table in Redshift. Each table will c | Version | Date | Pull Request | Subject | |:--------|:-----------|:-----------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 0.3.56 | 2023-01-26 | [\#21890](https://github.com/airbytehq/airbyte/pull/21890) | Fixed configurable parameter for number of file buffers | | 0.3.55 | 2023-01-26 | [\#20631](https://github.com/airbytehq/airbyte/pull/20631) | Added support for destination checkpointing with staging | | 0.3.54 | 2023-01-18 | [\#21087](https://github.com/airbytehq/airbyte/pull/21087) | Wrap Authentication Errors as Config Exceptions | | 0.3.53 | 2023-01-03 | [\#17273](https://github.com/airbytehq/airbyte/pull/17273) | Flatten JSON arrays to fix maximum size check for SUPER field | -| 0.3.52 | 2022-12-30 | [\#20879](https://github.com/airbytehq/airbyte/pull/20879) | Added configurable parameter for number of file buffers | +| 0.3.52 | 2022-12-30 | [\#20879](https://github.com/airbytehq/airbyte/pull/20879) | Added configurable parameter for number of file buffers (⛔ this version has a bug and will not work; use `0.3.56` instead) | | 0.3.51 | 2022-10-26 | [\#18434](https://github.com/airbytehq/airbyte/pull/18434) | Fix empty S3 bucket path handling | | 0.3.50 | 2022-09-14 | [\#15668](https://github.com/airbytehq/airbyte/pull/15668) | Wrap logs in AirbyteLogMessage | | 0.3.49 | 2022-09-01 | [\#16243](https://github.com/airbytehq/airbyte/pull/16243) | Fix Json to Avro conversion when there is field name clash from combined restrictions (`anyOf`, `oneOf`, `allOf` fields) | From ddfd82b164e3d7542e160ea4b9050a7dabc33d48 Mon Sep 17 00:00:00 2001 From: Benoit Moriceau Date: Fri, 27 Jan 2023 13:16:41 -0800 Subject: [PATCH 152/195] Remove unused methods (#21988) * Remove unused methods * Rename test variable --- .../JobCreationAndStatusUpdateActivity.java | 73 ------------ ...obCreationAndStatusUpdateActivityImpl.java | 99 ++++------------- ...obCreationAndStatusUpdateActivityTest.java | 104 ++++++------------ 3 files changed, 60 insertions(+), 216 deletions(-) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivity.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivity.java index 7fb500a28eb84..58c80be5e63a9 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivity.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivity.java @@ -53,24 +53,6 @@ class AttemptCreationInput { } - @Data - @NoArgsConstructor - @AllArgsConstructor - class AttemptCreationOutput { - - private Integer attemptId; - - } - - /** - * Create a new attempt for a given job ID - * - * @param input POJO containing the jobId - * @return A POJO containing the attemptId - */ - @ActivityMethod - AttemptCreationOutput createNewAttempt(AttemptCreationInput input) throws RetryableException; - @Data @NoArgsConstructor @AllArgsConstructor @@ -89,24 +71,6 @@ class AttemptNumberCreationOutput { @ActivityMethod AttemptNumberCreationOutput createNewAttemptNumber(AttemptCreationInput input) throws RetryableException; - @Data - @NoArgsConstructor - @AllArgsConstructor - class JobSuccessInput { - - private Long jobId; - private Integer attemptId; - private UUID connectionId; - private StandardSyncOutput standardSyncOutput; - - } - - /** - * Set a job status as successful - */ - @ActivityMethod - void jobSuccess(JobSuccessInput input); - @Data @NoArgsConstructor @AllArgsConstructor @@ -143,25 +107,6 @@ class JobFailureInput { @ActivityMethod void jobFailure(JobFailureInput input); - @Data - @NoArgsConstructor - @AllArgsConstructor - class AttemptFailureInput { - - private Long jobId; - private Integer attemptId; - private UUID connectionId; - private StandardSyncOutput standardSyncOutput; - private AttemptFailureSummary attemptFailureSummary; - - } - - /** - * Set an attempt status as failed - */ - @ActivityMethod - void attemptFailure(AttemptFailureInput input); - @Data @NoArgsConstructor @AllArgsConstructor @@ -181,24 +126,6 @@ class AttemptNumberFailureInput { @ActivityMethod void attemptFailureWithAttemptNumber(AttemptNumberFailureInput input); - @Data - @NoArgsConstructor - @AllArgsConstructor - class JobCancelledInput { - - private Long jobId; - private Integer attemptId; - private UUID connectionId; - private AttemptFailureSummary attemptFailureSummary; - - } - - /** - * Set a job status as cancelled - */ - @ActivityMethod - void jobCancelled(JobCancelledInput input); - @Data @NoArgsConstructor @AllArgsConstructor diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java index 862d2364bc555..9915ccbca2bcd 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityImpl.java @@ -196,27 +196,6 @@ private void emitSrcIdDstIdToReleaseStagesMetric(final UUID srcId, final UUID ds } } - @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) - @Override - public AttemptCreationOutput createNewAttempt(final AttemptCreationInput input) throws RetryableException { - try { - final long jobId = input.getJobId(); - ApmTraceUtils.addTagsToTrace(Map.of(JOB_ID_KEY, jobId)); - final Job job = jobPersistence.getJob(jobId); - - final WorkerRun workerRun = temporalWorkerRunFactory.create(job); - final Path logFilePath = workerRun.getJobRoot().resolve(LogClientSingleton.LOG_FILENAME); - final int persistedAttemptNumber = jobPersistence.createAttempt(jobId, logFilePath); - emitJobIdToReleaseStagesMetric(OssMetricsRegistry.ATTEMPT_CREATED_BY_RELEASE_STAGE, jobId); - emitAttemptCreatedEvent(job, persistedAttemptNumber); - - LogClientSingleton.getInstance().setJobMdc(workerEnvironment, logConfigs, workerRun.getJobRoot()); - return new AttemptCreationOutput(persistedAttemptNumber); - } catch (final IOException e) { - throw new RetryableException(e); - } - } - @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) @Override public AttemptNumberCreationOutput createNewAttemptNumber(final AttemptCreationInput input) throws RetryableException { @@ -240,19 +219,21 @@ public AttemptNumberCreationOutput createNewAttemptNumber(final AttemptCreationI @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) @Override - public void jobSuccess(final JobSuccessInput input) { + public void jobSuccessWithAttemptNumber(final JobSuccessInputWithAttemptNumber input) { + ApmTraceUtils.addTagsToTrace( + Map.of(ATTEMPT_NUMBER_KEY, input.getAttemptNumber(), CONNECTION_ID_KEY, input.getConnectionId(), JOB_ID_KEY, input.getJobId())); try { final long jobId = input.getJobId(); - final int attemptId = input.getAttemptId(); - ApmTraceUtils.addTagsToTrace(Map.of(ATTEMPT_NUMBER_KEY, attemptId, JOB_ID_KEY, jobId)); + final int attemptNumber = input.getAttemptNumber(); + ApmTraceUtils.addTagsToTrace(Map.of(ATTEMPT_NUMBER_KEY, attemptNumber, JOB_ID_KEY, jobId)); if (input.getStandardSyncOutput() != null) { final JobOutput jobOutput = new JobOutput().withSync(input.getStandardSyncOutput()); - jobPersistence.writeOutput(jobId, attemptId, jobOutput); + jobPersistence.writeOutput(jobId, attemptNumber, jobOutput); } else { - log.warn("The job {} doesn't have any output for the attempt {}", jobId, attemptId); + log.warn("The job {} doesn't have any output for the attempt {}", jobId, attemptNumber); } - jobPersistence.succeedAttempt(jobId, attemptId); + jobPersistence.succeedAttempt(jobId, attemptNumber); emitJobIdToReleaseStagesMetric(OssMetricsRegistry.ATTEMPT_SUCCEEDED_BY_RELEASE_STAGE, jobId); final Job job = jobPersistence.getJob(jobId); @@ -260,23 +241,11 @@ public void jobSuccess(final JobSuccessInput input) { emitJobIdToReleaseStagesMetric(OssMetricsRegistry.JOB_SUCCEEDED_BY_RELEASE_STAGE, jobId); trackCompletion(job, JobStatus.SUCCEEDED); } catch (final IOException e) { - trackCompletionForInternalFailure(input.getJobId(), input.getConnectionId(), input.getAttemptId(), JobStatus.SUCCEEDED, e); + trackCompletionForInternalFailure(input.getJobId(), input.getConnectionId(), input.getAttemptNumber(), JobStatus.SUCCEEDED, e); throw new RetryableException(e); } } - @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) - @Override - public void jobSuccessWithAttemptNumber(final JobSuccessInputWithAttemptNumber input) { - ApmTraceUtils.addTagsToTrace( - Map.of(ATTEMPT_NUMBER_KEY, input.getAttemptNumber(), CONNECTION_ID_KEY, input.getConnectionId(), JOB_ID_KEY, input.getJobId())); - jobSuccess(new JobSuccessInput( - input.getJobId(), - input.getAttemptNumber(), - input.getConnectionId(), - input.getStandardSyncOutput())); - } - @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) @Override public void jobFailure(final JobFailureInput input) { @@ -305,21 +274,24 @@ public void jobFailure(final JobFailureInput input) { @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) @Override - public void attemptFailure(final AttemptFailureInput input) { + public void attemptFailureWithAttemptNumber(final AttemptNumberFailureInput input) { + ApmTraceUtils.addTagsToTrace( + Map.of(ATTEMPT_NUMBER_KEY, input.getAttemptNumber(), CONNECTION_ID_KEY, input.getConnectionId(), JOB_ID_KEY, input.getJobId())); + try { - final int attemptId = input.getAttemptId(); + final int attemptNumber = input.getAttemptNumber(); final long jobId = input.getJobId(); final AttemptFailureSummary failureSummary = input.getAttemptFailureSummary(); - ApmTraceUtils.addTagsToTrace(Map.of(ATTEMPT_NUMBER_KEY, attemptId, JOB_ID_KEY, jobId)); + ApmTraceUtils.addTagsToTrace(Map.of(ATTEMPT_NUMBER_KEY, attemptNumber, JOB_ID_KEY, jobId)); traceFailures(failureSummary); - jobPersistence.failAttempt(jobId, attemptId); - jobPersistence.writeAttemptFailureSummary(jobId, attemptId, failureSummary); + jobPersistence.failAttempt(jobId, attemptNumber); + jobPersistence.writeAttemptFailureSummary(jobId, attemptNumber, failureSummary); if (input.getStandardSyncOutput() != null) { final JobOutput jobOutput = new JobOutput().withSync(input.getStandardSyncOutput()); - jobPersistence.writeOutput(jobId, attemptId, jobOutput); + jobPersistence.writeOutput(jobId, attemptNumber, jobOutput); } emitJobIdToReleaseStagesMetric(OssMetricsRegistry.ATTEMPT_FAILED_BY_RELEASE_STAGE, jobId); @@ -331,26 +303,16 @@ public void attemptFailure(final AttemptFailureInput input) { @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) @Override - public void attemptFailureWithAttemptNumber(final AttemptNumberFailureInput input) { + public void jobCancelledWithAttemptNumber(final JobCancelledInputWithAttemptNumber input) { ApmTraceUtils.addTagsToTrace( Map.of(ATTEMPT_NUMBER_KEY, input.getAttemptNumber(), CONNECTION_ID_KEY, input.getConnectionId(), JOB_ID_KEY, input.getJobId())); - attemptFailure(new AttemptFailureInput( - input.getJobId(), - input.getAttemptNumber(), - input.getConnectionId(), - input.getStandardSyncOutput(), - input.getAttemptFailureSummary())); - } - @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) - @Override - public void jobCancelled(final JobCancelledInput input) { try { final long jobId = input.getJobId(); - final int attemptId = input.getAttemptId(); - ApmTraceUtils.addTagsToTrace(Map.of(ATTEMPT_NUMBER_KEY, attemptId, JOB_ID_KEY, jobId)); - jobPersistence.failAttempt(jobId, attemptId); - jobPersistence.writeAttemptFailureSummary(jobId, attemptId, input.getAttemptFailureSummary()); + final int attemptNumber = input.getAttemptNumber(); + ApmTraceUtils.addTagsToTrace(Map.of(ATTEMPT_NUMBER_KEY, attemptNumber, JOB_ID_KEY, jobId)); + jobPersistence.failAttempt(jobId, attemptNumber); + jobPersistence.writeAttemptFailureSummary(jobId, attemptNumber, input.getAttemptFailureSummary()); jobPersistence.cancelJob(jobId); final Job job = jobPersistence.getJob(jobId); @@ -358,24 +320,11 @@ public void jobCancelled(final JobCancelledInput input) { jobNotifier.failJob("Job was cancelled", job); trackCompletion(job, JobStatus.FAILED); } catch (final IOException e) { - trackCompletionForInternalFailure(input.getJobId(), input.getConnectionId(), input.getAttemptId(), JobStatus.FAILED, e); + trackCompletionForInternalFailure(input.getJobId(), input.getConnectionId(), input.getAttemptNumber(), JobStatus.FAILED, e); throw new RetryableException(e); } } - @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) - @Override - public void jobCancelledWithAttemptNumber(final JobCancelledInputWithAttemptNumber input) { - ApmTraceUtils.addTagsToTrace( - Map.of(ATTEMPT_NUMBER_KEY, input.getAttemptNumber(), CONNECTION_ID_KEY, input.getConnectionId(), JOB_ID_KEY, input.getJobId())); - - jobCancelled(new JobCancelledInput( - input.getJobId(), - input.getAttemptNumber(), - input.getConnectionId(), - input.getAttemptFailureSummary())); - } - @Trace(operationName = ACTIVITY_TRACE_OPERATION_NAME) @Override public void reportJobStart(final ReportJobStartInput input) { diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java index 0efcb27e5c6d3..bf95d39b87962 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/activities/JobCreationAndStatusUpdateActivityTest.java @@ -51,15 +51,11 @@ import io.airbyte.workers.run.TemporalWorkerRunFactory; import io.airbyte.workers.run.WorkerRun; import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.AttemptCreationInput; -import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.AttemptCreationOutput; -import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.AttemptFailureInput; import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.AttemptNumberCreationOutput; import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.EnsureCleanJobStateInput; -import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.JobCancelledInput; import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.JobCreationInput; import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.JobCreationOutput; import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.JobFailureInput; -import io.airbyte.workers.temporal.scheduling.activities.JobCreationAndStatusUpdateActivity.JobSuccessInput; import java.io.IOException; import java.nio.file.Path; import java.util.Collections; @@ -133,8 +129,8 @@ class JobCreationAndStatusUpdateActivityTest { private static final Version DESTINATION_PROTOCOL_VERSION = new Version("0.4.0"); private static final long JOB_ID = 123L; private static final long PREVIOUS_JOB_ID = 120L; - private static final int ATTEMPT_ID = 0; - private static final int ATTEMPT_NUMBER = 1; + private static final int ATTEMPT_NUMBER = 0; + private static final int ATTEMPT_NUMBER_1 = 1; private static final StreamDescriptor STREAM_DESCRIPTOR1 = new StreamDescriptor().withName("stream 1").withNamespace("namespace 1"); private static final StreamDescriptor STREAM_DESCRIPTOR2 = new StreamDescriptor().withName("stream 2").withNamespace("namespace 2"); private static final String TEST_EXCEPTION_MESSAGE = "test"; @@ -196,42 +192,6 @@ void createResetJob() throws JsonValidationException, ConfigNotFoundException, I Assertions.assertThat(output.getJobId()).isEqualTo(JOB_ID); } - @Test - @DisplayName("Test attempt creation") - void createAttempt() throws IOException { - final Job mJob = Mockito.mock(Job.class); - - Mockito.when(mJobPersistence.getJob(JOB_ID)) - .thenReturn(mJob); - - final WorkerRun mWorkerRun = Mockito.mock(WorkerRun.class); - - Mockito.when(mTemporalWorkerRunFactory.create(mJob)) - .thenReturn(mWorkerRun); - - final Path mPath = Mockito.mock(Path.class); - final Path path = Path.of("test"); - Mockito.when(mPath.resolve(Mockito.anyString())) - .thenReturn(path); - Mockito.when(mWorkerRun.getJobRoot()) - .thenReturn(mPath); - - Mockito.when(mJobPersistence.createAttempt(JOB_ID, path)) - .thenReturn(ATTEMPT_ID); - - final LogClientSingleton mLogClientSingleton = Mockito.mock(LogClientSingleton.class); - try (final MockedStatic utilities = Mockito.mockStatic(LogClientSingleton.class)) { - utilities.when(() -> LogClientSingleton.getInstance()) - .thenReturn(mLogClientSingleton); - - final AttemptCreationOutput output = jobCreationAndStatusUpdateActivity.createNewAttempt(new AttemptCreationInput( - JOB_ID)); - - verify(mLogClientSingleton).setJobMdc(mWorkerEnvironment, mLogConfigs, mPath); - Assertions.assertThat(output.getAttemptId()).isEqualTo(ATTEMPT_ID); - } - } - @Test void isLastJobOrAttemptFailureTrueTest() throws Exception { final int activeAttemptNumber = 0; @@ -299,7 +259,7 @@ void createAttemptThrowException() throws IOException { Mockito.when(mJobPersistence.getJob(JOB_ID)) .thenThrow(new IOException()); - Assertions.assertThatThrownBy(() -> jobCreationAndStatusUpdateActivity.createNewAttempt(new AttemptCreationInput( + Assertions.assertThatThrownBy(() -> jobCreationAndStatusUpdateActivity.createNewAttemptNumber(new AttemptCreationInput( JOB_ID))) .isInstanceOf(RetryableException.class) .hasCauseInstanceOf(IOException.class); @@ -326,7 +286,7 @@ void createAttemptNumber() throws IOException { .thenReturn(mPath); Mockito.when(mJobPersistence.createAttempt(JOB_ID, path)) - .thenReturn(ATTEMPT_NUMBER); + .thenReturn(ATTEMPT_NUMBER_1); final LogClientSingleton mLogClientSingleton = Mockito.mock(LogClientSingleton.class); try (final MockedStatic utilities = Mockito.mockStatic(LogClientSingleton.class)) { @@ -337,7 +297,7 @@ void createAttemptNumber() throws IOException { JOB_ID)); verify(mLogClientSingleton).setJobMdc(mWorkerEnvironment, mLogConfigs, mPath); - Assertions.assertThat(output.getAttemptNumber()).isEqualTo(ATTEMPT_NUMBER); + Assertions.assertThat(output.getAttemptNumber()).isEqualTo(ATTEMPT_NUMBER_1); } } @@ -360,10 +320,11 @@ class Update { @Test void setJobSuccess() throws IOException { - jobCreationAndStatusUpdateActivity.jobSuccess(new JobSuccessInput(JOB_ID, ATTEMPT_ID, CONNECTION_ID, standardSyncOutput)); + jobCreationAndStatusUpdateActivity.jobSuccessWithAttemptNumber( + new JobCreationAndStatusUpdateActivity.JobSuccessInputWithAttemptNumber(JOB_ID, ATTEMPT_NUMBER, CONNECTION_ID, standardSyncOutput)); - verify(mJobPersistence).writeOutput(JOB_ID, ATTEMPT_ID, jobOutput); - verify(mJobPersistence).succeedAttempt(JOB_ID, ATTEMPT_ID); + verify(mJobPersistence).writeOutput(JOB_ID, ATTEMPT_NUMBER, jobOutput); + verify(mJobPersistence).succeedAttempt(JOB_ID, ATTEMPT_NUMBER); verify(mJobNotifier).successJob(Mockito.any()); verify(mJobtracker).trackSync(Mockito.any(), eq(JobState.SUCCEEDED)); } @@ -372,13 +333,15 @@ void setJobSuccess() throws IOException { void setJobSuccessWrapException() throws IOException { final IOException exception = new IOException(TEST_EXCEPTION_MESSAGE); Mockito.doThrow(exception) - .when(mJobPersistence).succeedAttempt(JOB_ID, ATTEMPT_ID); + .when(mJobPersistence).succeedAttempt(JOB_ID, ATTEMPT_NUMBER); - Assertions.assertThatThrownBy(() -> jobCreationAndStatusUpdateActivity.jobSuccess(new JobSuccessInput(JOB_ID, ATTEMPT_ID, CONNECTION_ID, null))) + Assertions + .assertThatThrownBy(() -> jobCreationAndStatusUpdateActivity.jobSuccessWithAttemptNumber( + new JobCreationAndStatusUpdateActivity.JobSuccessInputWithAttemptNumber(JOB_ID, ATTEMPT_NUMBER, CONNECTION_ID, null))) .isInstanceOf(RetryableException.class) .hasCauseInstanceOf(IOException.class); - verify(mJobtracker, times(1)).trackSyncForInternalFailure(JOB_ID, CONNECTION_ID, ATTEMPT_ID, JobState.SUCCEEDED, exception); + verify(mJobtracker, times(1)).trackSyncForInternalFailure(JOB_ID, CONNECTION_ID, ATTEMPT_NUMBER, JobState.SUCCEEDED, exception); } @Test @@ -415,11 +378,11 @@ void setJobFailureWrapException() throws IOException { .when(mJobPersistence).failJob(JOB_ID); Assertions - .assertThatThrownBy(() -> jobCreationAndStatusUpdateActivity.jobFailure(new JobFailureInput(JOB_ID, ATTEMPT_NUMBER, CONNECTION_ID, ""))) + .assertThatThrownBy(() -> jobCreationAndStatusUpdateActivity.jobFailure(new JobFailureInput(JOB_ID, ATTEMPT_NUMBER_1, CONNECTION_ID, ""))) .isInstanceOf(RetryableException.class) .hasCauseInstanceOf(IOException.class); - verify(mJobtracker, times(1)).trackSyncForInternalFailure(JOB_ID, CONNECTION_ID, ATTEMPT_NUMBER, JobState.FAILED, exception); + verify(mJobtracker, times(1)).trackSyncForInternalFailure(JOB_ID, CONNECTION_ID, ATTEMPT_NUMBER_1, JobState.FAILED, exception); } @Test @@ -448,45 +411,49 @@ void setJobFailureWithNullJobSyncConfig() throws IOException { @Test void setAttemptFailure() throws IOException { jobCreationAndStatusUpdateActivity - .attemptFailure(new AttemptFailureInput(JOB_ID, ATTEMPT_ID, CONNECTION_ID, standardSyncOutput, failureSummary)); + .attemptFailureWithAttemptNumber(new JobCreationAndStatusUpdateActivity.AttemptNumberFailureInput(JOB_ID, ATTEMPT_NUMBER, CONNECTION_ID, + standardSyncOutput, failureSummary)); - verify(mJobPersistence).failAttempt(JOB_ID, ATTEMPT_ID); - verify(mJobPersistence).writeOutput(JOB_ID, ATTEMPT_ID, jobOutput); - verify(mJobPersistence).writeAttemptFailureSummary(JOB_ID, ATTEMPT_ID, failureSummary); + verify(mJobPersistence).failAttempt(JOB_ID, ATTEMPT_NUMBER); + verify(mJobPersistence).writeOutput(JOB_ID, ATTEMPT_NUMBER, jobOutput); + verify(mJobPersistence).writeAttemptFailureSummary(JOB_ID, ATTEMPT_NUMBER, failureSummary); } @Test void setAttemptFailureManuallyTerminated() throws IOException { jobCreationAndStatusUpdateActivity - .attemptFailure(new AttemptFailureInput(JOB_ID, ATTEMPT_ID, CONNECTION_ID, standardSyncOutput, null)); + .attemptFailureWithAttemptNumber( + new JobCreationAndStatusUpdateActivity.AttemptNumberFailureInput(JOB_ID, ATTEMPT_NUMBER, CONNECTION_ID, standardSyncOutput, null)); - verify(mJobPersistence).failAttempt(JOB_ID, ATTEMPT_ID); - verify(mJobPersistence).writeOutput(JOB_ID, ATTEMPT_ID, jobOutput); - verify(mJobPersistence).writeAttemptFailureSummary(JOB_ID, ATTEMPT_ID, null); + verify(mJobPersistence).failAttempt(JOB_ID, ATTEMPT_NUMBER); + verify(mJobPersistence).writeOutput(JOB_ID, ATTEMPT_NUMBER, jobOutput); + verify(mJobPersistence).writeAttemptFailureSummary(JOB_ID, ATTEMPT_NUMBER, null); } @Test void setAttemptFailureWrapException() throws IOException { final Exception exception = new IOException(TEST_EXCEPTION_MESSAGE); Mockito.doThrow(exception) - .when(mJobPersistence).failAttempt(JOB_ID, ATTEMPT_ID); + .when(mJobPersistence).failAttempt(JOB_ID, ATTEMPT_NUMBER); Assertions .assertThatThrownBy( () -> jobCreationAndStatusUpdateActivity - .attemptFailure(new AttemptFailureInput(JOB_ID, ATTEMPT_ID, CONNECTION_ID, null, failureSummary))) + .attemptFailureWithAttemptNumber( + new JobCreationAndStatusUpdateActivity.AttemptNumberFailureInput(JOB_ID, ATTEMPT_NUMBER, CONNECTION_ID, null, failureSummary))) .isInstanceOf(RetryableException.class) .hasCauseInstanceOf(IOException.class); } @Test void setJobCancelled() throws IOException { - jobCreationAndStatusUpdateActivity.jobCancelled(new JobCancelledInput(JOB_ID, ATTEMPT_ID, CONNECTION_ID, failureSummary)); + jobCreationAndStatusUpdateActivity.jobCancelledWithAttemptNumber( + new JobCreationAndStatusUpdateActivity.JobCancelledInputWithAttemptNumber(JOB_ID, ATTEMPT_NUMBER, CONNECTION_ID, failureSummary)); // attempt must be failed before job is cancelled, or else job state machine is not respected final InOrder orderVerifier = Mockito.inOrder(mJobPersistence); - orderVerifier.verify(mJobPersistence).failAttempt(JOB_ID, ATTEMPT_ID); - orderVerifier.verify(mJobPersistence).writeAttemptFailureSummary(JOB_ID, ATTEMPT_ID, failureSummary); + orderVerifier.verify(mJobPersistence).failAttempt(JOB_ID, ATTEMPT_NUMBER); + orderVerifier.verify(mJobPersistence).writeAttemptFailureSummary(JOB_ID, ATTEMPT_NUMBER, failureSummary); orderVerifier.verify(mJobPersistence).cancelJob(JOB_ID); } @@ -497,11 +464,12 @@ void setJobCancelledWrapException() throws IOException { .when(mJobPersistence).cancelJob(JOB_ID); Assertions - .assertThatThrownBy(() -> jobCreationAndStatusUpdateActivity.jobCancelled(new JobCancelledInput(JOB_ID, ATTEMPT_ID, CONNECTION_ID, null))) + .assertThatThrownBy(() -> jobCreationAndStatusUpdateActivity.jobCancelledWithAttemptNumber( + new JobCreationAndStatusUpdateActivity.JobCancelledInputWithAttemptNumber(JOB_ID, ATTEMPT_NUMBER, CONNECTION_ID, null))) .isInstanceOf(RetryableException.class) .hasCauseInstanceOf(IOException.class); - verify(mJobtracker, times(1)).trackSyncForInternalFailure(JOB_ID, CONNECTION_ID, ATTEMPT_ID, JobState.FAILED, exception); + verify(mJobtracker, times(1)).trackSyncForInternalFailure(JOB_ID, CONNECTION_ID, ATTEMPT_NUMBER, JobState.FAILED, exception); } @Test From daf58553498b85897e9ff9cff6775640afcc6491 Mon Sep 17 00:00:00 2001 From: Joey Marshment-Howell Date: Sat, 28 Jan 2023 00:58:27 +0100 Subject: [PATCH 153/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=94=A7=20Add=20typ?= =?UTF-8?q?escript=20version=20to=20VSCode=20settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index e52044ed1069b..b9d43a333b925 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -41,5 +41,6 @@ "editor.codeActionsOnSave": { "source.fixAll.stylelint": true } - } + }, + "typescript.tsdk": "./airbyte-webapp/node_modules/typescript/lib" } From 1ee88190c300421c63ac18ce64a6047a9673b2a8 Mon Sep 17 00:00:00 2001 From: Anne <102554163+alovew@users.noreply.github.com> Date: Fri, 27 Jan 2023 16:08:37 -0800 Subject: [PATCH 154/195] Use discoverActivityOptions for refresh schema activity (#21936) * Use discoverActivityOptions for refresh schema activity Co-authored-by: benmoriceau --- .../workers/temporal/sync/SyncWorkflowImpl.java | 3 +-- .../temporal/scheduling/WorkflowReplayingTest.java | 4 +++- .../workers/temporal/sync/SyncWorkflowTest.java | 13 ++++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java index 0aa8eb8e9dc61..df395df38f644 100644 --- a/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java +++ b/airbyte-workers/src/main/java/io/airbyte/workers/temporal/sync/SyncWorkflowImpl.java @@ -49,7 +49,6 @@ public class SyncWorkflowImpl implements SyncWorkflow { private static final int NORMALIZATION_SUMMARY_CHECK_CURRENT_VERSION = 1; private static final String AUTO_DETECT_SCHEMA_TAG = "auto_detect_schema"; private static final int AUTO_DETECT_SCHEMA_VERSION = 2; - @TemporalActivityStub(activityOptionsBeanName = "longRunActivityOptions") private ReplicationActivity replicationActivity; @TemporalActivityStub(activityOptionsBeanName = "longRunActivityOptions") @@ -62,7 +61,7 @@ public class SyncWorkflowImpl implements SyncWorkflow { private NormalizationSummaryCheckActivity normalizationSummaryCheckActivity; @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") private WebhookOperationActivity webhookOperationActivity; - @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") + @TemporalActivityStub(activityOptionsBeanName = "discoveryActivityOptions") private RefreshSchemaActivity refreshSchemaActivity; @TemporalActivityStub(activityOptionsBeanName = "shortActivityOptions") private ConfigFetchActivity configFetchActivity; diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/WorkflowReplayingTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/WorkflowReplayingTest.java index 6898c1f1e9a4f..68532a5dc6541 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/WorkflowReplayingTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/scheduling/WorkflowReplayingTest.java @@ -41,8 +41,10 @@ void setUp() { final BeanRegistration shortActivityOptionsBeanRegistration = getActivityOptionBeanRegistration("shortActivityOptions", activityOptions); final BeanRegistration longActivityOptionsBeanRegistration = getActivityOptionBeanRegistration("longRunActivityOptions", activityOptions); + final BeanRegistration discoveryActivityOptionsBeanRegistration = getActivityOptionBeanRegistration("discoveryActivityOptions", activityOptions); - temporalProxyHelper = new TemporalProxyHelper(List.of(shortActivityOptionsBeanRegistration, longActivityOptionsBeanRegistration)); + temporalProxyHelper = new TemporalProxyHelper( + List.of(shortActivityOptionsBeanRegistration, longActivityOptionsBeanRegistration, discoveryActivityOptionsBeanRegistration)); } @Test diff --git a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java index 9a39dd0b9a827..5f816f76c040e 100644 --- a/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java +++ b/airbyte-workers/src/test/java/io/airbyte/workers/temporal/sync/SyncWorkflowTest.java @@ -116,6 +116,8 @@ class SyncWorkflowTest { private NormalizationSummary normalizationSummary; private ActivityOptions longActivityOptions; private ActivityOptions shortActivityOptions; + + private ActivityOptions discoveryActivityOptions; private TemporalProxyHelper temporalProxyHelper; @BeforeEach @@ -177,6 +179,9 @@ void setUp() { .setMaximumInterval(Duration.ofSeconds(600)) .build()) .build(); + discoveryActivityOptions = ActivityOptions.newBuilder() + .setStartToCloseTimeout(Duration.ofSeconds(360)) + .build(); final BeanIdentifier longActivitiesBeanIdentifier = mock(BeanIdentifier.class); final BeanRegistration longActivityOptionsBeanRegistration = mock(BeanRegistration.class); @@ -188,7 +193,13 @@ void setUp() { when(shortActivitiesBeanIdentifier.getName()).thenReturn("shortActivityOptions"); when(shortActivityOptionsBeanRegistration.getIdentifier()).thenReturn(shortActivitiesBeanIdentifier); when(shortActivityOptionsBeanRegistration.getBean()).thenReturn(shortActivityOptions); - temporalProxyHelper = new TemporalProxyHelper(List.of(longActivityOptionsBeanRegistration, shortActivityOptionsBeanRegistration)); + final BeanIdentifier discoveryActivityBeanIdentifier = mock(BeanIdentifier.class); + final BeanRegistration discoveryActivityOptionsBeanRegistration = mock(BeanRegistration.class); + when(discoveryActivityBeanIdentifier.getName()).thenReturn("discoveryActivityOptions"); + when(discoveryActivityOptionsBeanRegistration.getIdentifier()).thenReturn(discoveryActivityBeanIdentifier); + when(discoveryActivityOptionsBeanRegistration.getBean()).thenReturn(discoveryActivityOptions); + temporalProxyHelper = new TemporalProxyHelper( + List.of(longActivityOptionsBeanRegistration, shortActivityOptionsBeanRegistration, discoveryActivityOptionsBeanRegistration)); syncWorker.registerWorkflowImplementationTypes(temporalProxyHelper.proxyWorkflowClass(SyncWorkflowImpl.class)); } From d60a1ec51d5ddd0315c882b8e056032569f8f26f Mon Sep 17 00:00:00 2001 From: Octavia Squidington III <90398440+octavia-squidington-iii@users.noreply.github.com> Date: Sat, 28 Jan 2023 01:44:26 +0100 Subject: [PATCH 155/195] Bump Airbyte version from 0.40.29 to 0.40.30 (#22045) Co-authored-by: lmossman --- .bumpversion.cfg | 2 +- .env | 2 +- airbyte-bootloader/Dockerfile | 2 +- airbyte-connector-builder-server/Dockerfile | 2 +- airbyte-connector-builder-server/setup.py | 2 +- airbyte-container-orchestrator/Dockerfile | 2 +- airbyte-cron/Dockerfile | 2 +- airbyte-metrics/reporter/Dockerfile | 2 +- airbyte-proxy/Dockerfile | 2 +- airbyte-server/Dockerfile | 2 +- airbyte-webapp/package-lock.json | 4 ++-- airbyte-webapp/package.json | 2 +- airbyte-workers/Dockerfile | 2 +- charts/airbyte-bootloader/Chart.yaml | 2 +- charts/airbyte-connector-builder-server/Chart.yaml | 2 +- charts/airbyte-cron/Chart.yaml | 2 +- charts/airbyte-server/Chart.yaml | 2 +- charts/airbyte-temporal/Chart.yaml | 2 +- charts/airbyte-webapp/Chart.yaml | 2 +- charts/airbyte-worker/Chart.yaml | 2 +- charts/airbyte/Chart.yaml | 2 +- charts/airbyte/README.md | 2 +- docs/operator-guides/upgrading-airbyte.md | 4 ++-- kube/overlays/stable-with-resource-limits/.env | 2 +- .../stable-with-resource-limits/kustomization.yaml | 14 +++++++------- kube/overlays/stable/.env | 2 +- kube/overlays/stable/kustomization.yaml | 14 +++++++------- octavia-cli/Dockerfile | 2 +- octavia-cli/README.md | 4 ++-- octavia-cli/install.sh | 2 +- octavia-cli/setup.py | 2 +- 31 files changed, 46 insertions(+), 46 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index d90909974fa2f..21b4e9d308a17 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.40.29 +current_version = 0.40.30 commit = False tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-[a-z]+)? diff --git a/.env b/.env index f15310773da31..93f952831c952 100644 --- a/.env +++ b/.env @@ -10,7 +10,7 @@ ### SHARED ### -VERSION=0.40.29 +VERSION=0.40.30 # When using the airbyte-db via default docker image CONFIG_ROOT=/data diff --git a/airbyte-bootloader/Dockerfile b/airbyte-bootloader/Dockerfile index 03c0a5aabee8c..54f97849b8c7e 100644 --- a/airbyte-bootloader/Dockerfile +++ b/airbyte-bootloader/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} -ARG VERSION=0.40.29 +ARG VERSION=0.40.30 ENV APPLICATION airbyte-bootloader ENV VERSION ${VERSION} diff --git a/airbyte-connector-builder-server/Dockerfile b/airbyte-connector-builder-server/Dockerfile index 7a1ef94f51187..a85fb70e69717 100644 --- a/airbyte-connector-builder-server/Dockerfile +++ b/airbyte-connector-builder-server/Dockerfile @@ -10,5 +10,5 @@ RUN pip install --no-cache-dir . ENTRYPOINT ["uvicorn", "connector_builder.entrypoint:app", "--host", "0.0.0.0", "--port", "80"] -LABEL io.airbyte.version=0.40.29 +LABEL io.airbyte.version=0.40.30 LABEL io.airbyte.name=airbyte/connector-builder-server diff --git a/airbyte-connector-builder-server/setup.py b/airbyte-connector-builder-server/setup.py index dc8c94871803b..6b0738fc69f5f 100644 --- a/airbyte-connector-builder-server/setup.py +++ b/airbyte-connector-builder-server/setup.py @@ -14,7 +14,7 @@ setup( name="connector-builder-server", - version="0.40.29", + version="0.40.30", description="", long_description=README, author="Airbyte", diff --git a/airbyte-container-orchestrator/Dockerfile b/airbyte-container-orchestrator/Dockerfile index 107ff2405590a..b70efb99d8ec1 100644 --- a/airbyte-container-orchestrator/Dockerfile +++ b/airbyte-container-orchestrator/Dockerfile @@ -10,7 +10,7 @@ RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/s && chmod +x kubectl && mv kubectl /usr/local/bin/ # Don't change this manually. Bump version expects to make moves based on this string -ARG VERSION=0.40.29 +ARG VERSION=0.40.30 ENV APPLICATION airbyte-container-orchestrator ENV VERSION=${VERSION} diff --git a/airbyte-cron/Dockerfile b/airbyte-cron/Dockerfile index 99723a70bef39..cae47e8b8ec48 100644 --- a/airbyte-cron/Dockerfile +++ b/airbyte-cron/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} AS cron -ARG VERSION=0.40.29 +ARG VERSION=0.40.30 ENV APPLICATION airbyte-cron ENV VERSION ${VERSION} diff --git a/airbyte-metrics/reporter/Dockerfile b/airbyte-metrics/reporter/Dockerfile index d11bac0790585..24bfbf28f8d79 100644 --- a/airbyte-metrics/reporter/Dockerfile +++ b/airbyte-metrics/reporter/Dockerfile @@ -1,7 +1,7 @@ ARG JDK_IMAGE=airbyte/airbyte-base-java-image:1.0 FROM ${JDK_IMAGE} AS metrics-reporter -ARG VERSION=0.40.29 +ARG VERSION=0.40.30 ENV APPLICATION airbyte-metrics-reporter ENV VERSION ${VERSION} diff --git a/airbyte-proxy/Dockerfile b/airbyte-proxy/Dockerfile index 6f8e67698b002..83bfbd84e9bd1 100644 --- a/airbyte-proxy/Dockerfile +++ b/airbyte-proxy/Dockerfile @@ -2,7 +2,7 @@ FROM nginx:latest -ARG VERSION=0.40.29 +ARG VERSION=0.40.30 ENV APPLICATION airbyte-proxy ENV VERSION ${VERSION} diff --git a/airbyte-server/Dockerfile b/airbyte-server/Dockerfile index 6cbaac749beec..bcb370cc6c326 100644 --- a/airbyte-server/Dockerfile +++ b/airbyte-server/Dockerfile @@ -3,7 +3,7 @@ FROM ${JDK_IMAGE} AS server EXPOSE 8000 -ARG VERSION=0.40.29 +ARG VERSION=0.40.30 ENV APPLICATION airbyte-server ENV VERSION ${VERSION} diff --git a/airbyte-webapp/package-lock.json b/airbyte-webapp/package-lock.json index 6cfb14b34efbd..44d216ffbf96a 100644 --- a/airbyte-webapp/package-lock.json +++ b/airbyte-webapp/package-lock.json @@ -1,12 +1,12 @@ { "name": "airbyte-webapp", - "version": "0.40.29", + "version": "0.40.30", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "airbyte-webapp", - "version": "0.40.29", + "version": "0.40.30", "dependencies": { "@datadog/browser-rum": "^4.21.2", "@floating-ui/react-dom": "^1.0.0", diff --git a/airbyte-webapp/package.json b/airbyte-webapp/package.json index a9fbf302d1525..674b844bb9578 100644 --- a/airbyte-webapp/package.json +++ b/airbyte-webapp/package.json @@ -1,6 +1,6 @@ { "name": "airbyte-webapp", - "version": "0.40.29", + "version": "0.40.30", "private": true, "engines": { "node": "16.18.1" diff --git a/airbyte-workers/Dockerfile b/airbyte-workers/Dockerfile index 98ac54b5412a7..ca5110740befc 100644 --- a/airbyte-workers/Dockerfile +++ b/airbyte-workers/Dockerfile @@ -10,7 +10,7 @@ RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/s && chmod +x kubectl && mv kubectl /usr/local/bin/ # Don't change this manually. Bump version expects to make moves based on this string -ARG VERSION=0.40.29 +ARG VERSION=0.40.30 ENV APPLICATION airbyte-workers ENV VERSION ${VERSION} diff --git a/charts/airbyte-bootloader/Chart.yaml b/charts/airbyte-bootloader/Chart.yaml index 67e61b2c97f14..d96400b4020d8 100644 --- a/charts/airbyte-bootloader/Chart.yaml +++ b/charts/airbyte-bootloader/Chart.yaml @@ -22,7 +22,7 @@ version: "0.43.22" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.29" +appVersion: "0.40.30" dependencies: - name: common diff --git a/charts/airbyte-connector-builder-server/Chart.yaml b/charts/airbyte-connector-builder-server/Chart.yaml index 19a92c39c15dd..b57727174aa77 100644 --- a/charts/airbyte-connector-builder-server/Chart.yaml +++ b/charts/airbyte-connector-builder-server/Chart.yaml @@ -21,7 +21,7 @@ version: "0.43.22" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.29" +appVersion: "0.40.30" dependencies: - name: common diff --git a/charts/airbyte-cron/Chart.yaml b/charts/airbyte-cron/Chart.yaml index 263dd7e6f788e..5fafcb8a6b6bd 100644 --- a/charts/airbyte-cron/Chart.yaml +++ b/charts/airbyte-cron/Chart.yaml @@ -21,7 +21,7 @@ version: 0.1.1 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.29" +appVersion: "0.40.30" dependencies: - name: common diff --git a/charts/airbyte-server/Chart.yaml b/charts/airbyte-server/Chart.yaml index cbdb3d02757cf..6950b9691a472 100644 --- a/charts/airbyte-server/Chart.yaml +++ b/charts/airbyte-server/Chart.yaml @@ -21,7 +21,7 @@ version: "0.43.22" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.29" +appVersion: "0.40.30" dependencies: - name: common diff --git a/charts/airbyte-temporal/Chart.yaml b/charts/airbyte-temporal/Chart.yaml index 867970f84cc55..51a2cb8a8c130 100644 --- a/charts/airbyte-temporal/Chart.yaml +++ b/charts/airbyte-temporal/Chart.yaml @@ -22,7 +22,7 @@ version: "0.43.22" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.29" +appVersion: "0.40.30" dependencies: - name: common diff --git a/charts/airbyte-webapp/Chart.yaml b/charts/airbyte-webapp/Chart.yaml index 89a11c3e6ce49..205e93b1f48a1 100644 --- a/charts/airbyte-webapp/Chart.yaml +++ b/charts/airbyte-webapp/Chart.yaml @@ -22,7 +22,7 @@ version: "0.43.22" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.29" +appVersion: "0.40.30" dependencies: - name: common diff --git a/charts/airbyte-worker/Chart.yaml b/charts/airbyte-worker/Chart.yaml index 11788d5eea793..256eeae43dd9a 100644 --- a/charts/airbyte-worker/Chart.yaml +++ b/charts/airbyte-worker/Chart.yaml @@ -22,7 +22,7 @@ version: "0.43.22" # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.29" +appVersion: "0.40.30" dependencies: - name: common diff --git a/charts/airbyte/Chart.yaml b/charts/airbyte/Chart.yaml index 0e0cab4ce4905..bbb7c173c5d8d 100644 --- a/charts/airbyte/Chart.yaml +++ b/charts/airbyte/Chart.yaml @@ -21,7 +21,7 @@ version: 0.43.22 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.40.29" +appVersion: "0.40.30" dependencies: - name: common diff --git a/charts/airbyte/README.md b/charts/airbyte/README.md index b816e5db12fe2..b24c5a884640d 100644 --- a/charts/airbyte/README.md +++ b/charts/airbyte/README.md @@ -250,7 +250,7 @@ Helm chart to deploy airbyte | worker.hpa.enabled | bool | `false` | | | worker.image.pullPolicy | string | `"IfNotPresent"` | | | worker.image.repository | string | `"airbyte/worker"` | | -| worker.image.tag | string | `"0.40.29"` | | +| worker.image.tag | string | `"0.40.30"` | | | worker.livenessProbe.enabled | bool | `true` | | | worker.livenessProbe.failureThreshold | int | `3` | | | worker.livenessProbe.initialDelaySeconds | int | `30` | | diff --git a/docs/operator-guides/upgrading-airbyte.md b/docs/operator-guides/upgrading-airbyte.md index 7b882d24006d1..5384cb0f3aeab 100644 --- a/docs/operator-guides/upgrading-airbyte.md +++ b/docs/operator-guides/upgrading-airbyte.md @@ -33,7 +33,7 @@ If you use custom connectors, this upgrade requires all of your connector specs :::note -Airbyte version 0.40.29 or later requires [Docker Compose V2](https://docs.docker.com/compose/compose-v2/) to be [installed](https://docs.docker.com/compose/install/) before upgrading. +Airbyte version 0.40.30 or later requires [Docker Compose V2](https://docs.docker.com/compose/compose-v2/) to be [installed](https://docs.docker.com/compose/install/) before upgrading. ::: @@ -109,7 +109,7 @@ If you are upgrading from (i.e. your current version of Airbyte is) Airbyte vers Here's an example of what it might look like with the values filled in. It assumes that the downloaded `airbyte_archive.tar.gz` is in `/tmp`. ```bash - docker run --rm -v /tmp:/config airbyte/migration:0.40.29 --\ + docker run --rm -v /tmp:/config airbyte/migration:0.40.30 --\ --input /config/airbyte_archive.tar.gz\ --output /config/airbyte_archive_migrated.tar.gz ``` diff --git a/kube/overlays/stable-with-resource-limits/.env b/kube/overlays/stable-with-resource-limits/.env index 22203d6db585a..f505247b5921f 100644 --- a/kube/overlays/stable-with-resource-limits/.env +++ b/kube/overlays/stable-with-resource-limits/.env @@ -1,4 +1,4 @@ -AIRBYTE_VERSION=0.40.29 +AIRBYTE_VERSION=0.40.30 # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db DATABASE_HOST=airbyte-db-svc diff --git a/kube/overlays/stable-with-resource-limits/kustomization.yaml b/kube/overlays/stable-with-resource-limits/kustomization.yaml index 3705262975555..d4b709c33fc8f 100644 --- a/kube/overlays/stable-with-resource-limits/kustomization.yaml +++ b/kube/overlays/stable-with-resource-limits/kustomization.yaml @@ -8,21 +8,21 @@ bases: images: - name: airbyte/db - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/bootloader - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/server - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/webapp - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/worker - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/temporal-auto-setup newTag: 1.13.0 - name: airbyte/cron - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/connector-builder-server - newTag: 0.40.29 + newTag: 0.40.30 configMapGenerator: - name: airbyte-env diff --git a/kube/overlays/stable/.env b/kube/overlays/stable/.env index 91ab84ac2d9b7..67c712a26e3ad 100644 --- a/kube/overlays/stable/.env +++ b/kube/overlays/stable/.env @@ -1,4 +1,4 @@ -AIRBYTE_VERSION=0.40.29 +AIRBYTE_VERSION=0.40.30 # Airbyte Internal Database, see https://docs.airbyte.io/operator-guides/configuring-airbyte-db DATABASE_HOST=airbyte-db-svc diff --git a/kube/overlays/stable/kustomization.yaml b/kube/overlays/stable/kustomization.yaml index f5b3a5b64cce5..3c554c08793b3 100644 --- a/kube/overlays/stable/kustomization.yaml +++ b/kube/overlays/stable/kustomization.yaml @@ -8,21 +8,21 @@ bases: images: - name: airbyte/db - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/bootloader - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/server - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/webapp - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/worker - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/temporal-auto-setup newTag: 1.13.0 - name: airbyte/cron - newTag: 0.40.29 + newTag: 0.40.30 - name: airbyte/connector-builder-server - newTag: 0.40.29 + newTag: 0.40.30 configMapGenerator: - name: airbyte-env diff --git a/octavia-cli/Dockerfile b/octavia-cli/Dockerfile index 49e95eb46bae9..027c059dad0a2 100644 --- a/octavia-cli/Dockerfile +++ b/octavia-cli/Dockerfile @@ -14,5 +14,5 @@ USER octavia-cli WORKDIR /home/octavia-project ENTRYPOINT ["octavia"] -LABEL io.airbyte.version=0.40.29 +LABEL io.airbyte.version=0.40.30 LABEL io.airbyte.name=airbyte/octavia-cli diff --git a/octavia-cli/README.md b/octavia-cli/README.md index 3f4c1e2c0c68e..d6f5bcc40abaf 100644 --- a/octavia-cli/README.md +++ b/octavia-cli/README.md @@ -104,7 +104,7 @@ This script: ```bash touch ~/.octavia # Create a file to store env variables that will be mapped the octavia-cli container mkdir my_octavia_project_directory # Create your octavia project directory where YAML configurations will be stored. -docker run --name octavia-cli -i --rm -v my_octavia_project_directory:/home/octavia-project --network host --user $(id -u):$(id -g) --env-file ~/.octavia airbyte/octavia-cli:0.40.29 +docker run --name octavia-cli -i --rm -v my_octavia_project_directory:/home/octavia-project --network host --user $(id -u):$(id -g) --env-file ~/.octavia airbyte/octavia-cli:0.40.30 ``` ### Using `docker-compose` @@ -712,7 +712,7 @@ You can disable telemetry by setting the `OCTAVIA_ENABLE_TELEMETRY` environment | Version | Date | Description | PR | | ------- | ---------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------------- | | 0.41.0 | 2022-10-13 | Use Basic Authentication for making API requests | [#17982](https://github.com/airbytehq/airbyte/pull/17982) | -| 0.40.29 | 2022-08-10 | Enable cron and basic scheduling | [#15253](https://github.com/airbytehq/airbyte/pull/15253) | +| 0.40.30 | 2022-08-10 | Enable cron and basic scheduling | [#15253](https://github.com/airbytehq/airbyte/pull/15253) | | 0.39.33 | 2022-07-05 | Add `octavia import all` command | [#14374](https://github.com/airbytehq/airbyte/pull/14374) | | 0.39.32 | 2022-06-30 | Create import command to import and manage existing Airbyte resource from octavia-cli | [#14137](https://github.com/airbytehq/airbyte/pull/14137) | | 0.39.27 | 2022-06-24 | Create get command to retrieve resources JSON representation | [#13254](https://github.com/airbytehq/airbyte/pull/13254) | diff --git a/octavia-cli/install.sh b/octavia-cli/install.sh index 1f9ecdbae8050..06f0b4cfbf1be 100755 --- a/octavia-cli/install.sh +++ b/octavia-cli/install.sh @@ -3,7 +3,7 @@ # This install scripts currently only works for ZSH and Bash profiles. # It creates an octavia alias in your profile bound to a docker run command and your current user. -VERSION=0.40.29 +VERSION=0.40.30 OCTAVIA_ENV_FILE=${HOME}/.octavia detect_profile() { diff --git a/octavia-cli/setup.py b/octavia-cli/setup.py index 53e07856fc86c..0ba3a357920d5 100644 --- a/octavia-cli/setup.py +++ b/octavia-cli/setup.py @@ -15,7 +15,7 @@ setup( name="octavia-cli", - version="0.40.29", + version="0.40.30", description="A command line interface to manage Airbyte configurations", long_description=README, author="Airbyte", From 68bcced15d6eff396a3f0a2025037f8234fa64ec Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 20:18:41 -0600 Subject: [PATCH 156/195] Turn off default httpavailabilitystrategy for source-hubspot (GA) (#22009) * Turn off default for source-hubspot (GA) * Update streams.py * Update hubspot.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-hubspot/Dockerfile | 2 +- .../connectors/source-hubspot/source_hubspot/streams.py | 5 +++++ docs/integrations/sources/hubspot.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index dc095f42edbbe..346453ceddb5c 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -784,7 +784,7 @@ - name: HubSpot sourceDefinitionId: 36c891d9-4bd9-43ac-bad2-10e12756272c dockerRepository: airbyte/source-hubspot - dockerImageTag: 0.3.0 + dockerImageTag: 0.3.1 documentationUrl: https://docs.airbyte.com/integrations/sources/hubspot icon: hubspot.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index d7430a17d3214..c462049ca66fb 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -6521,7 +6521,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-hubspot:0.3.0" +- dockerImage: "airbyte/source-hubspot:0.3.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/hubspot" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-hubspot/Dockerfile b/airbyte-integrations/connectors/source-hubspot/Dockerfile index 28c1d2e539c78..634c0a82b7ad4 100644 --- a/airbyte-integrations/connectors/source-hubspot/Dockerfile +++ b/airbyte-integrations/connectors/source-hubspot/Dockerfile @@ -34,5 +34,5 @@ COPY source_hubspot ./source_hubspot ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.3.0 +LABEL io.airbyte.version=0.3.1 LABEL io.airbyte.name=airbyte/source-hubspot diff --git a/airbyte-integrations/connectors/source-hubspot/source_hubspot/streams.py b/airbyte-integrations/connectors/source-hubspot/source_hubspot/streams.py index da0d30f13f2f3..0306dfb932be8 100644 --- a/airbyte-integrations/connectors/source-hubspot/source_hubspot/streams.py +++ b/airbyte-integrations/connectors/source-hubspot/source_hubspot/streams.py @@ -15,6 +15,7 @@ import requests from airbyte_cdk.entrypoint import logger from airbyte_cdk.models import SyncMode +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.streams.http.requests_native_auth import Oauth2Authenticator, TokenAuthenticator from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer @@ -209,6 +210,10 @@ class Stream(HttpStream, ABC): granted_scopes: Set = None properties_scopes: Set = None + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + @property @abstractmethod def scopes(self) -> Set[str]: diff --git a/docs/integrations/sources/hubspot.md b/docs/integrations/sources/hubspot.md index b08234edb147f..0aeac0601c5c8 100644 --- a/docs/integrations/sources/hubspot.md +++ b/docs/integrations/sources/hubspot.md @@ -126,6 +126,7 @@ Now that you have set up the Hubspot source connector, check out the following H | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------| +| 0.3.1 | 2023-01-27 | [22009](https://github.com/airbytehq/airbyte/pull/22009) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 0.3.0 | 2022-10-27 | [18546](https://github.com/airbytehq/airbyte/pull/18546) | Sunsetting API Key authentication. `Quotes` stream is no longer available | | 0.2.2 | 2022-10-03 | [16914](https://github.com/airbytehq/airbyte/pull/16914) | Fix 403 forbidden error validation | | 0.2.1 | 2022-09-26 | [17120](https://github.com/airbytehq/airbyte/pull/17120) | Migrate to per-stream state. | From 9fe98ad896e20707d9fb152902d7552aa43173b6 Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 20:20:22 -0600 Subject: [PATCH 157/195] Turn off default httpavailabilitystrategy for source-klaviyo (GA) (#22012) * Turn off default for source-klaviyo (GA) * Update streams.py * Update klaviyo.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-klaviyo/Dockerfile | 2 +- .../connectors/source-klaviyo/source_klaviyo/streams.py | 5 +++++ docs/integrations/sources/klaviyo.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 346453ceddb5c..7d3d115987d7d 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -896,7 +896,7 @@ - name: Klaviyo sourceDefinitionId: 95e8cffd-b8c4-4039-968e-d32fb4a69bde dockerRepository: airbyte/source-klaviyo - dockerImageTag: 0.1.10 + dockerImageTag: 0.1.11 documentationUrl: https://docs.airbyte.com/integrations/sources/klaviyo icon: klaviyo.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index c462049ca66fb..cb71514730cf6 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -7375,7 +7375,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-klaviyo:0.1.10" +- dockerImage: "airbyte/source-klaviyo:0.1.11" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/klaviyo" changelogUrl: "https://docs.airbyte.com/integrations/sources/klaviyo" diff --git a/airbyte-integrations/connectors/source-klaviyo/Dockerfile b/airbyte-integrations/connectors/source-klaviyo/Dockerfile index 4e769f06f7328..2d85dbc952e7f 100644 --- a/airbyte-integrations/connectors/source-klaviyo/Dockerfile +++ b/airbyte-integrations/connectors/source-klaviyo/Dockerfile @@ -34,5 +34,5 @@ COPY source_klaviyo ./source_klaviyo ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.10 +LABEL io.airbyte.version=0.1.11 LABEL io.airbyte.name=airbyte/source-klaviyo diff --git a/airbyte-integrations/connectors/source-klaviyo/source_klaviyo/streams.py b/airbyte-integrations/connectors/source-klaviyo/source_klaviyo/streams.py index abf59dbd31e60..e8ca965d49a3f 100644 --- a/airbyte-integrations/connectors/source-klaviyo/source_klaviyo/streams.py +++ b/airbyte-integrations/connectors/source-klaviyo/source_klaviyo/streams.py @@ -8,6 +8,7 @@ import pendulum import requests +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer @@ -27,6 +28,10 @@ def __init__(self, api_key: str, **kwargs): transform_function = self.get_custom_transform() self.transformer.registerCustomTransform(transform_function) + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def get_custom_transform(self): def custom_transform_date_rfc3339(original_value, field_schema): if original_value and "format" in field_schema and field_schema["format"] == "date-time": diff --git a/docs/integrations/sources/klaviyo.md b/docs/integrations/sources/klaviyo.md index dc8ed649f0720..762a9962758f9 100644 --- a/docs/integrations/sources/klaviyo.md +++ b/docs/integrations/sources/klaviyo.md @@ -54,6 +54,7 @@ The Klaviyo connector should not run into Klaviyo API limitations under normal u | Version | Date | Pull Request | Subject | |:---------|:-----------|:-----------------------------------------------------------|:------------------------------------------------------------------------------------------| +| `0.1.11` | 2023-01-27 | [22012](https://github.com/airbytehq/airbyte/pull/22012) | Set `AvailabilityStrategy` for streams explicitly to `None` | | `0.1.10` | 2022-09-29 | [17422](https://github.com/airbytehq/airbyte/issues/17422) | Update CDK dependency | | `0.1.9` | 2022-09-28 | [17304](https://github.com/airbytehq/airbyte/issues/17304) | Migrate to per-stream state. | | `0.1.6` | 2022-07-20 | [14872](https://github.com/airbytehq/airbyte/issues/14872) | Increase test coverage | From f6d8bb7be92440a5aa6104382212ee5f007a11cf Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 20:20:29 -0600 Subject: [PATCH 158/195] Turn off default httpavailabilitystrategy for source-recharge (GA) (#22021) * Turn off default for source-recharge (GA) * Update api.py * Update recharge.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-recharge/Dockerfile | 2 +- .../connectors/source-recharge/source_recharge/api.py | 5 +++++ docs/integrations/sources/recharge.md | 3 ++- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 7d3d115987d7d..c2f4fa116a445 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1442,7 +1442,7 @@ - name: Recharge sourceDefinitionId: 45d2e135-2ede-49e1-939f-3e3ec357a65e dockerRepository: airbyte/source-recharge - dockerImageTag: 0.2.4 + dockerImageTag: 0.2.5 documentationUrl: https://docs.airbyte.com/integrations/sources/recharge icon: recharge.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index cb71514730cf6..a04788371031c 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -12327,7 +12327,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-recharge:0.2.4" +- dockerImage: "airbyte/source-recharge:0.2.5" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/recharge" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-recharge/Dockerfile b/airbyte-integrations/connectors/source-recharge/Dockerfile index 69848f6bd9390..bc55a801d19bf 100644 --- a/airbyte-integrations/connectors/source-recharge/Dockerfile +++ b/airbyte-integrations/connectors/source-recharge/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.4 +LABEL io.airbyte.version=0.2.5 LABEL io.airbyte.name=airbyte/source-recharge diff --git a/airbyte-integrations/connectors/source-recharge/source_recharge/api.py b/airbyte-integrations/connectors/source-recharge/source_recharge/api.py index 73627d359a7f7..bff8cf65247f4 100644 --- a/airbyte-integrations/connectors/source-recharge/source_recharge/api.py +++ b/airbyte-integrations/connectors/source-recharge/source_recharge/api.py @@ -8,6 +8,7 @@ import pendulum import requests +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer @@ -28,6 +29,10 @@ class RechargeStream(HttpStream, ABC): def data_path(self): return self.name + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def path( self, stream_state: Mapping[str, Any] = None, stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None ) -> str: diff --git a/docs/integrations/sources/recharge.md b/docs/integrations/sources/recharge.md index 609aff02de69b..20ca424b13d1a 100644 --- a/docs/integrations/sources/recharge.md +++ b/docs/integrations/sources/recharge.md @@ -75,7 +75,8 @@ The Recharge connector should gracefully handle Recharge API limitations under n ## Changelog | Version | Date | Pull Request | Subject | -| :------ | :--------- | :------------------------------------------------------- | :---------------------------------------------------------------------------------------- | +|:--------| :--------- | :------------------------------------------------------- | :---------------------------------------------------------------------------------------- | +| 0.2.5 | 2023-01-27 | [22021](https://github.com/airbytehq/airbyte/pull/22021) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 0.2.4 | 2022-10-11 | [17822](https://github.com/airbytehq/airbyte/pull/17822) | Do not parse JSON in `should_retry` | | 0.2.3 | 2022-10-11 | [17822](https://github.com/airbytehq/airbyte/pull/17822) | Do not parse JSON in `should_retry` | | 0.2.2 | 2022-10-05 | [17608](https://github.com/airbytehq/airbyte/pull/17608) | Skip stream if we receive 403 error | From 8d5423ac380968e4621321e5a1f9c2bbf03e7c26 Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 20:21:45 -0600 Subject: [PATCH 159/195] Turn off default httpavailabilitystrategy for source-freshdesk (GA) (#22004) * Turn off default for source-freshdesk (GA) * Update streams.py * Update streams.py * Update freshdesk.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-freshdesk/Dockerfile | 2 +- .../connectors/source-freshdesk/source_freshdesk/streams.py | 5 +++++ docs/integrations/sources/freshdesk.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index c2f4fa116a445..64ae21ab282e8 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -556,7 +556,7 @@ - name: Freshdesk sourceDefinitionId: ec4b9503-13cb-48ab-a4ab-6ade4be46567 dockerRepository: airbyte/source-freshdesk - dockerImageTag: 2.0.0 + dockerImageTag: 2.0.1 documentationUrl: https://docs.airbyte.com/integrations/sources/freshdesk icon: freshdesk.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index a04788371031c..81e9a460c8768 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -4514,7 +4514,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-freshdesk:2.0.0" +- dockerImage: "airbyte/source-freshdesk:2.0.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/freshdesk" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-freshdesk/Dockerfile b/airbyte-integrations/connectors/source-freshdesk/Dockerfile index 3de5ddb704242..571345eb17a07 100644 --- a/airbyte-integrations/connectors/source-freshdesk/Dockerfile +++ b/airbyte-integrations/connectors/source-freshdesk/Dockerfile @@ -34,5 +34,5 @@ COPY source_freshdesk ./source_freshdesk ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=2.0.0 +LABEL io.airbyte.version=2.0.1 LABEL io.airbyte.name=airbyte/source-freshdesk diff --git a/airbyte-integrations/connectors/source-freshdesk/source_freshdesk/streams.py b/airbyte-integrations/connectors/source-freshdesk/source_freshdesk/streams.py index 83877e24ab654..61367124566ab 100644 --- a/airbyte-integrations/connectors/source-freshdesk/source_freshdesk/streams.py +++ b/airbyte-integrations/connectors/source-freshdesk/source_freshdesk/streams.py @@ -11,6 +11,7 @@ import pendulum import requests from airbyte_cdk.models import SyncMode +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.core import IncrementalMixin from airbyte_cdk.sources.streams.http import HttpStream, HttpSubStream from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer @@ -46,6 +47,10 @@ def __init__(self, authenticator: AuthBase, config: Mapping[str, Any], *args, ** def url_base(self) -> str: return parse.urljoin(f"https://{self.domain.rstrip('/')}", "/api/v2/") + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def backoff_time(self, response: requests.Response) -> Optional[float]: if response.status_code == requests.codes.too_many_requests: return float(response.headers.get("Retry-After", 0)) diff --git a/docs/integrations/sources/freshdesk.md b/docs/integrations/sources/freshdesk.md index 7c88aae5aaa85..f8fe235113eb0 100644 --- a/docs/integrations/sources/freshdesk.md +++ b/docs/integrations/sources/freshdesk.md @@ -67,6 +67,7 @@ The Freshdesk connector should not run into Freshdesk API limitations under norm | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:--------------------------------------------------------------------------------------| +| 2.0.1 | 2023-01-27 | [21888](https://github.com/airbytehq/airbyte/pull/21888) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 2.0.0 | 2022-12-20 | [20416](https://github.com/airbytehq/airbyte/pull/20416) | Fix `SlaPolicies` stream schema | | 1.0.0 | 2022-11-16 | [19496](https://github.com/airbytehq/airbyte/pull/19496) | Fix `Contacts` stream schema | | 0.3.8 | 2022-11-11 | [19349](https://github.com/airbytehq/airbyte/pull/19349) | Do not rely on response.json() when deciding to retry a request | From 18bda454a6fbee4528a27ff10f63c11b80489664 Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 20:23:01 -0600 Subject: [PATCH 160/195] Turn off default httpavailabilitystrategy for source-notion (GA) (#22018) * Turn off default for source-notion (GA) * Update streams.py * Update notion.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-notion/Dockerfile | 2 +- .../connectors/source-notion/source_notion/streams.py | 5 +++++ docs/integrations/sources/notion.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 64ae21ab282e8..4f67f042e6c64 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1142,7 +1142,7 @@ - name: Notion sourceDefinitionId: 6e00b415-b02e-4160-bf02-58176a0ae687 dockerRepository: airbyte/source-notion - dockerImageTag: 1.0.0 + dockerImageTag: 1.0.1 documentationUrl: https://docs.airbyte.com/integrations/sources/notion icon: notion.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 81e9a460c8768..46b6d3d7b1abf 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -9970,7 +9970,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-notion:1.0.0" +- dockerImage: "airbyte/source-notion:1.0.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/notion" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-notion/Dockerfile b/airbyte-integrations/connectors/source-notion/Dockerfile index d910782187e81..c6dad22d2b0b5 100644 --- a/airbyte-integrations/connectors/source-notion/Dockerfile +++ b/airbyte-integrations/connectors/source-notion/Dockerfile @@ -34,5 +34,5 @@ COPY source_notion ./source_notion ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=1.0.0 +LABEL io.airbyte.version=1.0.1 LABEL io.airbyte.name=airbyte/source-notion diff --git a/airbyte-integrations/connectors/source-notion/source_notion/streams.py b/airbyte-integrations/connectors/source-notion/source_notion/streams.py index db2671ca2005e..d2dc022612dd3 100644 --- a/airbyte-integrations/connectors/source-notion/source_notion/streams.py +++ b/airbyte-integrations/connectors/source-notion/source_notion/streams.py @@ -8,6 +8,7 @@ import pydantic import requests from airbyte_cdk.models import SyncMode +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream, HttpSubStream from .utils import transform_properties @@ -28,6 +29,10 @@ def __init__(self, config: Mapping[str, Any], **kwargs): super().__init__(**kwargs) self.start_date = config["start_date"] + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def backoff_time(self, response: requests.Response) -> Optional[float]: retry_after = response.headers.get("retry-after") if retry_after: diff --git a/docs/integrations/sources/notion.md b/docs/integrations/sources/notion.md index 076358f38e69d..bbbeec2181850 100644 --- a/docs/integrations/sources/notion.md +++ b/docs/integrations/sources/notion.md @@ -84,6 +84,7 @@ The connector is restricted by Notion [request limits](https://developers.notion | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------------------| +| 1.0.1 | 2023-01-27 | [22018](https://github.com/airbytehq/airbyte/pull/22018) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 1.0.0 | 2022-12-19 | [20639](https://github.com/airbytehq/airbyte/pull/20639) | Fix `Pages` stream schema | | 0.1.10 | 2022-09-28 | [17298](https://github.com/airbytehq/airbyte/pull/17298) | Use "Retry-After" header for backoff | | 0.1.9 | 2022-09-16 | [16799](https://github.com/airbytehq/airbyte/pull/16799) | Migrate to per-stream state | From 8fc76a5d3c2f8c8d7e8448d2d3be36b83628c7cc Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 20:25:58 -0600 Subject: [PATCH 161/195] Turn off default httpavailabilitystrategy for source-github (GA) (#22039) * Turn off default for source-github (GA) * Update github.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-github/Dockerfile | 2 +- .../connectors/source-github/source_github/streams.py | 5 +++++ docs/integrations/sources/github.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 4f67f042e6c64..de007514c0ddb 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -602,7 +602,7 @@ - name: GitHub sourceDefinitionId: ef69ef6e-aa7f-4af1-a01d-ef775033524e dockerRepository: airbyte/source-github - dockerImageTag: 0.4.0 + dockerImageTag: 0.4.1 documentationUrl: https://docs.airbyte.com/integrations/sources/github icon: github.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 46b6d3d7b1abf..c0f4f6247f8dd 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -4715,7 +4715,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-github:0.4.0" +- dockerImage: "airbyte/source-github:0.4.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/github" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-github/Dockerfile b/airbyte-integrations/connectors/source-github/Dockerfile index a983a5aed6603..cf623aad7466e 100644 --- a/airbyte-integrations/connectors/source-github/Dockerfile +++ b/airbyte-integrations/connectors/source-github/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.4.0 +LABEL io.airbyte.version=0.4.1 LABEL io.airbyte.name=airbyte/source-github diff --git a/airbyte-integrations/connectors/source-github/source_github/streams.py b/airbyte-integrations/connectors/source-github/source_github/streams.py index 4b0079e846d82..530045b51eaea 100644 --- a/airbyte-integrations/connectors/source-github/source_github/streams.py +++ b/airbyte-integrations/connectors/source-github/source_github/streams.py @@ -10,6 +10,7 @@ import pendulum import requests from airbyte_cdk.models import SyncMode +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.streams.http.exceptions import DefaultBackoffException from requests.exceptions import HTTPError @@ -42,6 +43,10 @@ def __init__(self, repositories: List[str], page_size_for_large_streams: int, ** self._session.mount("https://", adapter) self._session.mount("http://", adapter) + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def path(self, stream_slice: Mapping[str, Any] = None, **kwargs) -> str: return f"repos/{stream_slice['repository']}/{self.name}" diff --git a/docs/integrations/sources/github.md b/docs/integrations/sources/github.md index 6d1912b98fb14..a88e235d44b18 100644 --- a/docs/integrations/sources/github.md +++ b/docs/integrations/sources/github.md @@ -163,6 +163,7 @@ The GitHub connector should not run into GitHub API limitations under normal usa | Version | Date | Pull Request | Subject | |:--------|:-----------|:------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 0.4.1 | 2023-01-27 | [22039](https://github.com/airbytehq/airbyte/pull/22039) | Set `AvailabilityStrategy` for streams explicitly to `None` | | | | 0.4.0 | 2023-01-20 | [21457](https://github.com/airbytehq/airbyte/pull/21457) | Use GraphQL for `issue_reactions` stream | | 0.3.12 | 2023-01-18 | [21481](https://github.com/airbytehq/airbyte/pull/21481) | Handle 502 Bad Gateway error with proper log message | | 0.3.11 | 2023-01-06 | [21084](https://github.com/airbytehq/airbyte/pull/21084) | Raise Error if no organizations or repos are available during read | From a1d1f2a20287157911edb76678be2553768e2bfd Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 20:30:13 -0600 Subject: [PATCH 162/195] Turn off default httpavailabilitystrategy for source-pinterest (GA) (#22020) * Turn off default for source-pinterest (GA) * Update source.py * Update pinterest.md * Update pinterest.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-pinterest/Dockerfile | 2 +- .../connectors/source-pinterest/source_pinterest/source.py | 5 +++++ docs/integrations/sources/pinterest.md | 3 ++- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index de007514c0ddb..041d10dda4218 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1286,7 +1286,7 @@ - name: Pinterest sourceDefinitionId: 5cb7e5fe-38c2-11ec-8d3d-0242ac130003 dockerRepository: airbyte/source-pinterest - dockerImageTag: 0.2.1 + dockerImageTag: 0.2.2 documentationUrl: https://docs.airbyte.com/integrations/sources/pinterest icon: pinterest.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index c0f4f6247f8dd..97e6567ab66f4 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -11067,7 +11067,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-pinterest:0.2.1" +- dockerImage: "airbyte/source-pinterest:0.2.2" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/pinterest" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-pinterest/Dockerfile b/airbyte-integrations/connectors/source-pinterest/Dockerfile index 1f4efba5560f9..75343735ce333 100644 --- a/airbyte-integrations/connectors/source-pinterest/Dockerfile +++ b/airbyte-integrations/connectors/source-pinterest/Dockerfile @@ -34,5 +34,5 @@ COPY source_pinterest ./source_pinterest ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.1 +LABEL io.airbyte.version=0.2.2 LABEL io.airbyte.name=airbyte/source-pinterest diff --git a/airbyte-integrations/connectors/source-pinterest/source_pinterest/source.py b/airbyte-integrations/connectors/source-pinterest/source_pinterest/source.py index 80688424bb52d..244f022fce55f 100644 --- a/airbyte-integrations/connectors/source-pinterest/source_pinterest/source.py +++ b/airbyte-integrations/connectors/source-pinterest/source_pinterest/source.py @@ -13,6 +13,7 @@ from airbyte_cdk.models import SyncMode from airbyte_cdk.sources import AbstractSource from airbyte_cdk.sources.streams import Stream +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream, HttpSubStream from airbyte_cdk.sources.streams.http.auth import Oauth2Authenticator from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer @@ -44,6 +45,10 @@ def start_date(self): def window_in_days(self): return 30 # Set window_in_days to 30 days date range + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]: next_page = response.json().get("bookmark", {}) if self.data_fields else {} diff --git a/docs/integrations/sources/pinterest.md b/docs/integrations/sources/pinterest.md index ab9348e25854b..1e095d2264d22 100644 --- a/docs/integrations/sources/pinterest.md +++ b/docs/integrations/sources/pinterest.md @@ -70,7 +70,8 @@ The connector is restricted by the Pinterest [requests limitation](https://devel ## Changelog | Version | Date | Pull Request | Subject | -| :------ | :--------- | :------------------------------------------------------- | :------------------------------------------------------------------------------------------------------ | +|:--------| :--------- | :------------------------------------------------------- | :------------------------------------------------------------------------------------------------------ | +| 0.2.2 | 2023-01-27 | [22020](https://github.com/airbytehq/airbyte/pull/22020) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 0.2.1 | 2022-12-15 | [20532](https://github.com/airbytehq/airbyte/pull/20532) | Bump CDK version| | 0.2.0 | 2022-12-13 | [20242](https://github.com/airbytehq/airbyte/pull/20242) | Added data-type normalization up to the schemas declared | | 0.1.9 | 2022-09-06 | [15074](https://github.com/airbytehq/airbyte/pull/15074) | Added filter based on statuses | From 5ffaadd64278d0e126701b46c066d3833d9a2726 Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 21:02:18 -0600 Subject: [PATCH 163/195] Turn off default httpavailabilitystrategy for source-snapchat-marketing (GA) (#22023) * Turn off default for source-snapchat-marketing (GA) * Update source.py * Update snapchat-marketing.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-snapchat-marketing/Dockerfile | 2 +- .../source_snapchat_marketing/source.py | 5 +++++ docs/integrations/sources/snapchat-marketing.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 041d10dda4218..05b52587acf0d 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1648,7 +1648,7 @@ - name: Snapchat Marketing sourceDefinitionId: 200330b2-ea62-4d11-ac6d-cfe3e3f8ab2b dockerRepository: airbyte/source-snapchat-marketing - dockerImageTag: 0.1.12 + dockerImageTag: 0.1.13 documentationUrl: https://docs.airbyte.com/integrations/sources/snapchat-marketing icon: snapchat.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 97e6567ab66f4..4b4cff886f3b0 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -13853,7 +13853,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-snapchat-marketing:0.1.12" +- dockerImage: "airbyte/source-snapchat-marketing:0.1.13" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/snapchat-marketing" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-snapchat-marketing/Dockerfile b/airbyte-integrations/connectors/source-snapchat-marketing/Dockerfile index 110cc948831cd..abcaa3bf6ddfc 100644 --- a/airbyte-integrations/connectors/source-snapchat-marketing/Dockerfile +++ b/airbyte-integrations/connectors/source-snapchat-marketing/Dockerfile @@ -25,5 +25,5 @@ COPY source_snapchat_marketing ./source_snapchat_marketing ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.12 +LABEL io.airbyte.version=0.1.13 LABEL io.airbyte.name=airbyte/source-snapchat-marketing diff --git a/airbyte-integrations/connectors/source-snapchat-marketing/source_snapchat_marketing/source.py b/airbyte-integrations/connectors/source-snapchat-marketing/source_snapchat_marketing/source.py index 4d68e90c5ad20..790b7e2a2cc87 100644 --- a/airbyte-integrations/connectors/source-snapchat-marketing/source_snapchat_marketing/source.py +++ b/airbyte-integrations/connectors/source-snapchat-marketing/source_snapchat_marketing/source.py @@ -14,6 +14,7 @@ from airbyte_cdk.models import SyncMode from airbyte_cdk.sources import AbstractSource from airbyte_cdk.sources.streams import Stream +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.core import IncrementalMixin, package_name_from_class from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.streams.http.auth import Oauth2Authenticator @@ -183,6 +184,10 @@ def response_root_name(self): """Using the class name in lower to set the root node for response parsing""" return self.name + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + @property def response_item_name(self): """Remove last 's' from response_root_name, see example in parse_response function""" diff --git a/docs/integrations/sources/snapchat-marketing.md b/docs/integrations/sources/snapchat-marketing.md index 704834f580e2e..f42083ae26e67 100644 --- a/docs/integrations/sources/snapchat-marketing.md +++ b/docs/integrations/sources/snapchat-marketing.md @@ -113,6 +113,7 @@ Snapchat Marketing API has limitations to 1000 items per page. | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:------------------------------------------------------| +| 0.1.13 | 2023-01-27 | [22023](https://github.com/airbytehq/airbyte/pull/22023) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 0.1.12 | 2023-01-11 | [21267](https://github.com/airbytehq/airbyte/pull/21267) | Fix parse empty error response | | 0.1.11 | 2022-12-23 | [20865](https://github.com/airbytehq/airbyte/pull/20865) | Handle 403 permission error | | 0.1.10 | 2022-12-15 | [20537](https://github.com/airbytehq/airbyte/pull/20537) | Run on CDK 0.15.0 | From e5a41ad7e68edc7b3920fe2439caa696d9483a1d Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 21:17:12 -0600 Subject: [PATCH 164/195] Turn off default httpavailabilitystrategy for source-stripe (GA) (#22042) * Turn off default for source-stripe (GA) * Update stripe.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-stripe/Dockerfile | 2 +- .../connectors/source-stripe/source_stripe/streams.py | 5 +++++ docs/integrations/sources/stripe.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 05b52587acf0d..d3f89a6f42064 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1704,7 +1704,7 @@ - name: Stripe sourceDefinitionId: e094cb9a-26de-4645-8761-65c0c425d1de dockerRepository: airbyte/source-stripe - dockerImageTag: 1.0.0 + dockerImageTag: 1.0.1 documentationUrl: https://docs.airbyte.com/integrations/sources/stripe icon: stripe.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 4b4cff886f3b0..c0323cfba9e5b 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -14410,7 +14410,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-stripe:1.0.0" +- dockerImage: "airbyte/source-stripe:1.0.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/stripe" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-stripe/Dockerfile b/airbyte-integrations/connectors/source-stripe/Dockerfile index 3c6f1cc6204e1..88142f575412a 100644 --- a/airbyte-integrations/connectors/source-stripe/Dockerfile +++ b/airbyte-integrations/connectors/source-stripe/Dockerfile @@ -12,5 +12,5 @@ COPY main.py ./ ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=1.0.0 +LABEL io.airbyte.version=1.0.1 LABEL io.airbyte.name=airbyte/source-stripe diff --git a/airbyte-integrations/connectors/source-stripe/source_stripe/streams.py b/airbyte-integrations/connectors/source-stripe/source_stripe/streams.py index d1947ef1310d5..c811dff429fd2 100644 --- a/airbyte-integrations/connectors/source-stripe/source_stripe/streams.py +++ b/airbyte-integrations/connectors/source-stripe/source_stripe/streams.py @@ -10,6 +10,7 @@ import pendulum import requests from airbyte_cdk.models import SyncMode +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream STRIPE_ERROR_CODES: List = [ @@ -31,6 +32,10 @@ def __init__(self, start_date: int, account_id: str, slice_range: int = DEFAULT_ self.start_date = start_date self.slice_range = slice_range or self.DEFAULT_SLICE_RANGE + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]: decoded_response = response.json() if bool(decoded_response.get("has_more", "False")) and decoded_response.get("data", []): diff --git a/docs/integrations/sources/stripe.md b/docs/integrations/sources/stripe.md index 0e1adfe9a435a..52bdb1838a17c 100644 --- a/docs/integrations/sources/stripe.md +++ b/docs/integrations/sources/stripe.md @@ -82,6 +82,7 @@ The Stripe connector should not run into Stripe API limitations under normal usa | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------| +| 1.0.1 | 2023-01-27 | [22042](https://github.com/airbytehq/airbyte/pull/22042) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 1.0.0 | 2023-01-25 | [21858](https://github.com/airbytehq/airbyte/pull/21858) | Update the `Subscriptions` and `Invoices` stream schemas | | 0.1.40 | 2022-10-20 | [18228](https://github.com/airbytehq/airbyte/pull/18228) | Update the `Payment Intents` stream schema | | 0.1.39 | 2022-09-28 | [17304](https://github.com/airbytehq/airbyte/pull/17304) | Migrate to per-stream states. | From c707c8c8dfcb6935bb9b42770d986b6b8cf9dca7 Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 21:25:04 -0600 Subject: [PATCH 165/195] Turn off default httpavailabilitystrategy for source-paypal-transaction (GA) (#22019) * Turn off default for source-paypal-transaction (GA) * Update source.py * Update paypal-transaction.md * Update paypal-transaction.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-paypal-transaction/Dockerfile | 2 +- .../source_paypal_transaction/source.py | 5 +++++ docs/integrations/sources/paypal-transaction.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index d3f89a6f42064..c0fb4777d4768 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1254,7 +1254,7 @@ - name: Paypal Transaction sourceDefinitionId: d913b0f2-cc51-4e55-a44c-8ba1697b9239 dockerRepository: airbyte/source-paypal-transaction - dockerImageTag: 0.1.10 + dockerImageTag: 0.1.11 documentationUrl: https://docs.airbyte.com/integrations/sources/paypal-transaction icon: paypal.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index c0323cfba9e5b..adb2ba9c2281e 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -10899,7 +10899,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-paypal-transaction:0.1.10" +- dockerImage: "airbyte/source-paypal-transaction:0.1.11" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/paypal-transactions" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-paypal-transaction/Dockerfile b/airbyte-integrations/connectors/source-paypal-transaction/Dockerfile index 9e26b7a545bcf..fea16324637fe 100644 --- a/airbyte-integrations/connectors/source-paypal-transaction/Dockerfile +++ b/airbyte-integrations/connectors/source-paypal-transaction/Dockerfile @@ -12,5 +12,5 @@ RUN pip install . ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.10 +LABEL io.airbyte.version=0.1.11 LABEL io.airbyte.name=airbyte/source-paypal-transaction diff --git a/airbyte-integrations/connectors/source-paypal-transaction/source_paypal_transaction/source.py b/airbyte-integrations/connectors/source-paypal-transaction/source_paypal_transaction/source.py index 45af4a71bc5d3..39f65974a3b7a 100644 --- a/airbyte-integrations/connectors/source-paypal-transaction/source_paypal_transaction/source.py +++ b/airbyte-integrations/connectors/source-paypal-transaction/source_paypal_transaction/source.py @@ -14,6 +14,7 @@ from airbyte_cdk.models import SyncMode from airbyte_cdk.sources import AbstractSource from airbyte_cdk.sources.streams import Stream +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.streams.http.auth import HttpAuthenticator, Oauth2Authenticator from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer @@ -137,6 +138,10 @@ def validate_input_dates(self): def url_base(self) -> str: return f"{get_endpoint(self.is_sandbox)}/v1/reporting/" + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def request_headers(self, **kwargs) -> Mapping[str, Any]: return {"Content-Type": "application/json"} diff --git a/docs/integrations/sources/paypal-transaction.md b/docs/integrations/sources/paypal-transaction.md index ef7d62962f917..e7771b8f07ea4 100644 --- a/docs/integrations/sources/paypal-transaction.md +++ b/docs/integrations/sources/paypal-transaction.md @@ -87,6 +87,7 @@ Transactions sync is performed with default `stream_slice_period` = 1 day, it me | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------| +| 0.1.11 | 2023-01-27 | [22019](https://github.com/airbytehq/airbyte/pull/22019) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 0.1.10 | 2022-09-04 | [17554](https://github.com/airbytehq/airbyte/pull/17554) | Made the spec and source config to be consistent | | 0.1.9 | 2022-08-18 | [15741](https://github.com/airbytehq/airbyte/pull/15741) | Removed `OAuth2.0` option | | 0.1.8 | 2022-07-25 | [15000](https://github.com/airbytehq/airbyte/pull/15000) | Added support of `OAuth2.0` authentication, fixed bug when normalization couldn't handle nested cursor field and primary key | From 81756b0e32938ea07e7f34b9a7ffc474388c9322 Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 23:47:42 -0600 Subject: [PATCH 166/195] Turn off default httpavailability for source-facebook-marketing (GA) (#22003) * Turn off default for source-facebook-marketing (GA) * Format * remove import * Update base_streams.py * Update facebook-marketing.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../main/resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../source-facebook-marketing/Dockerfile | 2 +- .../streams/base_streams.py | 5 +++++ .../connectors/source-freshdesk/tickets.sqlite | Bin 0 -> 28672 bytes docs/integrations/sources/facebook-marketing.md | 1 + 6 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 airbyte-integrations/connectors/source-freshdesk/tickets.sqlite diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index c0fb4777d4768..e55c0f822fa2f 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -488,7 +488,7 @@ - name: Facebook Marketing sourceDefinitionId: e7778cfc-e97c-4458-9ecb-b4f2bba8946c dockerRepository: airbyte/source-facebook-marketing - dockerImageTag: 0.2.83 + dockerImageTag: 0.2.84 documentationUrl: https://docs.airbyte.com/integrations/sources/facebook-marketing icon: facebook.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index adb2ba9c2281e..d025a001834d9 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -3642,7 +3642,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-facebook-marketing:0.2.83" +- dockerImage: "airbyte/source-facebook-marketing:0.2.84" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/facebook-marketing" changelogUrl: "https://docs.airbyte.com/integrations/sources/facebook-marketing" diff --git a/airbyte-integrations/connectors/source-facebook-marketing/Dockerfile b/airbyte-integrations/connectors/source-facebook-marketing/Dockerfile index 03e57ca90bfa2..79ae0360b5f59 100644 --- a/airbyte-integrations/connectors/source-facebook-marketing/Dockerfile +++ b/airbyte-integrations/connectors/source-facebook-marketing/Dockerfile @@ -13,5 +13,5 @@ ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.83 +LABEL io.airbyte.version=0.2.84 LABEL io.airbyte.name=airbyte/source-facebook-marketing diff --git a/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/base_streams.py b/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/base_streams.py index 7a1a8f628e741..34e2aa01c25fc 100644 --- a/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/base_streams.py +++ b/airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/base_streams.py @@ -12,6 +12,7 @@ import pendulum from airbyte_cdk.models import SyncMode from airbyte_cdk.sources.streams import Stream +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer from cached_property import cached_property from facebook_business.adobjects.abstractobject import AbstractObject @@ -40,6 +41,10 @@ class FBMarketingStream(Stream, ABC): # entity prefix for `include_deleted` filter, it usually matches singular version of stream name entity_prefix = None + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def __init__(self, api: "API", include_deleted: bool = False, page_size: int = 100, max_batch_size: int = 50, **kwargs): super().__init__(**kwargs) self._api = api diff --git a/airbyte-integrations/connectors/source-freshdesk/tickets.sqlite b/airbyte-integrations/connectors/source-freshdesk/tickets.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..a1a805e2a1a43cfda6d3ed3dfe14c0b5f86d5652 GIT binary patch literal 28672 zcmeI4Pi)&%9LJL;P1~%SD~38Tp*2LT8r#y?&wmnk3!^J#nzkV}%4j#C$g!UrlhpBS zr&|Y;kbp@HAC35TMI0vW!Y+U~ZJNXZAua=s+;#ypp&^iVfaf$VP2#TUmbw!CS&j4Z zYPauwe*Wg`Kl=S%K6zZTaYC(_vyz=)Lj$33IP_d15ekL+$*YIF7MCv4h%SC0@8Mf00e+QCkdR0 z#C8k~g-fwjGdZJ9GjTl zpO}-%Rs0MSjqR8i3WqdZ!56G^WpX{8m#TK9_Bp?_f1X)tcAp40jKDG~x`oLI>W!|Z z5!Aa^9zoZGM^NA28$rDpAv}9MrrqQfrtW*q9_oJNYUm@cx$(OD8JftV;fesa=#7ekmN5 zEKN?x==AII>}h%my>MPSEt+ShN`mq#&yfDo6ss7@k)k?1b=a6fb{U_{<=ms!tSAPj%2XblHgMZi|k8iF7cG1%oa) zSzrqsFUSJN^KDo~hZTV`S#pZ7?Bpr);dkOcKT-iGqSY#BFBU0=oe>lJ@0<;SM5Uj5v$Tf7VJ5JVdDjlNI)D7w*>KZjoJx~2g>D1fQPu^8FEIf00cH6fyX1MFwJAEDwviyiKAImhuakQ#DPs1NtiMa00KY&2mk>f00e*l5C8%|00;nq zO+>(Z{twsxn<(HgRUiNafB+Bx0zd!=00AHX1b_e#*pvjk=l|U#>A(N?zT2^zkpB<) z|B(ORP>EqNf&alJ7}hsa2lD^x6){?qI=#vstvR-kyVh3jT1S&Q{UZ^CFd+Xw*P7Jn z9}W;kTf*pEshHO9rXUmn`Tx0AtMJdU1x2)_h>lu?e*RKN0G`)Aw`iM&vqa!r~ElcSk&$y7E|avIi*@a$%KnYl2^?5V2N(kX?HL zLO#nkm0KGg{^Ads{mida$Rk(&TVBHO|5pL9qbA0Xkdm`IFQm&V&#kXycNK?7A;A8= zXzKkpn=_8ck@?#yM<&0*ky)R{8ta|$8Jg!BirDPCtdC!v|Hkjg^eK%wyIN_?HPprQ zjRiPZfDX11a#*-8w!N3sbc#3U+7UV23sw$1V#EeHuyePMS_2=iw;Wopbi7!Q!c6h3vmpf%>V!Z literal 0 HcmV?d00001 diff --git a/docs/integrations/sources/facebook-marketing.md b/docs/integrations/sources/facebook-marketing.md index bd21d47fa2c5e..6265116f2b17d 100644 --- a/docs/integrations/sources/facebook-marketing.md +++ b/docs/integrations/sources/facebook-marketing.md @@ -133,6 +133,7 @@ Please be informed that the connector uses the `lookback_window` parameter to pe | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 0.2.84 | 2023-01-27 | [22003](https://github.com/airbytehq/airbyte/pull/22003) | Set `AvailabilityStrategy` for streams explicitly to `None` || | | | | | 0.2.83 | 2023-01-13 | [21149](https://github.com/airbytehq/airbyte/pull/21149) | Videos stream remove filtering | | 0.2.82 | 2023-01-09 | [21149](https://github.com/airbytehq/airbyte/pull/21149) | Fix AdAccount schema | | 0.2.81 | 2023-01-05 | [21057](https://github.com/airbytehq/airbyte/pull/21057) | Remove unsupported fields from request | From 829fe63f6e981627fb2c379319cfa417e1c8f0aa Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 23:47:51 -0600 Subject: [PATCH 167/195] Turn off default httpavailabilitystrategy for source-intercom (GA) (#22010) * Turn off default for source-intercom (GA) * Update source.py * Update intercom.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-intercom/Dockerfile | 2 +- .../connectors/source-intercom/source_intercom/source.py | 5 +++++ docs/integrations/sources/intercom.md | 3 ++- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index e55c0f822fa2f..579f29ce8e63e 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -832,7 +832,7 @@ - name: Intercom sourceDefinitionId: d8313939-3782-41b0-be29-b3ca20d8dd3a dockerRepository: airbyte/source-intercom - dockerImageTag: 0.1.29 + dockerImageTag: 0.1.30 documentationUrl: https://docs.airbyte.com/integrations/sources/intercom icon: intercom.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index d025a001834d9..450ed9d22be8f 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -6824,7 +6824,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-intercom:0.1.29" +- dockerImage: "airbyte/source-intercom:0.1.30" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/intercom" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-intercom/Dockerfile b/airbyte-integrations/connectors/source-intercom/Dockerfile index 6377255906f5c..6f258a0de2ebe 100644 --- a/airbyte-integrations/connectors/source-intercom/Dockerfile +++ b/airbyte-integrations/connectors/source-intercom/Dockerfile @@ -35,5 +35,5 @@ COPY source_intercom ./source_intercom ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.29 +LABEL io.airbyte.version=0.1.30 LABEL io.airbyte.name=airbyte/source-intercom diff --git a/airbyte-integrations/connectors/source-intercom/source_intercom/source.py b/airbyte-integrations/connectors/source-intercom/source_intercom/source.py index 161c89ff3bfd3..9ee1c8bd344b1 100755 --- a/airbyte-integrations/connectors/source-intercom/source_intercom/source.py +++ b/airbyte-integrations/connectors/source-intercom/source_intercom/source.py @@ -12,6 +12,7 @@ from airbyte_cdk.logger import AirbyteLogger from airbyte_cdk.sources import AbstractSource from airbyte_cdk.sources.streams import Stream +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.streams.http.requests_native_auth import TokenAuthenticator from requests.auth import AuthBase @@ -42,6 +43,10 @@ def authenticator(self): return self._session.auth return super().authenticator + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def next_page_token(self, response: requests.Response, **kwargs) -> Optional[Mapping[str, Any]]: """ Abstract method of HttpStream - should be overwritten. diff --git a/docs/integrations/sources/intercom.md b/docs/integrations/sources/intercom.md index ed93742ea99d2..7f8bf4f5c2bdd 100644 --- a/docs/integrations/sources/intercom.md +++ b/docs/integrations/sources/intercom.md @@ -48,7 +48,8 @@ The Intercom connector should not run into Intercom API limitations under normal ## Changelog | Version | Date | Pull Request | Subject | -| :------ | :--------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | +|:--------| :--------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | +| 0.1.30 | 2023-01-27 | [22010](https://github.com/airbytehq/airbyte/pull/22010) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 0.1.29 | 2022-10-31 | [18681](https://github.com/airbytehq/airbyte/pull/18681) | Define correct version for airbyte-cdk~=0.2 | | 0.1.28 | 2022-10-20 | [18216](https://github.com/airbytehq/airbyte/pull/18216) | Use airbyte-cdk~=0.2.0 with SQLite caching | | 0.1.27 | 2022-08-28 | [17326](https://github.com/airbytehq/airbyte/pull/17326) | Migrate to per-stream states. | From 57d44e68fce077e559993ff09e1ab97788423828 Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 23:48:03 -0600 Subject: [PATCH 168/195] Turn off default httpavailabilitystrategy for source-mixpanel (GA) (#22017) * Turn off default for source-mixpanel (GA) * Update base.py * Update mixpanel.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-mixpanel/Dockerfile | 2 +- .../source-mixpanel/source_mixpanel/streams/base.py | 5 +++++ docs/integrations/sources/mixpanel.md | 3 ++- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 579f29ce8e63e..5782c7eb57a4e 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1063,7 +1063,7 @@ - name: Mixpanel sourceDefinitionId: 12928b32-bf0a-4f1e-964f-07e12e37153a dockerRepository: airbyte/source-mixpanel - dockerImageTag: 0.1.29 + dockerImageTag: 0.1.30 documentationUrl: https://docs.airbyte.com/integrations/sources/mixpanel icon: mixpanel.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 450ed9d22be8f..9d88278e9d529 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -8701,7 +8701,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-mixpanel:0.1.29" +- dockerImage: "airbyte/source-mixpanel:0.1.30" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/mixpanel" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-mixpanel/Dockerfile b/airbyte-integrations/connectors/source-mixpanel/Dockerfile index cd44abfc08fe8..4670149deea78 100644 --- a/airbyte-integrations/connectors/source-mixpanel/Dockerfile +++ b/airbyte-integrations/connectors/source-mixpanel/Dockerfile @@ -13,5 +13,5 @@ ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.29 +LABEL io.airbyte.version=0.1.30 LABEL io.airbyte.name=airbyte/source-mixpanel diff --git a/airbyte-integrations/connectors/source-mixpanel/source_mixpanel/streams/base.py b/airbyte-integrations/connectors/source-mixpanel/source_mixpanel/streams/base.py index 2ddd6af68a1dc..7f0e33ca3acf9 100644 --- a/airbyte-integrations/connectors/source-mixpanel/source_mixpanel/streams/base.py +++ b/airbyte-integrations/connectors/source-mixpanel/source_mixpanel/streams/base.py @@ -9,6 +9,7 @@ import pendulum import requests +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.streams.http.auth import HttpAuthenticator from pendulum import Date @@ -55,6 +56,10 @@ def __init__( super().__init__(authenticator=authenticator) + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def next_page_token(self, response: requests.Response) -> Optional[Mapping[str, Any]]: """Define abstract method""" return None diff --git a/docs/integrations/sources/mixpanel.md b/docs/integrations/sources/mixpanel.md index 8ba35055c5871..c90209c7e55e5 100644 --- a/docs/integrations/sources/mixpanel.md +++ b/docs/integrations/sources/mixpanel.md @@ -49,7 +49,8 @@ Syncing huge date windows may take longer due to Mixpanel's low API rate-limits ## CHANGELOG | Version | Date | Pull Request | Subject | -| :------ | :--------- | :------------------------------------------------------- | :--------------------------------------------------------------------------------------------------- | +|:--------| :--------- | :------------------------------------------------------- | :--------------------------------------------------------------------------------------------------- | +| 0.1.30 | 2023-01-27 | [22017](https://github.com/airbytehq/airbyte/pull/22017) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 0.1.29 | 2022-11-02 | [18846](https://github.com/airbytehq/airbyte/pull/18846) | For "export" stream make line parsing more robust | | 0.1.28 | 2022-10-06 | [17699](https://github.com/airbytehq/airbyte/pull/17699) | Fix discover step issue cursor field None | | 0.1.27 | 2022-09-29 | [17415](https://github.com/airbytehq/airbyte/pull/17415) | Disable stream "cohort_members" on discover if not access | From 68bbcdcbb28c276c78cca62994cc6d5ddb6576b3 Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 23:48:20 -0600 Subject: [PATCH 169/195] Turn off default httpavailabilitystrategy for source-tiktok-marketing (GA) (#22044) * Turn off default for source-tiktok-marketing (GA) * Update tiktok-marketing.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-tiktok-marketing/Dockerfile | 2 +- .../source_tiktok_marketing/streams.py | 5 +++++ docs/integrations/sources/tiktok-marketing.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 5782c7eb57a4e..c7eca2acc58e3 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1760,7 +1760,7 @@ - name: TikTok Marketing sourceDefinitionId: 4bfac00d-ce15-44ff-95b9-9e3c3e8fbd35 dockerRepository: airbyte/source-tiktok-marketing - dockerImageTag: 2.0.0 + dockerImageTag: 2.0.1 documentationUrl: https://docs.airbyte.com/integrations/sources/tiktok-marketing icon: tiktok.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 9d88278e9d529..d8900c53a9262 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -14923,7 +14923,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-tiktok-marketing:2.0.0" +- dockerImage: "airbyte/source-tiktok-marketing:2.0.1" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/tiktok-marketing" changelogUrl: "https://docs.airbyte.com/integrations/sources/tiktok-marketing" diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/Dockerfile b/airbyte-integrations/connectors/source-tiktok-marketing/Dockerfile index 4602f3494a6f0..38780ac1e4676 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/Dockerfile +++ b/airbyte-integrations/connectors/source-tiktok-marketing/Dockerfile @@ -32,5 +32,5 @@ COPY source_tiktok_marketing ./source_tiktok_marketing ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=2.0.0 +LABEL io.airbyte.version=2.0.1 LABEL io.airbyte.name=airbyte/source-tiktok-marketing diff --git a/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/streams.py b/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/streams.py index 855658f596f40..f426710b7169f 100644 --- a/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/streams.py +++ b/airbyte-integrations/connectors/source-tiktok-marketing/source_tiktok_marketing/streams.py @@ -15,6 +15,7 @@ import pydantic import requests from airbyte_cdk.models import SyncMode +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.core import package_name_from_class from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.utils.schema_helpers import ResourceSchemaLoader @@ -153,6 +154,10 @@ def __init__(self, **kwargs): # only sandbox has non-empty self._advertiser_id self.is_sandbox = bool(self._advertiser_id) + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapping]: """All responses have the similar structure: { diff --git a/docs/integrations/sources/tiktok-marketing.md b/docs/integrations/sources/tiktok-marketing.md index 4eecbd41ee6fc..53da4ce1b44c8 100644 --- a/docs/integrations/sources/tiktok-marketing.md +++ b/docs/integrations/sources/tiktok-marketing.md @@ -550,6 +550,7 @@ The connector is restricted by [requests limitation](https://ads.tiktok.com/mark | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:----------------------------------------------------------------------------------------------| +| 2.0.1 | 2023-01-27 | [22044](https://github.com/airbytehq/airbyte/pull/22044) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 2.0.0 | 2022-12-20 | [20415](https://github.com/airbytehq/airbyte/pull/20415) | Update schema types for `AudienceReports` and `BasicReports` streams. | | 1.0.1 | 2022-12-16 | [20598](https://github.com/airbytehq/airbyte/pull/20598) | Remove Audience Reports with Hourly granularity due to deprecated dimension. | | 1.0.0 | 2022-12-05 | [19758](https://github.com/airbytehq/airbyte/pull/19758) | Convert `mobile_app_id` from integer to string in AudienceReport streams. | From 19e59829016be903c0a22a9c0d7b99e2fa2a8b0a Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 23:48:29 -0600 Subject: [PATCH 170/195] Turn off default httpavailabilitystrategy for source-linkedin-ads (GA) (#22013) * Turn off default for source-linkedin-ads (GA) * Update source.py * Add missing changelog * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-linkedin-ads/Dockerfile | 2 +- .../source-linkedin-ads/source_linkedin_ads/source.py | 5 +++++ docs/integrations/sources/linkedin-ads.md | 3 ++- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index c7eca2acc58e3..bc447710f2fad 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -935,7 +935,7 @@ - name: LinkedIn Ads sourceDefinitionId: 137ece28-5434-455c-8f34-69dc3782f451 dockerRepository: airbyte/source-linkedin-ads - dockerImageTag: 0.1.12 + dockerImageTag: 0.1.13 documentationUrl: https://docs.airbyte.com/integrations/sources/linkedin-ads icon: linkedin.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index d8900c53a9262..7e26691b160f6 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -7626,7 +7626,7 @@ path_in_connector_config: - "credentials" - "client_secret" -- dockerImage: "airbyte/source-linkedin-ads:0.1.12" +- dockerImage: "airbyte/source-linkedin-ads:0.1.13" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/linkedin-ads" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-linkedin-ads/Dockerfile b/airbyte-integrations/connectors/source-linkedin-ads/Dockerfile index d0bfa957d1b10..65e06ab441614 100644 --- a/airbyte-integrations/connectors/source-linkedin-ads/Dockerfile +++ b/airbyte-integrations/connectors/source-linkedin-ads/Dockerfile @@ -33,5 +33,5 @@ COPY source_linkedin_ads ./source_linkedin_ads ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.12 +LABEL io.airbyte.version=0.1.13 LABEL io.airbyte.name=airbyte/source-linkedin-ads diff --git a/airbyte-integrations/connectors/source-linkedin-ads/source_linkedin_ads/source.py b/airbyte-integrations/connectors/source-linkedin-ads/source_linkedin_ads/source.py index a4a3bcb5a692f..022a81d78cb54 100644 --- a/airbyte-integrations/connectors/source-linkedin-ads/source_linkedin_ads/source.py +++ b/airbyte-integrations/connectors/source-linkedin-ads/source_linkedin_ads/source.py @@ -14,6 +14,7 @@ from airbyte_cdk.models import SyncMode from airbyte_cdk.sources import AbstractSource from airbyte_cdk.sources.streams import Stream +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.streams.http.auth import Oauth2Authenticator, TokenAuthenticator from airbyte_cdk.sources.streams.http.exceptions import DefaultBackoffException @@ -42,6 +43,10 @@ def accounts(self): """Property to return the list of the user Account Ids from input""" return ",".join(map(str, self.config.get("account_ids"))) + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def path(self, **kwargs) -> str: """Returns the API endpoint path for stream, from `endpoint` class attribute.""" return self.endpoint diff --git a/docs/integrations/sources/linkedin-ads.md b/docs/integrations/sources/linkedin-ads.md index 0752cb11fca7e..0f22d3e3f0d61 100644 --- a/docs/integrations/sources/linkedin-ads.md +++ b/docs/integrations/sources/linkedin-ads.md @@ -182,7 +182,8 @@ After 5 unsuccessful attempts - the connector will stop the sync operation. In s ## Changelog | Version | Date | Pull Request | Subject | -| :------ | :--------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------- | +|:--------|:-----------|:---------------------------------------------------------| :-------------------------------------------------------------------------------------------------------------- | +| 0.1.13 | 2023-01-27 | [22013](https://github.com/airbytehq/airbyte/pull/22013) | for adDirectSponsoredContents stream skip accounts which are part of organization | | 0.1.12 | 2022-10-18 | [18111](https://github.com/airbytehq/airbyte/pull/18111) | for adDirectSponsoredContents stream skip accounts which are part of organization | | 0.1.11 | 2022-10-07 | [17724](https://github.com/airbytehq/airbyte/pull/17724) | Retry 429/5xx errors when refreshing access token | | 0.1.10 | 2022-09-28 | [17326](https://github.com/airbytehq/airbyte/pull/17326) | Migrate to per-stream states. | From 86c0f664b4bd94bad205fcd6cf51653b84d0718e Mon Sep 17 00:00:00 2001 From: Ella Rohm-Ensing Date: Fri, 27 Jan 2023 23:49:20 -0600 Subject: [PATCH 171/195] Turn off default httpavailabilitystrategy for source-salesforce (GA) (#22016) * Turn off default for source-salesforce (GA) * Update streams.py * Update salesforce.md * Update salesforce.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- airbyte-integrations/connectors/source-salesforce/Dockerfile | 2 +- .../source-salesforce/source_salesforce/streams.py | 5 +++++ docs/integrations/sources/salesforce.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index bc447710f2fad..ff05456f5dc81 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -1544,7 +1544,7 @@ - name: Salesforce sourceDefinitionId: b117307c-14b6-41aa-9422-947e34922962 dockerRepository: airbyte/source-salesforce - dockerImageTag: 1.0.29 + dockerImageTag: 1.0.30 documentationUrl: https://docs.airbyte.com/integrations/sources/salesforce icon: salesforce.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 7e26691b160f6..9407c5fb26b2e 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -13095,7 +13095,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-salesforce:1.0.29" +- dockerImage: "airbyte/source-salesforce:1.0.30" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/salesforce" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-salesforce/Dockerfile b/airbyte-integrations/connectors/source-salesforce/Dockerfile index 6a43255b7a187..1080058850936 100644 --- a/airbyte-integrations/connectors/source-salesforce/Dockerfile +++ b/airbyte-integrations/connectors/source-salesforce/Dockerfile @@ -13,5 +13,5 @@ RUN pip install . ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=1.0.29 +LABEL io.airbyte.version=1.0.30 LABEL io.airbyte.name=airbyte/source-salesforce diff --git a/airbyte-integrations/connectors/source-salesforce/source_salesforce/streams.py b/airbyte-integrations/connectors/source-salesforce/source_salesforce/streams.py index fb5df8ee196e4..59b78b9a814aa 100644 --- a/airbyte-integrations/connectors/source-salesforce/source_salesforce/streams.py +++ b/airbyte-integrations/connectors/source-salesforce/source_salesforce/streams.py @@ -16,6 +16,7 @@ import requests # type: ignore[import] from airbyte_cdk.models import ConfiguredAirbyteCatalog, SyncMode from airbyte_cdk.sources.streams import Stream +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer from numpy import nan @@ -60,6 +61,10 @@ def primary_key(self) -> Optional[Union[str, List[str], List[List[str]]]]: def url_base(self) -> str: return self.sf_api.instance_url + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def path(self, next_page_token: Mapping[str, Any] = None, **kwargs: Any) -> str: if next_page_token: """ diff --git a/docs/integrations/sources/salesforce.md b/docs/integrations/sources/salesforce.md index b8d7a4e0a344b..8797691d015f0 100644 --- a/docs/integrations/sources/salesforce.md +++ b/docs/integrations/sources/salesforce.md @@ -129,6 +129,7 @@ Now that you have set up the Salesforce source connector, check out the followin | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------| +| 1.0.30 | 2023-01-27 | [22016](https://github.com/airbytehq/airbyte/pull/22016) | Set `AvailabilityStrategy` for streams explicitly to `None` | | 1.0.29 | 2023-01-05 | [20886](https://github.com/airbytehq/airbyte/pull/20886) | Remove `ActivityMetric` stream | | 1.0.28 | 2022-12-29 | [20927](https://github.com/airbytehq/airbyte/pull/20927) | Fix tests; add expected records | | 1.0.27 | 2022-11-29 | [19869](https://github.com/airbytehq/airbyte/pull/19869) | Remove `AccountHistory` from unsupported BULK streams | From f9816680edd580b06ad6f9804345d54e26f447a3 Mon Sep 17 00:00:00 2001 From: Baz Date: Sat, 28 Jan 2023 09:16:55 +0200 Subject: [PATCH 172/195] =?UTF-8?q?=F0=9F=8E=89=C2=A0=F0=9F=90=9B=C2=A0Sou?= =?UTF-8?q?rce=20Airtable:=20cast=20native=20Airtable=20Types=20to=20JSONS?= =?UTF-8?q?chema=20Types=20(#21962)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/seed/source_definitions.yaml | 2 +- .../src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-airtable/Dockerfile | 2 +- .../acceptance-test-config.yml | 9 +- .../integration_tests/expected_records.jsonl | 84 ++++++++--------- .../source_airtable/schema_helpers.py | 94 +++++++++++++++++-- docs/integrations/sources/airtable.md | 47 +++++++++- 7 files changed, 182 insertions(+), 58 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index ff05456f5dc81..8f2f8d5a46626 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -17,7 +17,7 @@ - name: Airtable sourceDefinitionId: 14c6e7ea-97ed-4f5e-a7b5-25e9a80b8212 dockerRepository: airbyte/source-airtable - dockerImageTag: 1.0.2 + dockerImageTag: 2.0.0 documentationUrl: https://docs.airbyte.com/integrations/sources/airtable icon: airtable.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index 9407c5fb26b2e..a152dfdcad847 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -178,7 +178,7 @@ supportsNormalization: false supportsDBT: false supported_destination_sync_modes: [] -- dockerImage: "airbyte/source-airtable:1.0.2" +- dockerImage: "airbyte/source-airtable:2.0.0" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/airtable" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-airtable/Dockerfile b/airbyte-integrations/connectors/source-airtable/Dockerfile index e35b17af0ef0b..a0b9f2b6dc296 100644 --- a/airbyte-integrations/connectors/source-airtable/Dockerfile +++ b/airbyte-integrations/connectors/source-airtable/Dockerfile @@ -34,5 +34,5 @@ COPY source_airtable ./source_airtable ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=1.0.2 +LABEL io.airbyte.version=2.0.0 LABEL io.airbyte.name=airbyte/source-airtable diff --git a/airbyte-integrations/connectors/source-airtable/acceptance-test-config.yml b/airbyte-integrations/connectors/source-airtable/acceptance-test-config.yml index 79dfba553bade..965765ef04486 100644 --- a/airbyte-integrations/connectors/source-airtable/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-airtable/acceptance-test-config.yml @@ -19,6 +19,13 @@ acceptance_tests: discovery: tests: - config_path: "secrets/config.json" + # the static `string` schema is replaced with casted to JSONSchema + backward_compatibility_tests_config: + disable_for_version: "1.0.2" + - config_path: "secrets/config_oauth.json" + # the static `string` schema is replaced with casted to JSONSchema + backward_compatibility_tests_config: + disable_for_version: "1.0.2" basic_read: tests: - config_path: "secrets/config.json" @@ -26,7 +33,7 @@ acceptance_tests: path: "integration_tests/expected_records.jsonl" extra_fields: true exact_order: true - extra_records: false + extra_records: false - config_path: "secrets/config_oauth.json" expect_records: path: "integration_tests/expected_records.jsonl" diff --git a/airbyte-integrations/connectors/source-airtable/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-airtable/integration_tests/expected_records.jsonl index 9bb46be7b4301..3f293d2a7e947 100644 --- a/airbyte-integrations/connectors/source-airtable/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-airtable/integration_tests/expected_records.jsonl @@ -1,42 +1,42 @@ -{"stream": "users/table_1", "data": {"_airtable_id": "recgRMRMHxgcgJeDe", "_airtable_created_time": "2021-11-16T13:30:17.000Z", "name": "test2", "status": "test", "notes": "test_note2"}, "emitted_at": 1674678240918} -{"stream": "users/table_1", "data": {"_airtable_id": "recmJkSF51IKUGmlJ", "_airtable_created_time": "2022-12-22T20:58:05.000Z", "name": "test4_after_empty", "clo_with_empty_strings": "bla bla bla", "status": "In progress", "notes": "test_note4"}, "emitted_at": 1674678240919} -{"stream": "users/table_1", "data": {"_airtable_id": "recvp1qYYBlcOrzsc", "_airtable_created_time": "2021-11-16T13:30:17.000Z", "name": "test3", "clo_with_empty_strings": "test text here", "status": "test", "notes": "test-note3"}, "emitted_at": 1674678240919} -{"stream": "users/table_1", "data": {"_airtable_id": "reczEeQV9NrzFlVFF", "_airtable_created_time": "2021-11-16T13:30:17.000Z", "name": "test", "status": "test", "notes": "test_note"}, "emitted_at": 1674678240919} -{"stream": "users/table_2", "data": {"_airtable_id": "recB3upao4wpmeCEf", "_airtable_created_time": "2021-11-16T13:32:31.000Z", "status": "In progress", "name": "test2", "notes": "test2"}, "emitted_at": 1674678241542} -{"stream": "users/table_2", "data": {"_airtable_id": "recWeE6SiYeri4Duq", "_airtable_created_time": "2021-11-16T13:32:31.000Z", "status": "Todo", "name": "test", "notes": "test"}, "emitted_at": 1674678241542} -{"stream": "users/table_2", "data": {"_airtable_id": "recXn7kXbeEsJfDJQ", "_airtable_created_time": "2022-12-28T11:41:10.000Z", "name": " "}, "emitted_at": 1674678241543} -{"stream": "users/table_2", "data": {"_airtable_id": "recmMfFAec8plcOUY", "_airtable_created_time": "2021-11-16T13:32:31.000Z", "status": "Done", "name": "test 3", "notes": "test 3"}, "emitted_at": 1674678241543} -{"stream": "users/table_6", "data": {"_airtable_id": "recHyy86oge9j5cYP", "_airtable_created_time": "2023-01-25T02:04:26.000Z", "name": "test_negative", "table_6": "['recHyy86oge9j5cYP', 'recoY6ShPkGpav3Se']", "float": "0.3", "status": "In progress", "integer": "-1", "assignee": "2", "assignee_(from_table_6)": "[2, 2]"}, "emitted_at": 1674678242168} -{"stream": "users/table_6", "data": {"_airtable_id": "recLhKYa9btCCqmxs", "_airtable_created_time": "2023-01-25T02:04:26.000Z", "name": "test_attachment", "table_6": "['recLhKYa9btCCqmxs', 'recoY6ShPkGpav3Se']", "float": "0.3", "status": "Todo", "integer": "1", "assignee": "2", "assignee_(from_table_6)": "[2, 2]"}, "emitted_at": 1674678242168} -{"stream": "users/table_6", "data": {"_airtable_id": "recoY6ShPkGpav3Se", "_airtable_created_time": "2023-01-25T02:04:26.000Z", "name": "test_normal", "table_6": "['recoY6ShPkGpav3Se', 'recHyy86oge9j5cYP', 'recLhKYa9btCCqmxs']", "float": "0.7", "status": "Done", "integer": "2", "assignee": "2", "assignee_(from_table_6)": "[2, 2, 2]"}, "emitted_at": 1674678242169} -{"stream": "users/field_type_test", "data": {"_airtable_id": "rec0UJKftqCPj7zJu", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": "17", "date": "2022-09-30", "multiple_select_(no_colors)": "['1', '2', '3']", "percent": "0", "rating": "5", "multiple_select_(colors)": "['1', '2', '3']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": "True", "number": "1", "duration": "0", "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": "1", "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242858} -{"stream": "users/field_type_test", "data": {"_airtable_id": "rec3tSj3Yzi42uuS0", "_airtable_created_time": "2022-09-30T16:06:49.000Z", "id": "3", "100_columns": "['reccHYZ004lOuxLFH']", "name": "Blank", "created_(with_time)": "2022-09-30T16:06:49.000Z", "created_(w/o_time)": "2022-09-30", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242859} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recAa5DUEhppIeeax", "_airtable_created_time": "2022-12-01T20:27:30.000Z", "email": "integration-test-user@airbyte.io", "id": "9", "date": "2022-09-30", "multiple_select_(no_colors)": "['1', '2', '3']", "percent": "0", "rating": "5", "multiple_select_(colors)": "['1', '2', '3']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": "True", "number": "1", "duration": "0", "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": "1", "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:30.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242859} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recG989xsdfSxookl", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": "23", "date": "2022-10-03", "multiple_select_(no_colors)": "['a', 'b', 'c']", "percent": "1", "rating": "3", "multiple_select_(colors)": "['a', 'b', 'c']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "123123871234.33", "duration": "169409880", "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": "1128312.23", "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242860} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recGVqF9BIpDD7Gj1", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": "22", "date": "2022-09-30", "multiple_select_(no_colors)": "['1', '2', '3']", "percent": "0", "rating": "5", "multiple_select_(colors)": "['1', '2', '3']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": "True", "number": "1", "duration": "0", "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": "1", "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242860} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recHNlOoFvp6KjeZD", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "id": "16", "name": "Blank", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242861} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recL6sfQP0FyJr3Ua", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "id": "21", "name": "Blank", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242862} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recMtt4tMmdNbwV5R", "_airtable_created_time": "2022-12-01T20:27:20.000Z", "id": "8", "name": "Blank", "created_(with_time)": "2022-12-01T20:27:20.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242862} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recOz5BBo3Ey3ldb8", "_airtable_created_time": "2022-12-01T20:27:11.000Z", "email": "integration-test-user@airbyte.io", "id": "5", "date": "2022-10-03", "multiple_select_(no_colors)": "['a', 'b', 'c']", "percent": "1", "rating": "3", "multiple_select_(colors)": "['a', 'b', 'c']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "100_columns": "['recXVzpNmtsBcjrA2']", "number": "123123871234.33", "duration": "169409880", "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": "1128312.23", "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:11.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242862} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recSbSBPspxs22165", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": "15", "date": "2022-10-03", "multiple_select_(no_colors)": "['a', 'b', 'c']", "percent": "1", "rating": "3", "multiple_select_(colors)": "['a', 'b', 'c']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "123123871234.33", "duration": "169409880", "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": "1128312.23", "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242863} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recUzRSGAf5VYtXfZ", "_airtable_created_time": "2022-09-30T16:06:49.000Z", "email": "integration-test-user@airbyte.io", "id": "1", "date": "2022-09-30", "multiple_select_(no_colors)": "['1', '2', '3']", "percent": "0", "rating": "5", "multiple_select_(colors)": "['1', '2', '3']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": "True", "100_columns": "['rec2lCkcy9d0fZi8h']", "number": "1", "duration": "0", "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": "1", "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-09-30T16:06:49.000Z", "created_(w/o_time)": "2022-09-30", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242864} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recbQy9sb5BM1K3Z1", "_airtable_created_time": "2022-12-01T20:27:17.000Z", "email": "integration-test-user@airbyte.io", "id": "6", "date": "2022-09-30", "multiple_select_(no_colors)": "['1', '2', '3']", "percent": "0", "rating": "5", "multiple_select_(colors)": "['1', '2', '3']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": "True", "number": "1", "duration": "0", "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": "1", "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:17.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242865} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recehwpjPyD1PLFkr", "_airtable_created_time": "2022-12-01T20:27:10.000Z", "email": "integration-test-user@airbyte.io", "id": "4", "date": "2022-09-30", "multiple_select_(no_colors)": "['1', '2', '3']", "percent": "0", "rating": "5", "multiple_select_(colors)": "['1', '2', '3']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": "True", "number": "1", "duration": "0", "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": "1", "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:10.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242865} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recfdnbGNkUx1Rs5F", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": "19", "date": "2022-09-30", "multiple_select_(no_colors)": "['1', '2', '3']", "percent": "0", "rating": "5", "multiple_select_(colors)": "['1', '2', '3']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": "True", "number": "1", "duration": "0", "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": "1", "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242866} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recpkKhLwcFYbJLtJ", "_airtable_created_time": "2022-12-01T20:27:43.000Z", "email": "integration-test-user@airbyte.io", "id": "14", "date": "2022-09-30", "multiple_select_(no_colors)": "['1', '2', '3']", "percent": "0", "rating": "5", "multiple_select_(colors)": "['1', '2', '3']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": "True", "number": "1", "duration": "0", "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": "1", "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:43.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242867} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recqurXMR6u1PO5wT", "_airtable_created_time": "2022-12-01T20:27:18.000Z", "email": "integration-test-user@airbyte.io", "id": "7", "date": "2022-10-03", "multiple_select_(no_colors)": "['a', 'b', 'c']", "percent": "1", "rating": "3", "multiple_select_(colors)": "['a', 'b', 'c']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "123123871234.33", "duration": "169409880", "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": "1128312.23", "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:18.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242867} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recuYRu9z5dlkHxop", "_airtable_created_time": "2022-12-01T20:27:30.000Z", "email": "integration-test-user@airbyte.io", "id": "10", "date": "2022-10-03", "multiple_select_(no_colors)": "['a', 'b', 'c']", "percent": "1", "rating": "3", "multiple_select_(colors)": "['a', 'b', 'c']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "123123871234.33", "duration": "169409880", "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": "1128312.23", "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:30.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242868} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recw3jDJFziB562hu", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": "18", "date": "2022-10-03", "multiple_select_(no_colors)": "['a', 'b', 'c']", "percent": "1", "rating": "3", "multiple_select_(colors)": "['a', 'b', 'c']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "123123871234.33", "duration": "169409880", "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": "1128312.23", "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242869} -{"stream": "users/field_type_test", "data": {"_airtable_id": "recyJGdkZikJbLFRi", "_airtable_created_time": "2022-09-30T16:06:49.000Z", "email": "integration-test-user@airbyte.io", "id": "2", "date": "2022-10-03", "multiple_select_(no_colors)": "['a', 'b', 'c']", "percent": "1", "rating": "3", "multiple_select_(colors)": "['a', 'b', 'c']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "123123871234.33", "duration": "169409880", "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": "1128312.23", "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-09-30T16:06:49.000Z", "created_(w/o_time)": "2022-09-30", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242869} -{"stream": "users/field_type_test", "data": {"_airtable_id": "reczDi9vTuH3ezfJM", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": "20", "date": "2022-10-03", "multiple_select_(no_colors)": "['a', 'b', 'c']", "percent": "1", "rating": "3", "multiple_select_(colors)": "['a', 'b', 'c']", "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "123123871234.33", "duration": "169409880", "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": "1128312.23", "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": "[{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}]", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678242870} -{"stream": "users/50_columns", "data": {"_airtable_id": "rec2lCkcy9d0fZi8h", "_airtable_created_time": "2022-12-02T17:29:41.000Z", "notes": "dasdafsdag", "phone_3": "(999) 999-9999", "tags_2": "['alpha', 'issue']", "select_2": "top", "date_2": "2023-01-03", "euro": "136.46", "collaborator": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "423", "assignee": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "percent_2": "0.45299999999999996", "url": "airbyte.com", "duration": "9900", "notes_3": " dfhsh f g dh", "status": "Done", "rating_2": "1", "barcode": "{'text': '312515435'}", "number_2": "3453", "rating": "4", "field_type_test": "['recUzRSGAf5VYtXfZ']", "usd": "143.64", "done": "True", "id": "1", "notes_2": "1. fsafsf sfkjkl fsafs", "phone_2": "(222) 222-2222", "email": "email@airbyte.io", "percent_3": "0.24300000000000002", "select": "1st", "int": "65", "label_2": "Lorem", "date": "2022-12-02", "label_3": "line", "name": "Thing 1", "phone": "(999) 999-9999", "label": "Nulla quis lorem ut libero malesuada feugiat.", "duration_2": "20580", "tags": "['tag1']", "decimal": "5.8797", "percent": "0.2", "email_(from_field_type_test)": "['integration-test-user@airbyte.io']", "count_(field_type_test)": "1", "created_(w/o_time)_(from_field_type_test)": "['2022-09-30']", "created": "2022-12-02T17:29:41.000Z", "last_modified": "2023-01-24T11:12:27.000Z", "last_modified_2": "2023-01-24T11:12:27.000Z", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678243503} -{"stream": "users/50_columns", "data": {"_airtable_id": "recXVzpNmtsBcjrA2", "_airtable_created_time": "2022-12-02T17:29:41.000Z", "notes": "opoiwepoirwe", "phone_3": "(999) 999-9999", "tags_2": "['ga']", "select_2": "bottom", "date_2": "2023-01-31", "euro": "279.62", "collaborator": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": "34535.5", "percent_2": "0.624", "duration": "10440", "notes_3": "hdfhe e et e true ttue ", "status": "Todo", "rating_2": "4", "barcode": "{'text': '351164554'}", "rating": "3", "field_type_test": "['recOz5BBo3Ey3ldb8']", "usd": "294.34", "done": "True", "url_2": "airbyte.com", "id": "3", "notes_2": "3. flsflkj;flkjsf fskjlf lakjf; lskaj;klsjf", "phone_2": "(444) 444-4444", "percent_3": "0.13699999999999998", "select": "3rd", "int": "98", "date": "2022-12-14", "label_3": "line", "name": "Thing 3", "phone": "(999) 999-9999", "label": "Curabitur aliquet quam id dui posuere blandit.", "duration_2": "19740", "decimal": "6.6", "percent": "0.3", "email_(from_field_type_test)": "['integration-test-user@airbyte.io']", "count_(field_type_test)": "1", "created_(w/o_time)_(from_field_type_test)": "['2022-12-01']", "created": "2022-12-02T17:29:41.000Z", "last_modified": "2023-01-24T11:12:12.000Z", "last_modified_2": "2023-01-24T11:12:12.000Z", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678243504} -{"stream": "users/50_columns", "data": {"_airtable_id": "reccHYZ004lOuxLFH", "_airtable_created_time": "2022-12-02T17:29:41.000Z", "notes": "hjyyfhgjjfgjr", "phone_3": "(999) 999-9999", "tags_2": "['beta', 'no issue']", "select_2": "mid", "date_2": "2023-01-17", "euro": "325.13", "number": "22424.5", "assignee": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "percent_2": "0.562", "duration": "11520", "notes_3": "fhdfhdhgf hfh hdfgh", "status": "In progress", "barcode": "{'text': '5531515315'}", "number_2": "3452", "rating": "5", "field_type_test": "['rec3tSj3Yzi42uuS0']", "usd": "342.24", "url_2": "docs.airbyte.com", "id": "2", "notes_2": "2. fskldf f;sfkjk s;lkjfkls", "phone_2": "(333) 333-3333", "email": "what@airbyte.io", "percent_3": "0.532", "select": "2nd", "int": "53", "date": "2022-11-10", "label_3": "line", "name": "Thing 2", "phone": "(999) 999-9999", "label": "Quisque velit nisi, pretium ut lacinia in, elementum id enim.", "duration_2": "18180", "collaborator_2": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "tags": "['tag2', 'tag3']", "done_2": "True", "decimal": "4.134", "percent": "0.15", "count_(field_type_test)": "1", "created_(w/o_time)_(from_field_type_test)": "['2022-09-30']", "created": "2022-12-02T17:29:41.000Z", "last_modified": "2023-01-24T11:12:11.000Z", "last_modified_2": "2023-01-24T11:12:11.000Z", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674678243505} -{"stream": "users/checkboxes", "data": {"_airtable_id": "recLvpJ4k4mRG38My", "_airtable_created_time": "2022-12-02T19:50:00.000Z", "done_18": "True", "done_21": "True", "done_6": "True", "done_11": "True", "done_24": "True", "done_2": "True", "done_12": "True", "done_16": "True", "done_4": "True", "done_10": "True", "done_7": "True", "done_22": "True", "done_23": "True", "done_20": "True", "name": "Cloud"}, "emitted_at": 1674678244135} -{"stream": "users/checkboxes", "data": {"_airtable_id": "reckszXRiFfg11IYD", "_airtable_created_time": "2022-12-02T19:50:00.000Z", "done_21": "True", "done_6": "True", "done_17": "True", "done_5": "True", "done_9": "True", "done_11": "True", "done_16": "True", "done_25": "True", "done_7": "True", "done_22": "True", "done_13": "True", "done_3": "True", "name": "Support"}, "emitted_at": 1674678244136} -{"stream": "users/checkboxes", "data": {"_airtable_id": "recmaYwfPMvZtwTSJ", "_airtable_created_time": "2022-12-02T19:50:00.000Z", "done_5": "True", "done_9": "True", "done_19": "True", "done_12": "True", "done": "True", "done_16": "True", "done_14": "True", "done_4": "True", "done_25": "True", "done_7": "True", "done_23": "True", "done_20": "True", "name": "Airbyte"}, "emitted_at": 1674678244136} -{"stream": "untitled_base/table_1", "data": {"_airtable_id": "recJ0l923fOFw6qbl", "_airtable_created_time": "2021-12-09T07:54:15.000Z", "name": "test2", "notes": "test2", "status": "In progress"}, "emitted_at": 1674678244850} -{"stream": "untitled_base/table_1", "data": {"_airtable_id": "recNbrGzLJfOy6EjC", "_airtable_created_time": "2022-12-28T11:43:37.000Z", "name": "blank"}, "emitted_at": 1674678244851} -{"stream": "untitled_base/table_1", "data": {"_airtable_id": "recZX1Je5k4nXhTi0", "_airtable_created_time": "2021-12-09T07:54:15.000Z", "name": "blank"}, "emitted_at": 1674678244851} -{"stream": "untitled_base/table_1", "data": {"_airtable_id": "recxXAoQ0cC5yCMZ7", "_airtable_created_time": "2021-12-09T07:54:15.000Z", "name": "test1", "notes": "test", "status": "Todo"}, "emitted_at": 1674678244852} -{"stream": "untitled_base/table_1", "data": {"_airtable_id": "reczJvdeo0b8KsM6K", "_airtable_created_time": "2022-12-28T11:43:38.000Z", "name": "test3", "notes": "test3", "status": "Done"}, "emitted_at": 1674678244852} +{"stream": "users/table_1", "data": {"_airtable_id": "recgRMRMHxgcgJeDe", "_airtable_created_time": "2021-11-16T13:30:17.000Z", "name": "test2", "status": "test", "notes": "test_note2"}, "emitted_at": 1674743461677} +{"stream": "users/table_1", "data": {"_airtable_id": "recmJkSF51IKUGmlJ", "_airtable_created_time": "2022-12-22T20:58:05.000Z", "name": "test4_after_empty", "clo_with_empty_strings": "bla bla bla", "status": "In progress", "notes": "test_note4"}, "emitted_at": 1674743461678} +{"stream": "users/table_1", "data": {"_airtable_id": "recvp1qYYBlcOrzsc", "_airtable_created_time": "2021-11-16T13:30:17.000Z", "name": "test3", "clo_with_empty_strings": "test text here", "status": "test", "notes": "test-note3"}, "emitted_at": 1674743461678} +{"stream": "users/table_1", "data": {"_airtable_id": "reczEeQV9NrzFlVFF", "_airtable_created_time": "2021-11-16T13:30:17.000Z", "name": "test", "status": "test", "notes": "test_note"}, "emitted_at": 1674743461679} +{"stream": "users/table_2", "data": {"_airtable_id": "recB3upao4wpmeCEf", "_airtable_created_time": "2021-11-16T13:32:31.000Z", "status": "In progress", "name": "test2", "notes": "test2"}, "emitted_at": 1674743462304} +{"stream": "users/table_2", "data": {"_airtable_id": "recWeE6SiYeri4Duq", "_airtable_created_time": "2021-11-16T13:32:31.000Z", "status": "Todo", "name": "test", "notes": "test"}, "emitted_at": 1674743462304} +{"stream": "users/table_2", "data": {"_airtable_id": "recXn7kXbeEsJfDJQ", "_airtable_created_time": "2022-12-28T11:41:10.000Z", "name": " "}, "emitted_at": 1674743462305} +{"stream": "users/table_2", "data": {"_airtable_id": "recmMfFAec8plcOUY", "_airtable_created_time": "2021-11-16T13:32:31.000Z", "status": "Done", "name": "test 3", "notes": "test 3"}, "emitted_at": 1674743462305} +{"stream": "users/table_6", "data": {"_airtable_id": "recHyy86oge9j5cYP", "_airtable_created_time": "2023-01-25T02:04:26.000Z", "name": "test_negative", "table_6": ["recHyy86oge9j5cYP", "recoY6ShPkGpav3Se"], "float": 0.3, "status": "In progress", "integer": -1.0, "assignee": [2.0], "assignee_(from_table_6)": [2.0, 2.0]}, "emitted_at": 1674743462941} +{"stream": "users/table_6", "data": {"_airtable_id": "recLhKYa9btCCqmxs", "_airtable_created_time": "2023-01-25T02:04:26.000Z", "name": "test_attachment", "table_6": ["recLhKYa9btCCqmxs", "recoY6ShPkGpav3Se"], "float": 0.3, "status": "Todo", "integer": 1.0, "assignee": [2.0], "assignee_(from_table_6)": [2.0, 2.0]}, "emitted_at": 1674743462941} +{"stream": "users/table_6", "data": {"_airtable_id": "recoY6ShPkGpav3Se", "_airtable_created_time": "2023-01-25T02:04:26.000Z", "name": "test_normal", "table_6": ["recoY6ShPkGpav3Se", "recHyy86oge9j5cYP", "recLhKYa9btCCqmxs"], "float": 0.7, "status": "Done", "integer": 2.0, "assignee": [2.0], "assignee_(from_table_6)": [2.0, 2.0, 2.0]}, "emitted_at": 1674743462942} +{"stream": "users/field_type_test", "data": {"_airtable_id": "rec0UJKftqCPj7zJu", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": 17.0, "date": "2022-09-30", "multiple_select_(no_colors)": ["1", "2", "3"], "percent": 0.0, "rating": 5.0, "multiple_select_(colors)": ["1", "2", "3"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": true, "number": 1.0, "duration": 0.0, "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": 1.0, "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463539} +{"stream": "users/field_type_test", "data": {"_airtable_id": "rec3tSj3Yzi42uuS0", "_airtable_created_time": "2022-09-30T16:06:49.000Z", "id": 3.0, "100_columns": ["reccHYZ004lOuxLFH"], "name": "Blank", "created_(with_time)": "2022-09-30T16:06:49.000Z", "created_(w/o_time)": "2022-09-30", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463540} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recAa5DUEhppIeeax", "_airtable_created_time": "2022-12-01T20:27:30.000Z", "email": "integration-test-user@airbyte.io", "id": 9.0, "date": "2022-09-30", "multiple_select_(no_colors)": ["1", "2", "3"], "percent": 0.0, "rating": 5.0, "multiple_select_(colors)": ["1", "2", "3"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": true, "number": 1.0, "duration": 0.0, "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": 1.0, "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:30.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463540} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recG989xsdfSxookl", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": 23.0, "date": "2022-10-03", "multiple_select_(no_colors)": ["a", "b", "c"], "percent": 1.0, "rating": 3.0, "multiple_select_(colors)": ["a", "b", "c"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 123123871234.33, "duration": 169409880.0, "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": 1128312.23, "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463541} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recGVqF9BIpDD7Gj1", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": 22.0, "date": "2022-09-30", "multiple_select_(no_colors)": ["1", "2", "3"], "percent": 0.0, "rating": 5.0, "multiple_select_(colors)": ["1", "2", "3"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": true, "number": 1.0, "duration": 0.0, "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": 1.0, "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463542} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recHNlOoFvp6KjeZD", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "id": 16.0, "name": "Blank", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463543} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recL6sfQP0FyJr3Ua", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "id": 21.0, "name": "Blank", "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463544} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recMtt4tMmdNbwV5R", "_airtable_created_time": "2022-12-01T20:27:20.000Z", "id": 8.0, "name": "Blank", "created_(with_time)": "2022-12-01T20:27:20.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463544} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recOz5BBo3Ey3ldb8", "_airtable_created_time": "2022-12-01T20:27:11.000Z", "email": "integration-test-user@airbyte.io", "id": 5.0, "date": "2022-10-03", "multiple_select_(no_colors)": ["a", "b", "c"], "percent": 1.0, "rating": 3.0, "multiple_select_(colors)": ["a", "b", "c"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "100_columns": ["recXVzpNmtsBcjrA2"], "number": 123123871234.33, "duration": 169409880.0, "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": 1128312.23, "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:11.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463544} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recSbSBPspxs22165", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": 15.0, "date": "2022-10-03", "multiple_select_(no_colors)": ["a", "b", "c"], "percent": 1.0, "rating": 3.0, "multiple_select_(colors)": ["a", "b", "c"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 123123871234.33, "duration": 169409880.0, "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": 1128312.23, "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463545} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recUzRSGAf5VYtXfZ", "_airtable_created_time": "2022-09-30T16:06:49.000Z", "email": "integration-test-user@airbyte.io", "id": 1.0, "date": "2022-09-30", "multiple_select_(no_colors)": ["1", "2", "3"], "percent": 0.0, "rating": 5.0, "multiple_select_(colors)": ["1", "2", "3"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": true, "100_columns": ["rec2lCkcy9d0fZi8h"], "number": 1.0, "duration": 0.0, "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": 1.0, "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-09-30T16:06:49.000Z", "created_(w/o_time)": "2022-09-30", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463546} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recbQy9sb5BM1K3Z1", "_airtable_created_time": "2022-12-01T20:27:17.000Z", "email": "integration-test-user@airbyte.io", "id": 6.0, "date": "2022-09-30", "multiple_select_(no_colors)": ["1", "2", "3"], "percent": 0.0, "rating": 5.0, "multiple_select_(colors)": ["1", "2", "3"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": true, "number": 1.0, "duration": 0.0, "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": 1.0, "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:17.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463547} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recehwpjPyD1PLFkr", "_airtable_created_time": "2022-12-01T20:27:10.000Z", "email": "integration-test-user@airbyte.io", "id": 4.0, "date": "2022-09-30", "multiple_select_(no_colors)": ["1", "2", "3"], "percent": 0.0, "rating": 5.0, "multiple_select_(colors)": ["1", "2", "3"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": true, "number": 1.0, "duration": 0.0, "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": 1.0, "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:10.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463548} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recfdnbGNkUx1Rs5F", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": 19.0, "date": "2022-09-30", "multiple_select_(no_colors)": ["1", "2", "3"], "percent": 0.0, "rating": 5.0, "multiple_select_(colors)": ["1", "2", "3"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": true, "number": 1.0, "duration": 0.0, "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": 1.0, "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463549} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recpkKhLwcFYbJLtJ", "_airtable_created_time": "2022-12-01T20:27:43.000Z", "email": "integration-test-user@airbyte.io", "id": 14.0, "date": "2022-09-30", "multiple_select_(no_colors)": ["1", "2", "3"], "percent": 0.0, "rating": 5.0, "multiple_select_(colors)": ["1", "2", "3"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "checkbox": true, "number": 1.0, "duration": 0.0, "name": "John", "single_line": "Singe line", "phone": "(937) 999-999", "value": 1.0, "long_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae nisi nec justo laoreet tincidunt. Vivamus eget porttitor velit. Pellentesque gravida euismod massa, eget egestas sem facilisis gravida. Suspendisse quis mauris eget velit faucibus aliquam. Mauris porttitor urna lorem, eget tincidunt ex faucibus et. Nam viverra nibh quis turpis scelerisque, et condimentum nibh vulputate. Vivamus eu dolor posuere, finibus ligula vel, finibus erat. Sed hendrerit luctus erat, eu finibus ante blandit ut. Sed id mi ullamcorper, cursus urna nec, molestie lorem. In vulputate tempor nulla in laoreet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed a risus risus. Praesent neque lorem, fringilla vitae rhoncus a, semper eu augue.", "single_select_(colors)": "1", "single_select_(no_colors)": "1", "url": "airbyte.io", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:43.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463550} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recqurXMR6u1PO5wT", "_airtable_created_time": "2022-12-01T20:27:18.000Z", "email": "integration-test-user@airbyte.io", "id": 7.0, "date": "2022-10-03", "multiple_select_(no_colors)": ["a", "b", "c"], "percent": 1.0, "rating": 3.0, "multiple_select_(colors)": ["a", "b", "c"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 123123871234.33, "duration": 169409880.0, "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": 1128312.23, "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:18.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463551} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recuYRu9z5dlkHxop", "_airtable_created_time": "2022-12-01T20:27:30.000Z", "email": "integration-test-user@airbyte.io", "id": 10.0, "date": "2022-10-03", "multiple_select_(no_colors)": ["a", "b", "c"], "percent": 1.0, "rating": 3.0, "multiple_select_(colors)": ["a", "b", "c"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 123123871234.33, "duration": 169409880.0, "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": 1128312.23, "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:30.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463551} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recw3jDJFziB562hu", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": 18.0, "date": "2022-10-03", "multiple_select_(no_colors)": ["a", "b", "c"], "percent": 1.0, "rating": 3.0, "multiple_select_(colors)": ["a", "b", "c"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 123123871234.33, "duration": 169409880.0, "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": 1128312.23, "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463552} +{"stream": "users/field_type_test", "data": {"_airtable_id": "recyJGdkZikJbLFRi", "_airtable_created_time": "2022-09-30T16:06:49.000Z", "email": "integration-test-user@airbyte.io", "id": 2.0, "date": "2022-10-03", "multiple_select_(no_colors)": ["a", "b", "c"], "percent": 1.0, "rating": 3.0, "multiple_select_(colors)": ["a", "b", "c"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 123123871234.33, "duration": 169409880.0, "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": 1128312.23, "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-09-30T16:06:49.000Z", "created_(w/o_time)": "2022-09-30", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463553} +{"stream": "users/field_type_test", "data": {"_airtable_id": "reczDi9vTuH3ezfJM", "_airtable_created_time": "2022-12-01T20:27:46.000Z", "email": "integration-test-user@airbyte.io", "id": 20.0, "date": "2022-10-03", "multiple_select_(no_colors)": ["a", "b", "c"], "percent": 1.0, "rating": 3.0, "multiple_select_(colors)": ["a", "b", "c"], "user_(non-multiple)": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 123123871234.33, "duration": 169409880.0, "name": "Jane", "single_line": "09-30-2022", "phone": "(937) 999-999", "value": 1128312.23, "long_text": "18923671273628376328495623874562981345982 234953249857239045798 342098523495723495732 23489532475\n\n23453245234532453245234523453245\n\n2345234532452345", "single_select_(colors)": "a", "single_select_(no_colors)": "a", "url": "www.google.com", "user_(multiple)": ["{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"], "created_(with_time)": "2022-12-01T20:27:46.000Z", "created_(w/o_time)": "2022-12-01", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743463554} +{"stream": "users/50_columns", "data": {"_airtable_id": "rec2lCkcy9d0fZi8h", "_airtable_created_time": "2022-12-02T17:29:41.000Z", "notes": "dasdafsdag", "phone_3": "(999) 999-9999", "tags_2": ["alpha", "issue"], "select_2": "top", "date_2": "2023-01-03", "euro": 136.46, "collaborator": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 423.0, "assignee": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "percent_2": 0.45299999999999996, "url": "airbyte.com", "duration": 9900.0, "notes_3": " dfhsh f g dh", "status": "Done", "rating_2": 1.0, "barcode": "{'text': '312515435'}", "number_2": 3453.0, "rating": 4.0, "field_type_test": ["recUzRSGAf5VYtXfZ"], "usd": 143.64, "done": true, "id": 1.0, "notes_2": "1. fsafsf sfkjkl fsafs", "phone_2": "(222) 222-2222", "email": "email@airbyte.io", "percent_3": 0.24300000000000002, "select": "1st", "int": 65.0, "label_2": "Lorem", "date": "2022-12-02", "label_3": "line", "name": "Thing 1", "phone": "(999) 999-9999", "label": "Nulla quis lorem ut libero malesuada feugiat.", "duration_2": 20580.0, "tags": ["tag1"], "decimal": 5.8797, "percent": 0.2, "email_(from_field_type_test)": ["integration-test-user@airbyte.io"], "count_(field_type_test)": 1.0, "created_(w/o_time)_(from_field_type_test)": ["2022-09-30"], "created": "2022-12-02T17:29:41.000Z", "last_modified": "2023-01-24T11:12:27.000Z", "last_modified_2": "2023-01-24T11:12:27.000Z", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743464164} +{"stream": "users/50_columns", "data": {"_airtable_id": "recXVzpNmtsBcjrA2", "_airtable_created_time": "2022-12-02T17:29:41.000Z", "notes": "opoiwepoirwe", "phone_3": "(999) 999-9999", "tags_2": ["ga"], "select_2": "bottom", "date_2": "2023-01-31", "euro": 279.62, "collaborator": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "number": 34535.5, "percent_2": 0.624, "duration": 10440.0, "notes_3": "hdfhe e et e true ttue ", "status": "Todo", "rating_2": 4.0, "barcode": "{'text': '351164554'}", "rating": 3.0, "field_type_test": ["recOz5BBo3Ey3ldb8"], "usd": 294.34, "done": true, "url_2": "airbyte.com", "id": 3.0, "notes_2": "3. flsflkj;flkjsf fskjlf lakjf; lskaj;klsjf", "phone_2": "(444) 444-4444", "percent_3": 0.13699999999999998, "select": "3rd", "int": 98.0, "date": "2022-12-14", "label_3": "line", "name": "Thing 3", "phone": "(999) 999-9999", "label": "Curabitur aliquet quam id dui posuere blandit.", "duration_2": 19740.0, "decimal": 6.6, "percent": 0.3, "email_(from_field_type_test)": ["integration-test-user@airbyte.io"], "count_(field_type_test)": 1.0, "created_(w/o_time)_(from_field_type_test)": ["2022-12-01"], "created": "2022-12-02T17:29:41.000Z", "last_modified": "2023-01-24T11:12:12.000Z", "last_modified_2": "2023-01-24T11:12:12.000Z", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743464165} +{"stream": "users/50_columns", "data": {"_airtable_id": "reccHYZ004lOuxLFH", "_airtable_created_time": "2022-12-02T17:29:41.000Z", "notes": "hjyyfhgjjfgjr", "phone_3": "(999) 999-9999", "tags_2": ["beta", "no issue"], "select_2": "mid", "date_2": "2023-01-17", "euro": 325.13, "number": 22424.5, "assignee": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "percent_2": 0.562, "duration": 11520.0, "notes_3": "fhdfhdhgf hfh hdfgh", "status": "In progress", "barcode": "{'text': '5531515315'}", "number_2": 3452.0, "rating": 5.0, "field_type_test": ["rec3tSj3Yzi42uuS0"], "usd": 342.24, "url_2": "docs.airbyte.com", "id": 2.0, "notes_2": "2. fskldf f;sfkjk s;lkjfkls", "phone_2": "(333) 333-3333", "email": "what@airbyte.io", "percent_3": 0.532, "select": "2nd", "int": 53.0, "date": "2022-11-10", "label_3": "line", "name": "Thing 2", "phone": "(999) 999-9999", "label": "Quisque velit nisi, pretium ut lacinia in, elementum id enim.", "duration_2": 18180.0, "collaborator_2": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "tags": ["tag2", "tag3"], "done_2": true, "decimal": 4.134, "percent": 0.15, "count_(field_type_test)": 1.0, "created_(w/o_time)_(from_field_type_test)": ["2022-09-30"], "created": "2022-12-02T17:29:41.000Z", "last_modified": "2023-01-24T11:12:11.000Z", "last_modified_2": "2023-01-24T11:12:11.000Z", "created_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}", "last_modified_by": "{'id': 'usrr0cUCbVccLxU7x', 'email': 'integration-test@airbyte.io', 'name': 'Augustin Lafanechere'}"}, "emitted_at": 1674743464167} +{"stream": "users/checkboxes", "data": {"_airtable_id": "recLvpJ4k4mRG38My", "_airtable_created_time": "2022-12-02T19:50:00.000Z", "done_18": true, "done_21": true, "done_6": true, "done_11": true, "done_24": true, "done_2": true, "done_12": true, "done_16": true, "done_4": true, "done_10": true, "done_7": true, "done_22": true, "done_23": true, "done_20": true, "name": "Cloud"}, "emitted_at": 1674743464782} +{"stream": "users/checkboxes", "data": {"_airtable_id": "reckszXRiFfg11IYD", "_airtable_created_time": "2022-12-02T19:50:00.000Z", "done_21": true, "done_6": true, "done_17": true, "done_5": true, "done_9": true, "done_11": true, "done_16": true, "done_25": true, "done_7": true, "done_22": true, "done_13": true, "done_3": true, "name": "Support"}, "emitted_at": 1674743464782} +{"stream": "users/checkboxes", "data": {"_airtable_id": "recmaYwfPMvZtwTSJ", "_airtable_created_time": "2022-12-02T19:50:00.000Z", "done_5": true, "done_9": true, "done_19": true, "done_12": true, "done": true, "done_16": true, "done_14": true, "done_4": true, "done_25": true, "done_7": true, "done_23": true, "done_20": true, "name": "Airbyte"}, "emitted_at": 1674743464783} +{"stream": "untitled_base/table_1", "data": {"_airtable_id": "recJ0l923fOFw6qbl", "_airtable_created_time": "2021-12-09T07:54:15.000Z", "name": "test2", "notes": "test2", "status": "In progress"}, "emitted_at": 1674743465388} +{"stream": "untitled_base/table_1", "data": {"_airtable_id": "recNbrGzLJfOy6EjC", "_airtable_created_time": "2022-12-28T11:43:37.000Z", "name": "blank"}, "emitted_at": 1674743465389} +{"stream": "untitled_base/table_1", "data": {"_airtable_id": "recZX1Je5k4nXhTi0", "_airtable_created_time": "2021-12-09T07:54:15.000Z", "name": "blank"}, "emitted_at": 1674743465389} +{"stream": "untitled_base/table_1", "data": {"_airtable_id": "recxXAoQ0cC5yCMZ7", "_airtable_created_time": "2021-12-09T07:54:15.000Z", "name": "test1", "notes": "test", "status": "Todo"}, "emitted_at": 1674743465390} +{"stream": "untitled_base/table_1", "data": {"_airtable_id": "reczJvdeo0b8KsM6K", "_airtable_created_time": "2022-12-28T11:43:38.000Z", "name": "test3", "notes": "test3", "status": "Done"}, "emitted_at": 1674743465390} diff --git a/airbyte-integrations/connectors/source-airtable/source_airtable/schema_helpers.py b/airbyte-integrations/connectors/source-airtable/source_airtable/schema_helpers.py index edb5cffe466b5..43e253dc9d72c 100644 --- a/airbyte-integrations/connectors/source-airtable/source_airtable/schema_helpers.py +++ b/airbyte-integrations/connectors/source-airtable/source_airtable/schema_helpers.py @@ -3,12 +3,75 @@ # +from copy import deepcopy from typing import Any, Dict from airbyte_cdk.models import AirbyteStream from airbyte_cdk.models.airbyte_protocol import DestinationSyncMode, SyncMode +class SchemaTypes: + + string: Dict = {"type": ["null", "string"]} + + number: Dict = {"type": ["null", "number"]} + + boolean: Dict = {"type": ["null", "boolean"]} + + date: Dict = {"type": ["null", "string"], "format": "date"} + + datetime: Dict = {"type": ["null", "string"], "format": "date-time"} + + array_with_strings: Dict = {"type": ["null", "array"], "items": {"type": ["null", "string"]}} + + # array items should be automatically determined + # based on field complexity + array_with_any: Dict = {"type": ["null", "array"], "items": {}} + + +# More info about internal Airtable Data Types +# https://airtable.com/developers/web/api/field-model +SIMPLE_AIRTABLE_TYPES: Dict = { + "multipleAttachments": SchemaTypes.string, + "autoNumber": SchemaTypes.number, + "barcode": SchemaTypes.string, + "button": SchemaTypes.string, + "checkbox": SchemaTypes.boolean, + "singleCollaborator": SchemaTypes.string, + "count": SchemaTypes.number, + "createdBy": SchemaTypes.string, + "createdTime": SchemaTypes.datetime, + "currency": SchemaTypes.number, + "email": SchemaTypes.string, + "date": SchemaTypes.date, + "dateTime": SchemaTypes.datetime, + "duration": SchemaTypes.number, + "lastModifiedBy": SchemaTypes.string, + "lastModifiedTime": SchemaTypes.datetime, + "multipleRecordLinks": SchemaTypes.array_with_strings, + "multilineText": SchemaTypes.string, + "multipleCollaborators": SchemaTypes.array_with_strings, + "multipleSelects": SchemaTypes.array_with_strings, + "number": SchemaTypes.number, + "percent": SchemaTypes.number, + "phoneNumber": SchemaTypes.string, + "rating": SchemaTypes.number, + "richText": SchemaTypes.string, + "singleLineText": SchemaTypes.string, + "externalSyncSource": SchemaTypes.string, + "url": SchemaTypes.string, +} + +# returns the `array of Any` where Any is based on Simple Types. +# the final array is fulled with some simple type. +COMPLEX_AIRTABLE_TYPES: Dict = { + "formula": SchemaTypes.array_with_any, + "lookup": SchemaTypes.array_with_any, + "multipleLookupValues": SchemaTypes.array_with_any, + "rollup": SchemaTypes.array_with_any, +} + + class SchemaHelpers: @staticmethod def clean_name(name_str: str) -> str: @@ -16,22 +79,39 @@ def clean_name(name_str: str) -> str: @staticmethod def get_json_schema(table: Dict[str, Any]) -> Dict[str, str]: - fields = table.get("fields", {}) - properties = { - "_airtable_id": {"type": ["null", "string"]}, - "_airtable_created_time": {"type": ["null", "string"]}, + properties: Dict = { + "_airtable_id": SchemaTypes.string, + "_airtable_created_time": SchemaTypes.string, } + fields: Dict = table.get("fields", {}) for field in fields: - field_name = SchemaHelpers.clean_name(field.get("name")) - properties[field_name] = {"type": ["null", "string"]} + name: str = SchemaHelpers.clean_name(field.get("name")) + original_type: str = field.get("type") + options: Dict = field.get("options", {}) + exec_type: str = options.get("result", {}).get("type") if options else None + field_type: str = exec_type if exec_type else original_type + + # choose the JsonSchema Type for known Airtable Types + if original_type in COMPLEX_AIRTABLE_TYPES.keys(): + complex_type = deepcopy(COMPLEX_AIRTABLE_TYPES.get(original_type)) + # process arrays with values + if complex_type == SchemaTypes.array_with_any: + complex_type["items"] = deepcopy(SIMPLE_AIRTABLE_TYPES.get(field_type)) + properties.update(**{name: complex_type}) + elif original_type in SIMPLE_AIRTABLE_TYPES.keys(): + properties.update(**{name: deepcopy(SIMPLE_AIRTABLE_TYPES.get(field_type))}) + else: + # Airtable may add more field types in the future and don't consider it a breaking change + properties.update(**{name: SchemaTypes.string}) - json_schema = { + json_schema: Dict = { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "additionalProperties": True, "properties": properties, } + return json_schema @staticmethod diff --git a/docs/integrations/sources/airtable.md b/docs/integrations/sources/airtable.md index 1156bd358075e..0d7d19d8968af 100644 --- a/docs/integrations/sources/airtable.md +++ b/docs/integrations/sources/airtable.md @@ -26,7 +26,7 @@ This source syncs data from the [Airtable API](https://airtable.com/api). 3. On the Set up the source page, enter the name for the Airtable connector and select **Airtable** from the Source type dropdown. 4. Click **Authenticate your Airtable account**. 5. Proceed with `login` and `grant the permissions` to the target `bases` you need the access to, we recommend to use `All Workspaces and bases`. -5. Log in and Authorize to the Airtable account and click `Set up source`. +6. Log in and Authorize to the Airtable account and click `Set up source`. ## Supported sync modes @@ -54,10 +54,46 @@ The `Enterprise` level accounts are not supported yet. ## Data type map -| Integration Type | Airbyte Type | -| :--------------------- | :----------- | -| `Any` | `string` | - +| Integration Type | Airbyte Type | Nullable | +| :--------------------- | :------------------------------------------------------ | -------- | +| `multipleAttachments` | `string` | Yes | +| `autoNumber` | `string` | Yes | +| `barcode` | `string` | Yes | +| `button` | `string` | Yes | +| `checkbox` | `boolean` | Yes | +| `singleCollaborator` | `string` | Yes | +| `count` | `number` | Yes | +| `createdBy` | `string` | Yes | +| `createdTime` | `datetime`, `format: date-time` | Yes | +| `currency` | `number` | Yes | +| `email` | `string` | Yes | +| `date` | `string`, `format: date` | Yes | +| `duration` | `number` | Yes | +| `lastModifiedBy` | `string` | Yes | +| `lastModifiedTime` | `datetime`, `format: date-time` | Yes | +| `multipleRecordLinks` | `array with strings` | Yes | +| `multilineText` | `string` | Yes | +| `multipleCollaborators`| `array with strings` | Yes | +| `multipleSelects` | `array with strings` | Yes | +| `number` | `number` | Yes | +| `percent` | `number` | Yes | +| `phoneNumber` | `string` | Yes | +| `rating` | `number` | Yes | +| `richText` | `string` | Yes | +| `singleLineText` | `string` | Yes | +| `externalSyncSource` | `string` | Yes | +| `url` | `string` | Yes | +| `formula` | `array with any` | Yes | +| `lookup` | `array with any` | Yes | +| `multipleLookupValues` | `array with any` | Yes | +| `rollup` | `array with any` | Yes | + +* All the fields are `nullable` by default, meaning that the field could be empty. +* The `array with any` - represents the classic array with one of the other Airtable data types inside, such as: + - string + - number/integer + - nested lists/objects + - etc ### Performance Considerations (Airbyte Open-Source) @@ -67,6 +103,7 @@ See information about rate limits [here](https://airtable.com/developers/web/api | Version | Date | Pull Request | Subject | |:--------|:-----------|:---------------------------------------------------------|:-------------------------------------------------------| +| 2.0.0 | 2023-01-27 | [21962](https://github.com/airbytehq/airbyte/pull/21962) | Added casting of native Airtable data types to JsonSchema types | 1.0.2 | 2023-01-25 | [20934](https://github.com/airbytehq/airbyte/pull/20934) | Added `OAuth2.0` authentication support | 1.0.1 | 2023-01-10 | [21215](https://github.com/airbytehq/airbyte/pull/21215) | Fix field names | | 1.0.0 | 2022-12-22 | [20846](https://github.com/airbytehq/airbyte/pull/20846) | Migrated to Metadata API for dynamic schema generation | From 2226a2e516b9d50001502cfe3c7eef26f2fe42ce Mon Sep 17 00:00:00 2001 From: Yevhen Sukhomud Date: Mon, 30 Jan 2023 12:11:43 +0700 Subject: [PATCH 173/195] Base Java S3: Update Avro TimeWithTimezone schema mapping (#21909) * 21908 Base Java S3: Update Avro TimeWithTimezone schema mapping * 21908 Base Java S3: Formatting * 21908 Base Java S3: fix integration test gcs + S3 * 21908 Base Java S3: fix unit test * 21908 Base Java S3: fix format --- .../destination/s3/avro/JsonSchemaType.java | 2 +- .../s3/avro/JsonToAvroSchemaConverter.java | 5 +++-- .../type_conversion_test_cases_v1.json | 6 +----- .../comparator/AdvancedTestDataComparator.java | 12 +++++++++--- .../destination/gcs/GcsAvroTestDataComparator.java | 2 +- .../s3/S3AvroParquetTestDataComparator.java | 2 +- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/avro/JsonSchemaType.java b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/avro/JsonSchemaType.java index ae874c0c8c5d1..3daade3589788 100644 --- a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/avro/JsonSchemaType.java +++ b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/avro/JsonSchemaType.java @@ -23,7 +23,7 @@ public enum JsonSchemaType { DATE_V1("WellKnownTypes.json#/definitions/Date", Schema.Type.INT), TIMESTAMP_WITH_TIMEZONE_V1("WellKnownTypes.json#/definitions/TimestampWithTimezone", Schema.Type.LONG), TIMESTAMP_WITHOUT_TIMEZONE_V1("WellKnownTypes.json#/definitions/TimestampWithoutTimezone", Schema.Type.LONG), - TIME_WITH_TIMEZONE_V1("WellKnownTypes.json#/definitions/TimeWithTimezone", Schema.Type.LONG), + TIME_WITH_TIMEZONE_V1("WellKnownTypes.json#/definitions/TimeWithTimezone", Schema.Type.STRING), TIME_WITHOUT_TIMEZONE_V1("WellKnownTypes.json#/definitions/TimeWithoutTimezone", Schema.Type.LONG), OBJECT("object", Schema.Type.RECORD), ARRAY("array", Schema.Type.ARRAY), diff --git a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/avro/JsonToAvroSchemaConverter.java b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/avro/JsonToAvroSchemaConverter.java index 791b454394e32..991a5e0e2ba6f 100644 --- a/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/avro/JsonToAvroSchemaConverter.java +++ b/airbyte-integrations/bases/base-java-s3/src/main/java/io/airbyte/integrations/destination/s3/avro/JsonToAvroSchemaConverter.java @@ -225,11 +225,12 @@ Schema parseSingleType(final String fieldName, final Schema fieldSchema; switch (fieldType) { - case INTEGER_V1, NUMBER_V1, BOOLEAN_V1, STRING_V1, BINARY_DATA_V1 -> fieldSchema = Schema.create(fieldType.getAvroType()); + case INTEGER_V1, NUMBER_V1, BOOLEAN_V1, STRING_V1, TIME_WITH_TIMEZONE_V1, BINARY_DATA_V1 -> fieldSchema = + Schema.create(fieldType.getAvroType()); case DATE_V1 -> fieldSchema = LogicalTypes.date().addToSchema(Schema.create(Schema.Type.INT)); case TIMESTAMP_WITH_TIMEZONE_V1, TIMESTAMP_WITHOUT_TIMEZONE_V1 -> fieldSchema = LogicalTypes.timestampMicros() .addToSchema(Schema.create(Schema.Type.LONG)); - case TIME_WITH_TIMEZONE_V1, TIME_WITHOUT_TIMEZONE_V1 -> fieldSchema = LogicalTypes.timeMicros().addToSchema(Schema.create(Schema.Type.LONG)); + case TIME_WITHOUT_TIMEZONE_V1 -> fieldSchema = LogicalTypes.timeMicros().addToSchema(Schema.create(Schema.Type.LONG)); case INTEGER_V0, NUMBER_V0, NUMBER_INT_V0, NUMBER_BIGINT_V0, NUMBER_FLOAT_V0, BOOLEAN_V0 -> fieldSchema = Schema.create(fieldType.getAvroType()); case STRING_V0 -> { diff --git a/airbyte-integrations/bases/base-java-s3/src/test/resources/parquet/json_schema_converter/type_conversion_test_cases_v1.json b/airbyte-integrations/bases/base-java-s3/src/test/resources/parquet/json_schema_converter/type_conversion_test_cases_v1.json index d6e75600e7ca7..399a8a4afd592 100644 --- a/airbyte-integrations/bases/base-java-s3/src/test/resources/parquet/json_schema_converter/type_conversion_test_cases_v1.json +++ b/airbyte-integrations/bases/base-java-s3/src/test/resources/parquet/json_schema_converter/type_conversion_test_cases_v1.json @@ -204,11 +204,7 @@ "jsonFieldSchema": { "$ref": "WellKnownTypes.json#/definitions/TimeWithTimezone" }, - "avroFieldType": [ - "null", - { "type": "long", "logicalType": "time-micros" }, - "string" - ] + "avroFieldType": ["null", "string"] }, { "fieldName": "array_field_without_items", diff --git a/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/comparator/AdvancedTestDataComparator.java b/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/comparator/AdvancedTestDataComparator.java index 3c86a10a04556..7f48c2490ab2a 100644 --- a/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/comparator/AdvancedTestDataComparator.java +++ b/airbyte-integrations/bases/standard-destination-test/src/main/java/io/airbyte/integrations/standardtest/destination/comparator/AdvancedTestDataComparator.java @@ -105,8 +105,10 @@ protected boolean compareJsonNodes(final JsonNode expectedValue, final JsonNode return compareDateTimeValues(expectedValue.asText(), actualValue.asText()); } else if (isDateValue(expectedValue.asText())) { return compareDateValues(expectedValue.asText(), actualValue.asText()); - } else if (isTimeWithTimezone(expectedValue.asText()) || isTimeWithoutTimezone(expectedValue.asText())) { - return compareTime(expectedValue.asText(), actualValue.asText()); + } else if (isTimeWithTimezone(expectedValue.asText())) { + return compareTimeWithTimeZone(expectedValue.asText(), actualValue.asText()); + } else if (isTimeWithoutTimezone(expectedValue.asText())) { + return compareTimeWithoutTimeZone(expectedValue.asText(), actualValue.asText()); } else if (expectedValue.isArray()) { return compareArrays(expectedValue, actualValue); } else if (expectedValue.isObject()) { @@ -215,7 +217,11 @@ protected boolean compareDateValues(final String airbyteMessageValue, final Stri return compareTextValues(airbyteMessageValue, destinationValue); } - protected boolean compareTime(final String airbyteMessageValue, final String destinationValue) { + protected boolean compareTimeWithoutTimeZone(final String airbyteMessageValue, final String destinationValue) { + return compareTextValues(airbyteMessageValue, destinationValue); + } + + protected boolean compareTimeWithTimeZone(final String airbyteMessageValue, final String destinationValue) { return compareTextValues(airbyteMessageValue, destinationValue); } diff --git a/airbyte-integrations/connectors/destination-gcs/src/test-integration/java/io/airbyte/integrations/destination/gcs/GcsAvroTestDataComparator.java b/airbyte-integrations/connectors/destination-gcs/src/test-integration/java/io/airbyte/integrations/destination/gcs/GcsAvroTestDataComparator.java index edba4c27c6c8c..9fa79be54eb5b 100644 --- a/airbyte-integrations/connectors/destination-gcs/src/test-integration/java/io/airbyte/integrations/destination/gcs/GcsAvroTestDataComparator.java +++ b/airbyte-integrations/connectors/destination-gcs/src/test-integration/java/io/airbyte/integrations/destination/gcs/GcsAvroTestDataComparator.java @@ -37,7 +37,7 @@ protected boolean compareDateTimeValues(String airbyteMessageValue, String desti } @Override - protected boolean compareTime(final String airbyteMessageValue, final String destinationValue) { + protected boolean compareTimeWithoutTimeZone(final String airbyteMessageValue, final String destinationValue) { LocalTime destinationDate = LocalTime.ofInstant(getInstantFromEpoch(destinationValue), ZoneOffset.UTC); LocalTime expectedDate = LocalTime.parse(airbyteMessageValue, DateTimeFormatter.ISO_TIME); return expectedDate.equals(destinationDate); diff --git a/airbyte-integrations/connectors/destination-s3/src/test-integration/java/io/airbyte/integrations/destination/s3/S3AvroParquetTestDataComparator.java b/airbyte-integrations/connectors/destination-s3/src/test-integration/java/io/airbyte/integrations/destination/s3/S3AvroParquetTestDataComparator.java index 23fdf59b500b1..2fd8964cbcaa5 100644 --- a/airbyte-integrations/connectors/destination-s3/src/test-integration/java/io/airbyte/integrations/destination/s3/S3AvroParquetTestDataComparator.java +++ b/airbyte-integrations/connectors/destination-s3/src/test-integration/java/io/airbyte/integrations/destination/s3/S3AvroParquetTestDataComparator.java @@ -41,7 +41,7 @@ protected boolean compareDateTimeValues(String airbyteMessageValue, String desti } @Override - protected boolean compareTime(final String airbyteMessageValue, final String destinationValue) { + protected boolean compareTimeWithoutTimeZone(final String airbyteMessageValue, final String destinationValue) { var destinationDate = LocalTime.ofInstant(getInstantFromEpoch(destinationValue), ZoneOffset.UTC); var expectedDate = LocalTime.parse(airbyteMessageValue, DateTimeFormatter.ISO_TIME); return expectedDate.equals(destinationDate); From 63064d9f60de2891f1c438aad3b21436eae69c1b Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 30 Jan 2023 09:58:36 +0100 Subject: [PATCH 174/195] Extend SATs to capture UI limitations - fixed version (#21903) * Revert "Revert "Extend SATs to capture UI limitations (#21451)" (#21896)" This reverts commit 74b5dbf794ee935df7d155a569195937b783b769. * fix fixture problem --- .../bases/source-acceptance-test/CHANGELOG.md | 3 + .../bases/source-acceptance-test/Dockerfile | 2 +- .../source_acceptance_test/tests/test_core.py | 150 +++++++++- .../utils/json_schema_helper.py | 11 + .../unit_tests/test_spec.py | 266 ++++++++++++++---- 5 files changed, 371 insertions(+), 61 deletions(-) diff --git a/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md b/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md index 3e911bc3b55c4..2492642bdca12 100644 --- a/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md +++ b/airbyte-integrations/bases/source-acceptance-test/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 0.5.0 +Re-release of 0.3.0 [#21451](https://github.com/airbytehq/airbyte/pull/21451) + ## 0.4.0 Revert 0.3.0 diff --git a/airbyte-integrations/bases/source-acceptance-test/Dockerfile b/airbyte-integrations/bases/source-acceptance-test/Dockerfile index 1208930797505..cd1d9aa54fe0b 100644 --- a/airbyte-integrations/bases/source-acceptance-test/Dockerfile +++ b/airbyte-integrations/bases/source-acceptance-test/Dockerfile @@ -33,7 +33,7 @@ COPY pytest.ini setup.py ./ COPY source_acceptance_test ./source_acceptance_test RUN pip install . -LABEL io.airbyte.version=0.4.0 +LABEL io.airbyte.version=0.5.0 LABEL io.airbyte.name=airbyte/source-acceptance-test ENTRYPOINT ["python", "-m", "pytest", "-p", "source_acceptance_test.plugin", "-r", "fEsx"] diff --git a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py index 0928b07b3db80..0e985b06cecff 100644 --- a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py +++ b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py @@ -76,6 +76,10 @@ def secret_property_names_fixture(): ) +DATE_PATTERN = "^[0-9]{2}-[0-9]{2}-[0-9]{4}$" +DATETIME_PATTERN = "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$" + + @pytest.mark.default_timeout(10) class TestSpec(BaseTest): @@ -219,22 +223,15 @@ def _property_can_store_secret(prop: dict) -> bool: Some fields can not hold a secret by design, others can. Null type as well as boolean can not hold a secret value. A string, a number or an integer type can always store secrets. - Objects and arrays can hold a secret in case they are generic, - meaning their inner structure is not described in details with properties/items. + Secret objects and arrays can not be rendered correctly in the UI: A field with a constant value can not hold a secret as well. """ unsecure_types = {"string", "integer", "number"} type_ = prop["type"] - is_property_generic_object = type_ == "object" and not any( - [prop.get("properties", {}), prop.get("anyOf", []), prop.get("oneOf", []), prop.get("allOf", [])] - ) - is_property_generic_array = type_ == "array" and not any([prop.get("items", []), prop.get("prefixItems", [])]) is_property_constant_value = bool(prop.get("const")) can_store_secret = any( [ isinstance(type_, str) and type_ in unsecure_types, - is_property_generic_object, - is_property_generic_array, isinstance(type_, list) and (set(type_) & unsecure_types), ] ) @@ -252,7 +249,7 @@ def test_secret_is_properly_marked(self, connector_spec_dict: dict, detailed_log secrets_exposed = [] non_secrets_hidden = [] spec_properties = connector_spec_dict["connectionSpecification"]["properties"] - for type_path, value in dpath.util.search(spec_properties, "**/type", yielded=True): + for type_path, type_value in dpath.util.search(spec_properties, "**/type", yielded=True): _, is_property_name_secret = self._is_spec_property_name_secret(type_path, secret_property_names) if not is_property_name_secret: continue @@ -268,7 +265,7 @@ def test_secret_is_properly_marked(self, connector_spec_dict: dict, detailed_log if non_secrets_hidden: properties = "\n".join(non_secrets_hidden) - detailed_logger.warning( + pytest.fail( f"""Some properties are marked with `airbyte_secret` although they probably should not be. Please double check them. If they're okay, please fix this test. {properties}""" @@ -280,6 +277,139 @@ def test_secret_is_properly_marked(self, connector_spec_dict: dict, detailed_log {properties}""" ) + def _fail_on_errors(self, errors: List[str]): + if len(errors) > 0: + pytest.fail("\n".join(errors)) + + def test_property_type_is_not_array(self, connector_spec: ConnectorSpecification): + """ + Each field has one or multiple types, but the UI only supports a single type and optionally "null" as a second type. + """ + errors = [] + for type_path, type_value in dpath.util.search(connector_spec.connectionSpecification, "**/properties/*/type", yielded=True): + if isinstance(type_value, List): + number_of_types = len(type_value) + if number_of_types != 2 and number_of_types != 1: + errors.append( + f"{type_path} is not either a simple type or an array of a simple type plus null: {type_value} (for example: type: [string, null])" + ) + if number_of_types == 2 and type_value[1] != "null": + errors.append( + f"Second type of {type_path} is not null: {type_value}. Type can either be a simple type or an array of a simple type plus null (for example: type: [string, null])" + ) + self._fail_on_errors(errors) + + def test_object_not_empty(self, connector_spec: ConnectorSpecification): + """ + Each object field needs to have at least one property as the UI won't be able to show them otherwise. + If the whole spec is empty, it's allowed to have a single empty object at the top level + """ + schema_helper = JsonSchemaHelper(connector_spec.connectionSpecification) + errors = [] + for type_path, type_value in dpath.util.search(connector_spec.connectionSpecification, "**/type", yielded=True): + if type_path == "type": + # allow empty root object + continue + if type_value == "object": + property = schema_helper.get_parent(type_path) + if "oneOf" not in property and ("properties" not in property or len(property["properties"]) == 0): + errors.append( + f"{type_path} is an empty object which will not be represented correctly in the UI. Either remove or add specific properties" + ) + self._fail_on_errors(errors) + + def test_array_type(self, connector_spec: ConnectorSpecification): + """ + Each array has one or multiple types for its items, but the UI only supports a single type which can either be object, string or an enum + """ + schema_helper = JsonSchemaHelper(connector_spec.connectionSpecification) + errors = [] + for type_path, type_type in dpath.util.search(connector_spec.connectionSpecification, "**/type", yielded=True): + property_definition = schema_helper.get_parent(type_path) + if type_type != "array": + # unrelated "items", not an array definition + continue + items_value = property_definition.get("items", None) + if items_value is None: + continue + elif isinstance(items_value, List): + errors.append(f"{type_path} is not just a single item type: {items_value}") + elif items_value.get("type") not in ["object", "string", "number", "integer"] and "enum" not in items_value: + errors.append(f"Items of {type_path} has to be either object or string or define an enum") + self._fail_on_errors(errors) + + def test_forbidden_complex_types(self, connector_spec: ConnectorSpecification): + """ + not, anyOf, patternProperties, prefixItems, allOf, if, then, else, dependentSchemas and dependentRequired are not allowed + """ + forbidden_keys = [ + "not", + "anyOf", + "patternProperties", + "prefixItems", + "allOf", + "if", + "then", + "else", + "dependentSchemas", + "dependentRequired", + ] + found_keys = set() + for forbidden_key in forbidden_keys: + for path, value in dpath.util.search(connector_spec.connectionSpecification, f"**/{forbidden_key}", yielded=True): + found_keys.add(path) + + for forbidden_key in forbidden_keys: + # remove forbidden keys if they are used as properties directly + for path, _value in dpath.util.search(connector_spec.connectionSpecification, f"**/properties/{forbidden_key}", yielded=True): + found_keys.remove(path) + + if len(found_keys) > 0: + key_list = ", ".join(found_keys) + pytest.fail(f"Found the following disallowed JSON schema features: {key_list}") + + def test_date_pattern(self, connector_spec: ConnectorSpecification, detailed_logger): + """ + Properties with format date or date-time should always have a pattern defined how the date/date-time should be formatted + that corresponds with the format the datepicker component is creating. + """ + schema_helper = JsonSchemaHelper(connector_spec.connectionSpecification) + for format_path, format in dpath.util.search(connector_spec.connectionSpecification, "**/format", yielded=True): + if not isinstance(format, str): + # format is not a format definition here but a property named format + continue + property_definition = schema_helper.get_parent(format_path) + pattern = property_definition.get("pattern") + if format == "date" and not pattern == DATE_PATTERN: + detailed_logger.warning( + f"{format_path} is defining a date format without the corresponding pattern. Consider setting the pattern to {DATE_PATTERN} to make it easier for users to edit this field in the UI." + ) + if format == "date-time" and not pattern == DATETIME_PATTERN: + detailed_logger.warning( + f"{format_path} is defining a date-time format without the corresponding pattern Consider setting the pattern to {DATETIME_PATTERN} to make it easier for users to edit this field in the UI." + ) + + def test_date_format(self, connector_spec: ConnectorSpecification, detailed_logger): + """ + Properties with a pattern that looks like a date should have their format set to date or date-time. + """ + schema_helper = JsonSchemaHelper(connector_spec.connectionSpecification) + for pattern_path, pattern in dpath.util.search(connector_spec.connectionSpecification, "**/pattern", yielded=True): + if not isinstance(pattern, str): + # pattern is not a pattern definition here but a property named pattern + continue + if pattern == DATE_PATTERN or pattern == DATETIME_PATTERN: + property_definition = schema_helper.get_parent(pattern_path) + format = property_definition.get("format") + if not format == "date" and pattern == DATE_PATTERN: + detailed_logger.warning( + f"{pattern_path} is defining a pattern that looks like a date without setting the format to `date`. Consider specifying the format to make it easier for users to edit this field in the UI." + ) + if not format == "date-time" and pattern == DATETIME_PATTERN: + detailed_logger.warning( + f"{pattern_path} is defining a pattern that looks like a date-time without setting the format to `date-time`. Consider specifying the format to make it easier for users to edit this field in the UI." + ) + def test_defined_refs_exist_in_json_spec_file(self, connector_spec_dict: dict): """Checking for the presence of unresolved `$ref`s values within each json spec file""" check_result = list(find_all_values_for_key_in_schema(connector_spec_dict, "$ref")) diff --git a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/json_schema_helper.py b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/json_schema_helper.py index 7f0c7badb7114..400b5af53b6de 100644 --- a/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/json_schema_helper.py +++ b/airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/utils/json_schema_helper.py @@ -6,6 +6,7 @@ from functools import reduce from typing import Any, Dict, List, Mapping, Optional, Set, Text, Union +import dpath.util import pendulum from jsonref import JsonRef @@ -121,6 +122,16 @@ def get_node(self, path: List[str]) -> Any: node = node[segment] return node + def get_parent(self, path: str) -> Any: + """ + Returns the parent dict of a given path within the `obj` dict + """ + absolute_path = f"/{path}" + parent_path, _ = absolute_path.rsplit(sep="/", maxsplit=1) + if parent_path == "": + return self._schema + return dpath.util.get(self._schema, parent_path) + def find_nodes(self, keys: List[str]) -> List[List[str]]: """Find all paths that lead to nodes with the specified keys. diff --git a/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_spec.py b/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_spec.py index 327876fec4c76..c9bbdc110bf4e 100644 --- a/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_spec.py +++ b/airbyte-integrations/bases/source-acceptance-test/unit_tests/test_spec.py @@ -652,102 +652,267 @@ def test_additional_properties_is_true(connector_spec, expectation): @pytest.mark.parametrize( - "connector_spec, should_fail, is_warning_logged", + "connector_spec, should_fail", ( ( - { - "connectionSpecification": {"type": "object", "properties": {"api_token": {"type": "string", "airbyte_secret": True}}} - }, + {"type": "object", "properties": {"api_token": {"type": "string", "airbyte_secret": True}}}, False, - False ), + ({"type": "object", "properties": {"api_token": {"type": "null"}}}, False), + ({"type": "object", "properties": {"refresh_token": {"type": "boolean", "airbyte_secret": True}}}, True), + ({"type": "object", "properties": {"refresh_token": {"type": ["null", "string"]}}}, True), + ({"type": "object", "properties": {"credentials": {"type": "array", "items": {"type": "string"}}}}, True), + ({"type": "object", "properties": {"auth": {"oneOf": [{"api_token": {"type": "string"}}]}}}, True), ( { - "connectionSpecification": {"type": "object", "properties": {"api_token": {"type": "null"}}} + "type": "object", + "properties": {"credentials": {"oneOf": [{"type": "object", "properties": {"api_key": {"type": "string"}}}]}}, }, - False, - False + True, ), + ({"type": "object", "properties": {"start_date": {"type": ["null", "string"]}}}, False), + ({"type": "object", "properties": {"credentials": {"oneOf": [{"type": "string", "const": "OAuth2.0"}]}}}, False), + ), +) +def test_airbyte_secret(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + logger = mocker.Mock() + t.test_secret_is_properly_marked( + {"connectionSpecification": connector_spec}, logger, ("api_key", "api_token", "refresh_token", "jwt", "credentials") + ) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, should_fail", + ( + ({"type": "object", "properties": {"refresh_token": {"type": ["boolean", "string"]}}}, True), + ({"type": "object", "properties": {"refresh_token": {"type": []}}}, True), + ({"type": "object", "properties": {"refresh_token": {"type": ["string"]}}}, False), + ({"type": "object", "properties": {"refresh_token": {"type": "string"}}}, False), + ({"type": "object", "properties": {"refresh_token": {"type": ["boolean", "null"]}}}, False), + ), +) +def test_property_type_is_not_array(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + t.test_property_type_is_not_array(ConnectorSpecification(connectionSpecification=connector_spec)) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, should_fail", + ( + ({"type": "object", "properties": {"refresh_token": {"type": "boolean", "airbyte_secret": True}}}, False), + ({"type": "object", "properties": {}}, False), + ({"type": "object", "properties": {"jwt": {"type": "object"}}}, True), ( { - "connectionSpecification": {"type": "object", "properties": {"refresh_token": {"type": "boolean", "airbyte_secret": True}}} + "type": "object", + "properties": { + "jwt": { + "type": "object", + "oneOf": [ + {"type": "object", "properties": {"a": {"type": "string"}}}, + {"type": "object", "properties": {"b": {"type": "string"}}}, + ], + } + }, }, False, - True ), ( { - "connectionSpecification": {"type": "object", "properties": {"jwt": {"type": "object"}}} + "type": "object", + "properties": { + "jwt": { + "type": "object", + "oneOf": [ + {"type": "object", "properties": {"a": {"type": "string"}}}, + {"type": "object", "properties": {"b": {"type": "string"}}}, + {"type": "object", "properties": {}}, + ], + } + }, }, True, - False ), + ({"type": "object", "properties": {"jwt": {"type": "object", "properties": {}}}}, True), + ), +) +def test_object_not_empty(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + t.test_object_not_empty(ConnectorSpecification(connectionSpecification=connector_spec)) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, should_fail", + ( + ({"type": "object", "properties": {"list": {"type": "array"}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": [{"type": "string"}, {"type": "boolean"}]}}}, True), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "string"}}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "number"}}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "integer"}}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "boolean"}}}}, True), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "number", "enum": [1, 2, 3]}}}}, False), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"enum": ["a", "b", "c"]}}}}, False), ( { - "connectionSpecification": {"type": "object", "properties": {"refresh_token": {"type": ["null", "string"]}}} + "type": "object", + "properties": {"list": {"type": "array", "items": {"type": "object", "properties": {"a": {"type": "string"}}}}}, }, - True, - False + False, ), + ({"type": "object", "properties": {"list": {"type": "array", "items": {"type": "boolean"}}}}, True), + ), +) +def test_array_type(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + t.test_array_type(ConnectorSpecification(connectionSpecification=connector_spec)) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, should_fail", + ( + ({"type": "object", "properties": {"a": {"type": "string"}}}, False), + ({"type": "object", "properties": {"a": {"type": "string", "allOf": [{"type": "string"}, {"maxLength": 5}]}}}, True), + ({"type": "object", "properties": {"allOf": {"type": "string"}}}, False), ( { - "connectionSpecification": {"type": "object", "properties": {"credentials": {"type": "array"}}} + "type": "object", + "properties": {"allOf": {"type": "object", "patternProperties": {"^S_": {"type": "string"}, "^I_": {"type": "integer"}}}}, }, True, - False ), ( { - "connectionSpecification": {"type": "object", "properties": {"credentials": {"type": "array", "items": {"type": "string"}}}} + "type": "object", + "properties": { + "list": { + "type": "array", + "prefixItems": [{"enum": ["Street", "Avenue", "Boulevard"]}, {"enum": ["NW", "NE", "SW", "SE"]}], + } + }, }, True, - False + ), + ), +) +def test_forbidden_complex_types(mocker, connector_spec, should_fail): + mocker.patch.object(conftest.pytest, "fail") + t = _TestSpec() + t.test_forbidden_complex_types(ConnectorSpecification(connectionSpecification=connector_spec)) + if should_fail: + conftest.pytest.fail.assert_called_once() + else: + conftest.pytest.fail.assert_not_called() + + +@pytest.mark.parametrize( + "connector_spec, is_warning_logged", + ( + ({"type": "object", "properties": {"date": {"type": "string"}}}, False), + ({"type": "object", "properties": {"date": {"type": "string", "format": "date"}}}, True), + ({"type": "object", "properties": {"date": {"type": "string", "format": "date-time"}}}, True), + ( + {"type": "object", "properties": {"date": {"type": "string", "format": "date", "pattern": "^[0-9]{2}-[0-9]{2}-[0-9]{4}$"}}}, + False, ), ( { - "connectionSpecification": {"type": "object", "properties": {"auth": {"oneOf": [{"api_token": {"type": "string"}}]}}} + "type": "object", + "properties": { + "date": { + "type": "string", + "format": "date-time", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$", + } + }, }, - True, - False + False, ), + ({"type": "object", "properties": {"date": {"type": "string", "pattern": "^[0-9]{2}-[0-9]{2}-[0-9]{4}$"}}}, False), ( { - "connectionSpecification": {"type": "object", "properties": {"credentials": {"oneOf": [{"type": "object", "properties": {"api_key": {"type": "string"}}}]}}} + "type": "object", + "properties": {"date": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$"}}, }, - True, - False + False, + ), + ), +) +def test_date_pattern(mocker, connector_spec, is_warning_logged): + mocker.patch.object(conftest.pytest, "fail") + logger = mocker.Mock() + t = _TestSpec() + t.test_date_pattern(ConnectorSpecification(connectionSpecification=connector_spec), logger) + conftest.pytest.fail.assert_not_called() + if is_warning_logged: + _, args, _ = logger.warning.mock_calls[0] + msg, *_ = args + assert "Consider setting the pattern" in msg + + +@pytest.mark.parametrize( + "connector_spec, is_warning_logged", + ( + ({"type": "object", "properties": {"date": {"type": "string"}}}, False), + ({"type": "object", "properties": {"format": {"type": "string"}}}, False), + ({"type": "object", "properties": {"date": {"type": "string", "pattern": "[a-z]*"}}}, False), + ( + {"type": "object", "properties": {"date": {"type": "string", "format": "date", "pattern": "^[0-9]{2}-[0-9]{2}-[0-9]{4}$"}}}, + False, ), ( { - "connectionSpecification": {"type": "object", "properties": {"start_date": {"type": ["null", "string"]}}} + "type": "object", + "properties": { + "date": { + "type": "string", + "format": "date-time", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$", + } + }, }, False, - False ), + ({"type": "object", "properties": {"date": {"type": "string", "pattern": "^[0-9]{2}-[0-9]{2}-[0-9]{4}$"}}}, True), ( { - "connectionSpecification": {"type": "object", "properties": {"credentials": {"oneOf": [{"type": "string", "const": "OAuth2.0"}]}}} + "type": "object", + "properties": {"date": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}:[0-9]{2})?$"}}, }, - False, - False - ) + True, + ), ), ) -def test_airbyte_secret(mocker, connector_spec, should_fail, is_warning_logged): +def test_date_format(mocker, connector_spec, is_warning_logged): mocker.patch.object(conftest.pytest, "fail") - t = _TestSpec() logger = mocker.Mock() - t.test_secret_is_properly_marked(connector_spec, logger, ("api_key", "api_token", "refresh_token", "jwt", "credentials")) - if should_fail: - conftest.pytest.fail.assert_called_once() - else: - conftest.pytest.fail.assert_not_called() + t = _TestSpec() + t.test_date_format(ConnectorSpecification(connectionSpecification=connector_spec), logger) + conftest.pytest.fail.assert_not_called() if is_warning_logged: _, args, _ = logger.warning.mock_calls[0] msg, *_ = args - assert "Some properties are marked with `airbyte_secret` although they probably should not be" in msg - else: - logger.warning.assert_not_called() + assert "Consider specifying the format" in msg @pytest.mark.parametrize( @@ -757,12 +922,15 @@ def test_airbyte_secret(mocker, connector_spec, should_fail, is_warning_logged): ("properties/start_date/type", "start_date", False), ("properties/credentials/oneOf/1/properties/api_token/type", "api_token", True), ("properties/type", None, False), # root element - ("properties/accounts/items/2/properties/jwt/type", "jwt", True) - ) + ("properties/accounts/items/2/properties/jwt/type", "jwt", True), + ), ) def test_is_spec_property_name_secret(path, expected_name, expected_result): t = _TestSpec() - assert t._is_spec_property_name_secret(path, ("api_key", "api_token", "refresh_token", "jwt", "credentials")) == (expected_name, expected_result) + assert t._is_spec_property_name_secret(path, ("api_key", "api_token", "refresh_token", "jwt", "credentials")) == ( + expected_name, + expected_result, + ) @pytest.mark.parametrize( @@ -775,14 +943,12 @@ def test_is_spec_property_name_secret(path, expected_name, expected_result): ({"type": "number"}, True), ({"type": ["null", "string"]}, True), ({"type": ["null", "boolean"]}, False), - ({"type": "object"}, True), - # the object itself cannot hold a secret but the inner items can and will be processed separately + ({"type": "object"}, False), ({"type": "object", "properties": {"api_key": {}}}, False), - ({"type": "array"}, True), - # same as object + ({"type": "array"}, False), ({"type": "array", "items": {"type": "string"}}, False), - ({"type": "string", "const": "OAuth2.0"}, False) - ) + ({"type": "string", "const": "OAuth2.0"}, False), + ), ) def test_property_can_store_secret(property_def, can_store_secret): t = _TestSpec() From 09421ce197337cb6469ff516f68a0acc2f593389 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 30 Jan 2023 14:19:10 +0200 Subject: [PATCH 175/195] =?UTF-8?q?=F0=9F=AA=9F=20=F0=9F=A7=B9=20Stream=20?= =?UTF-8?q?details=20panel=20text=20cols=20should=20be=20equal=20width=20(?= =?UTF-8?q?#21810)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix tooltip custom classnames override * add custom style for tooltip - to show the full content * update stream details table styles: set min width for cells, and set width(range) for text cells * wrap text cells with CatalogTreeTableCell component * fix visible scroll when we don't need it * fix radio button vertical alignment * set static width for data type, cursor, pr; set equal width for source and destination field names; * fix import order after eslint rules updates --- .../next/CatalogTreeTableCell.module.scss | 4 +++ .../CatalogTree/next/CatalogTreeTableCell.tsx | 7 +++- .../StreamDetailsPanel.module.scss | 2 +- .../CursorCell/CursorCell.module.scss | 4 +++ .../CursorCell/CursorCell.tsx | 7 +++- .../StreamFieldsTable.module.scss | 35 ++++++++++++------- .../StreamFieldsTable/StreamFieldsTable.tsx | 18 +++++++--- .../src/components/ui/Tooltip/Tooltip.tsx | 8 ++++- 8 files changed, 65 insertions(+), 20 deletions(-) diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableCell.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableCell.module.scss index 07287bff95d8c..0e0ee0458eec0 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableCell.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableCell.module.scss @@ -33,3 +33,7 @@ $large: 200px; .noEllipsis > * { overflow: visible; } + +.fullWidthTooltip { + max-width: none; +} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableCell.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableCell.tsx index 82287e3ef5a54..17c88fba4f690 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableCell.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/CatalogTreeTableCell.tsx @@ -73,7 +73,12 @@ export const CatalogTreeTableCell: React.FC {withTooltip ? ( - + ) : ( diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.module.scss index b28dac85807c4..a5326e7f06140 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamDetailsPanel.module.scss @@ -23,5 +23,5 @@ $container-right-space: variables.$spacing-xl * 2; .tableContainer { height: calc(100% - 64px); - overflow: scroll; + overflow: auto; } diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/CursorCell/CursorCell.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/CursorCell/CursorCell.module.scss index ce46b50cf07bf..883ef3a34d69c 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/CursorCell/CursorCell.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/CursorCell/CursorCell.module.scss @@ -2,3 +2,7 @@ display: flex; align-items: center; } + +.radio { + vertical-align: middle; +} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/CursorCell/CursorCell.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/CursorCell/CursorCell.tsx index f05a00841cd12..16a716b545f27 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/CursorCell/CursorCell.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/CursorCell/CursorCell.tsx @@ -30,7 +30,12 @@ export const CursorCell: React.FC = ({ const isCursorChecked = isCursor(row.original.path); const radioButton = ( - onCursorSelect(row.original.path)} disabled={!getValue()} /> + onCursorSelect(row.original.path)} + disabled={!getValue()} + /> ); return !getValue() && isCursorChecked ? ( diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss index 8879f4bf39144..977725382454a 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.module.scss @@ -2,7 +2,8 @@ @use "scss/variables"; $cell-height: 28px; -$cell-left-padding: variables.$spacing-xl + variables.$spacing-sm; +$cell-padding: variables.$spacing-xl + variables.$spacing-sm; +$cell-fixed-width: 100px; .customTableStyle { td { @@ -20,7 +21,7 @@ $cell-left-padding: variables.$spacing-xl + variables.$spacing-sm; text-transform: capitalize; &:first-child { - padding-left: $cell-left-padding; + padding-left: $cell-padding; border-radius: 0; } @@ -44,7 +45,7 @@ $cell-left-padding: variables.$spacing-xl + variables.$spacing-sm; } &:first-child { - padding-left: $cell-left-padding; + padding-left: $cell-padding; border-radius: 0; } @@ -59,8 +60,13 @@ $cell-left-padding: variables.$spacing-xl + variables.$spacing-sm; padding: 0; &:first-child { - padding-left: $cell-left-padding; + padding-left: $cell-padding; border-radius: 0; + min-width: 130px; + } + + &:last-child { + padding-right: $cell-padding; } } @@ -68,14 +74,27 @@ $cell-left-padding: variables.$spacing-xl + variables.$spacing-sm; @extend %bodyCell; color: colors.$dark-blue; + max-width: 0; } .dataTypeCell { @extend %bodyCell; + width: $cell-fixed-width; color: colors.$grey-400; } +.cursorCell { + padding: 0; + width: $cell-fixed-width; +} + +.pkCell { + @extend %bodyCell; + + width: $cell-fixed-width; +} + .arrowCell { @extend %bodyCell; @@ -83,11 +102,3 @@ $cell-left-padding: variables.$spacing-xl + variables.$spacing-sm; color: colors.$grey-200; } } - -.radioBtnCell { - display: flex; - align-items: center; - height: $cell-height; - overflow: unset; - padding-left: 0; -} diff --git a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx index 4860f0e97e4d3..4ad806d1e57cd 100644 --- a/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx +++ b/airbyte-webapp/src/components/connection/CatalogTree/next/StreamDetailsPanel/StreamFieldsTable/StreamFieldsTable.tsx @@ -9,6 +9,7 @@ import { ArrowRightIcon } from "components/icons/ArrowRightIcon"; import { CheckBox } from "components/ui/CheckBox"; import { FlexContainer } from "components/ui/Flex"; import { NextTable } from "components/ui/NextTable"; +import { Text } from "components/ui/Text"; import { SyncSchemaField, SyncSchemaFieldObject } from "core/domain/catalog"; import { AirbyteStreamConfiguration } from "core/request/AirbyteClient"; @@ -21,6 +22,7 @@ import { CursorCell } from "./CursorCell"; import { PKCell } from "./PKCell"; import styles from "./StreamFieldsTable.module.scss"; import { SyncFieldCell } from "./SyncFieldCell"; +import { CatalogTreeTableCell } from "../../CatalogTreeTableCell"; export interface TableStream { field: SyncSchemaField; @@ -155,7 +157,11 @@ export const StreamFieldsTable: React.FC = ({ columnHelper.accessor("path", { id: "sourcePath", header: () => , - cell: ({ getValue }) => pathDisplayName(getValue()), + cell: ({ getValue }) => ( + + {pathDisplayName(getValue())} + + ), meta: { thClassName: styles.headerCell, tdClassName: styles.textCell, @@ -185,7 +191,7 @@ export const StreamFieldsTable: React.FC = ({ ), meta: { thClassName: styles.headerCell, - tdClassName: styles.radioBtnCell, + tdClassName: styles.cursorCell, }, }), columnHelper.accessor("primaryKeyDefined", { @@ -202,7 +208,7 @@ export const StreamFieldsTable: React.FC = ({ meta: { thClassName: styles.headerCell, - tdClassName: styles.textCell, + tdClassName: styles.pkCell, }, }), ], @@ -233,7 +239,11 @@ export const StreamFieldsTable: React.FC = ({ columnHelper.accessor("path", { id: "destinationPath", header: () => , - cell: ({ getValue }) => pathDisplayName(getValue()), + cell: ({ getValue }) => ( + + {pathDisplayName(getValue())} + + ), meta: { thClassName: styles.headerCell, tdClassName: styles.textCell, diff --git a/airbyte-webapp/src/components/ui/Tooltip/Tooltip.tsx b/airbyte-webapp/src/components/ui/Tooltip/Tooltip.tsx index 41a48b896f1c0..5b61dfa945b31 100644 --- a/airbyte-webapp/src/components/ui/Tooltip/Tooltip.tsx +++ b/airbyte-webapp/src/components/ui/Tooltip/Tooltip.tsx @@ -80,7 +80,13 @@ export const Tooltip: React.FC> = (props)
    Date: Mon, 30 Jan 2023 08:28:39 -0600 Subject: [PATCH 176/195] Turn off default httpavailabilitystrategy for source-zendesk-support (GA) (#22027) * Turn off default for source-zendesk-support (GA) * Update streams.py * Update streams.py * Update zendesk-support.md * auto-bump connector version --------- Co-authored-by: Octavia Squidington III --- .../init/src/main/resources/seed/source_definitions.yaml | 2 +- .../init/src/main/resources/seed/source_specs.yaml | 2 +- .../connectors/source-zendesk-support/Dockerfile | 2 +- .../source-zendesk-support/source_zendesk_support/streams.py | 5 +++++ docs/integrations/sources/zendesk-support.md | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 8f2f8d5a46626..c6b608a34915a 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -2015,7 +2015,7 @@ - name: Zendesk Support sourceDefinitionId: 79c1aa37-dae3-42ae-b333-d1c105477715 dockerRepository: airbyte/source-zendesk-support - dockerImageTag: 0.2.20 + dockerImageTag: 0.2.21 documentationUrl: https://docs.airbyte.com/integrations/sources/zendesk-support icon: zendesk-support.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index a152dfdcad847..661ff19616b92 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -16432,7 +16432,7 @@ path_in_connector_config: - "credentials" - "client_secret" -- dockerImage: "airbyte/source-zendesk-support:0.2.20" +- dockerImage: "airbyte/source-zendesk-support:0.2.21" spec: documentationUrl: "https://docs.airbyte.com/integrations/sources/zendesk-support" connectionSpecification: diff --git a/airbyte-integrations/connectors/source-zendesk-support/Dockerfile b/airbyte-integrations/connectors/source-zendesk-support/Dockerfile index e6cd2ad493b80..4010966ca4e23 100644 --- a/airbyte-integrations/connectors/source-zendesk-support/Dockerfile +++ b/airbyte-integrations/connectors/source-zendesk-support/Dockerfile @@ -25,5 +25,5 @@ COPY source_zendesk_support ./source_zendesk_support ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.2.20 +LABEL io.airbyte.version=0.2.21 LABEL io.airbyte.name=airbyte/source-zendesk-support diff --git a/airbyte-integrations/connectors/source-zendesk-support/source_zendesk_support/streams.py b/airbyte-integrations/connectors/source-zendesk-support/source_zendesk_support/streams.py index 34329111efadd..d2139bed9593b 100644 --- a/airbyte-integrations/connectors/source-zendesk-support/source_zendesk_support/streams.py +++ b/airbyte-integrations/connectors/source-zendesk-support/source_zendesk_support/streams.py @@ -21,6 +21,7 @@ import pytz import requests from airbyte_cdk.models import SyncMode +from airbyte_cdk.sources.streams.availability_strategy import AvailabilityStrategy from airbyte_cdk.sources.streams.http import HttpStream from airbyte_cdk.sources.streams.http.auth.core import HttpAuthenticator from airbyte_cdk.sources.streams.http.exceptions import DefaultBackoffException @@ -116,6 +117,10 @@ def __init__(self, subdomain: str, start_date: str, ignore_pagination: bool = Fa self._subdomain = subdomain self._ignore_pagination = ignore_pagination + @property + def availability_strategy(self) -> Optional["AvailabilityStrategy"]: + return None + def backoff_time(self, response: requests.Response) -> Union[int, float]: """ The rate limit is 700 requests per minute diff --git a/docs/integrations/sources/zendesk-support.md b/docs/integrations/sources/zendesk-support.md index 98e57025c7363..86a0bea5000f7 100644 --- a/docs/integrations/sources/zendesk-support.md +++ b/docs/integrations/sources/zendesk-support.md @@ -60,6 +60,7 @@ The Zendesk connector ideally should not run into Zendesk API limitations under | Version | Date | Pull Request | Subject | |:---------|:-----------|:---------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `0.2.21` | 2023-01-27 | [22027](https://github.com/airbytehq/airbyte/pull/22027) | Set `AvailabilityStrategy` for streams explicitly to `None` | | `0.2.20` | 2022-12-28 | [20900](https://github.com/airbytehq/airbyte/pull/20900) | Remove synchronous time.sleep, add logging, reduce backoff time | | `0.2.19` | 2022-12-09 | [19967](https://github.com/airbytehq/airbyte/pull/19967) | Fix reading response for more than 100k records | | `0.2.18` | 2022-11-29 | [19432](https://github.com/airbytehq/airbyte/pull/19432) | Revert changes from version 0.2.15, use a test read instead | From 5a87156f56a234724a7005cca8382c9eeb9269e5 Mon Sep 17 00:00:00 2001 From: Yatsuk Bogdan Date: Mon, 30 Jan 2023 17:02:05 +0200 Subject: [PATCH 177/195] =?UTF-8?q?=F0=9F=AA=9F=C2=A0=F0=9F=8E=89=20Adds?= =?UTF-8?q?=20extra=20information=20while=20deleting=20source=20or=20desti?= =?UTF-8?q?nation=20(#21594)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adds extra information while deleting source or destination * Fixes extra property to make the usage more general, not limiting with p tag * Fixes extra to additionalContent; Adds pluralization for deletion message * Add bold text for connection names * Update airbyte-webapp/src/pages/destination/DestinationSettingsPage/DestinationSettingsPage.tsx Co-authored-by: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> * Update airbyte-webapp/src/pages/SourcesPage/pages/SourceItemPage/components/SourceSettings.tsx Co-authored-by: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> * Fixes connection names rendering; Changes sources/destination deletion modal text * Fixes useDeleteModal hook usage --------- Co-authored-by: Edmundo Ruiz Ghanem <168664+edmundito@users.noreply.github.com> --- .../ConfirmationModal/ConfirmationModal.tsx | 3 +++ .../common/DeleteBlock/DeleteBlock.tsx | 1 + .../ConfirmationModalService.tsx | 1 + airbyte-webapp/src/hooks/useDeleteModal.tsx | 11 ++++++--- airbyte-webapp/src/locales/en.json | 5 ++-- .../components/SourceSettings.tsx | 20 ++++++++++++++-- .../DestinationSettingsPage.tsx | 23 +++++++++++++++++-- 7 files changed, 55 insertions(+), 9 deletions(-) diff --git a/airbyte-webapp/src/components/common/ConfirmationModal/ConfirmationModal.tsx b/airbyte-webapp/src/components/common/ConfirmationModal/ConfirmationModal.tsx index 0362ae1aabc55..a2c7db549926e 100644 --- a/airbyte-webapp/src/components/common/ConfirmationModal/ConfirmationModal.tsx +++ b/airbyte-webapp/src/components/common/ConfirmationModal/ConfirmationModal.tsx @@ -16,12 +16,14 @@ export interface ConfirmationModalProps { onSubmit: () => void; submitButtonDataId?: string; cancelButtonText?: string; + additionalContent?: React.ReactNode; } export const ConfirmationModal: React.FC = ({ onClose, title, text, + additionalContent, textValues, onSubmit, submitButtonText, @@ -35,6 +37,7 @@ export const ConfirmationModal: React.FC = ({ } testId="confirmationModal">
    + {additionalContent}