airbyte-faros-destination 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +178 -0
- package/lib/common/graphql-client.d.ts +134 -0
- package/lib/common/graphql-client.js +712 -0
- package/lib/common/graphql-client.js.map +1 -0
- package/lib/common/graphql-writer.d.ts +19 -0
- package/lib/common/graphql-writer.js +46 -0
- package/lib/common/graphql-writer.js.map +1 -0
- package/lib/common/types.d.ts +50 -0
- package/lib/common/types.js +20 -0
- package/lib/common/types.js.map +1 -0
- package/lib/common/write-stats.d.ts +16 -0
- package/lib/common/write-stats.js +49 -0
- package/lib/common/write-stats.js.map +1 -0
- package/lib/community/hasura-backend.d.ts +8 -0
- package/lib/community/hasura-backend.js +31 -0
- package/lib/community/hasura-backend.js.map +1 -0
- package/lib/converters/agileaccelerator/agileaccelerator_types.d.ts +315 -0
- package/lib/converters/agileaccelerator/agileaccelerator_types.js +82 -0
- package/lib/converters/agileaccelerator/agileaccelerator_types.js.map +1 -0
- package/lib/converters/agileaccelerator/common.d.ts +64 -0
- package/lib/converters/agileaccelerator/common.js +168 -0
- package/lib/converters/agileaccelerator/common.js.map +1 -0
- package/lib/converters/agileaccelerator/works.d.ts +7 -0
- package/lib/converters/agileaccelerator/works.js +106 -0
- package/lib/converters/agileaccelerator/works.js.map +1 -0
- package/lib/converters/asana/common.d.ts +40 -0
- package/lib/converters/asana/common.js +70 -0
- package/lib/converters/asana/common.js.map +1 -0
- package/lib/converters/asana/projects.d.ts +7 -0
- package/lib/converters/asana/projects.js +30 -0
- package/lib/converters/asana/projects.js.map +1 -0
- package/lib/converters/asana/sections.d.ts +7 -0
- package/lib/converters/asana/sections.js +31 -0
- package/lib/converters/asana/sections.js.map +1 -0
- package/lib/converters/asana/tags.d.ts +7 -0
- package/lib/converters/asana/tags.js +23 -0
- package/lib/converters/asana/tags.js.map +1 -0
- package/lib/converters/asana/tasks.d.ts +13 -0
- package/lib/converters/asana/tasks.js +157 -0
- package/lib/converters/asana/tasks.js.map +1 -0
- package/lib/converters/asana/users.d.ts +7 -0
- package/lib/converters/asana/users.js +17 -0
- package/lib/converters/asana/users.js.map +1 -0
- package/lib/converters/azure-repos/commits.d.ts +7 -0
- package/lib/converters/azure-repos/commits.js +60 -0
- package/lib/converters/azure-repos/commits.js.map +1 -0
- package/lib/converters/azure-repos/common.d.ts +27 -0
- package/lib/converters/azure-repos/common.js +86 -0
- package/lib/converters/azure-repos/common.js.map +1 -0
- package/lib/converters/azure-repos/models.d.ts +224 -0
- package/lib/converters/azure-repos/models.js +33 -0
- package/lib/converters/azure-repos/models.js.map +1 -0
- package/lib/converters/azure-repos/pull_requests.d.ts +7 -0
- package/lib/converters/azure-repos/pull_requests.js +92 -0
- package/lib/converters/azure-repos/pull_requests.js.map +1 -0
- package/lib/converters/azure-repos/repositories.d.ts +8 -0
- package/lib/converters/azure-repos/repositories.js +84 -0
- package/lib/converters/azure-repos/repositories.js.map +1 -0
- package/lib/converters/azure-repos/users.d.ts +7 -0
- package/lib/converters/azure-repos/users.js +45 -0
- package/lib/converters/azure-repos/users.js.map +1 -0
- package/lib/converters/azure-workitems/boards.d.ts +7 -0
- package/lib/converters/azure-workitems/boards.js +26 -0
- package/lib/converters/azure-workitems/boards.js.map +1 -0
- package/lib/converters/azure-workitems/common.d.ts +8 -0
- package/lib/converters/azure-workitems/common.js +18 -0
- package/lib/converters/azure-workitems/common.js.map +1 -0
- package/lib/converters/azure-workitems/iterations.d.ts +7 -0
- package/lib/converters/azure-workitems/iterations.js +27 -0
- package/lib/converters/azure-workitems/iterations.js.map +1 -0
- package/lib/converters/azure-workitems/models.d.ts +103 -0
- package/lib/converters/azure-workitems/models.js +11 -0
- package/lib/converters/azure-workitems/models.js.map +1 -0
- package/lib/converters/azure-workitems/users.d.ts +7 -0
- package/lib/converters/azure-workitems/users.js +27 -0
- package/lib/converters/azure-workitems/users.js.map +1 -0
- package/lib/converters/azure-workitems/workitems.d.ts +7 -0
- package/lib/converters/azure-workitems/workitems.js +55 -0
- package/lib/converters/azure-workitems/workitems.js.map +1 -0
- package/lib/converters/azureactivedirectory/common.d.ts +8 -0
- package/lib/converters/azureactivedirectory/common.js +18 -0
- package/lib/converters/azureactivedirectory/common.js.map +1 -0
- package/lib/converters/azureactivedirectory/groups.d.ts +7 -0
- package/lib/converters/azureactivedirectory/groups.js +50 -0
- package/lib/converters/azureactivedirectory/groups.js.map +1 -0
- package/lib/converters/azureactivedirectory/models.d.ts +61 -0
- package/lib/converters/azureactivedirectory/models.js +3 -0
- package/lib/converters/azureactivedirectory/models.js.map +1 -0
- package/lib/converters/azureactivedirectory/users.d.ts +8 -0
- package/lib/converters/azureactivedirectory/users.js +84 -0
- package/lib/converters/azureactivedirectory/users.js.map +1 -0
- package/lib/converters/azurepipeline/builds.d.ts +7 -0
- package/lib/converters/azurepipeline/builds.js +91 -0
- package/lib/converters/azurepipeline/builds.js.map +1 -0
- package/lib/converters/azurepipeline/common.d.ts +33 -0
- package/lib/converters/azurepipeline/common.js +150 -0
- package/lib/converters/azurepipeline/common.js.map +1 -0
- package/lib/converters/azurepipeline/models.d.ts +294 -0
- package/lib/converters/azurepipeline/models.js +44 -0
- package/lib/converters/azurepipeline/models.js.map +1 -0
- package/lib/converters/azurepipeline/pipelines.d.ts +8 -0
- package/lib/converters/azurepipeline/pipelines.js +47 -0
- package/lib/converters/azurepipeline/pipelines.js.map +1 -0
- package/lib/converters/azurepipeline/releases.d.ts +7 -0
- package/lib/converters/azurepipeline/releases.js +35 -0
- package/lib/converters/azurepipeline/releases.js.map +1 -0
- package/lib/converters/backlog/common.d.ts +20 -0
- package/lib/converters/backlog/common.js +60 -0
- package/lib/converters/backlog/common.js.map +1 -0
- package/lib/converters/backlog/issues.d.ts +7 -0
- package/lib/converters/backlog/issues.js +120 -0
- package/lib/converters/backlog/issues.js.map +1 -0
- package/lib/converters/backlog/models.d.ts +156 -0
- package/lib/converters/backlog/models.js +24 -0
- package/lib/converters/backlog/models.js.map +1 -0
- package/lib/converters/backlog/projects.d.ts +7 -0
- package/lib/converters/backlog/projects.js +79 -0
- package/lib/converters/backlog/projects.js.map +1 -0
- package/lib/converters/backlog/users.d.ts +7 -0
- package/lib/converters/backlog/users.js +27 -0
- package/lib/converters/backlog/users.js.map +1 -0
- package/lib/converters/bamboohr/common.d.ts +15 -0
- package/lib/converters/bamboohr/common.js +30 -0
- package/lib/converters/bamboohr/common.js.map +1 -0
- package/lib/converters/bamboohr/models.d.ts +34 -0
- package/lib/converters/bamboohr/models.js +3 -0
- package/lib/converters/bamboohr/models.js.map +1 -0
- package/lib/converters/bamboohr/users.d.ts +11 -0
- package/lib/converters/bamboohr/users.js +165 -0
- package/lib/converters/bamboohr/users.js.map +1 -0
- package/lib/converters/bitbucket/branches.d.ts +7 -0
- package/lib/converters/bitbucket/branches.js +33 -0
- package/lib/converters/bitbucket/branches.js.map +1 -0
- package/lib/converters/bitbucket/commits.d.ts +8 -0
- package/lib/converters/bitbucket/commits.js +56 -0
- package/lib/converters/bitbucket/commits.js.map +1 -0
- package/lib/converters/bitbucket/common.d.ts +39 -0
- package/lib/converters/bitbucket/common.js +87 -0
- package/lib/converters/bitbucket/common.js.map +1 -0
- package/lib/converters/bitbucket/deployments.d.ts +12 -0
- package/lib/converters/bitbucket/deployments.js +113 -0
- package/lib/converters/bitbucket/deployments.js.map +1 -0
- package/lib/converters/bitbucket/issues.d.ts +12 -0
- package/lib/converters/bitbucket/issues.js +129 -0
- package/lib/converters/bitbucket/issues.js.map +1 -0
- package/lib/converters/bitbucket/pipeline_steps.d.ts +10 -0
- package/lib/converters/bitbucket/pipeline_steps.js +84 -0
- package/lib/converters/bitbucket/pipeline_steps.js.map +1 -0
- package/lib/converters/bitbucket/pipelines.d.ts +8 -0
- package/lib/converters/bitbucket/pipelines.js +96 -0
- package/lib/converters/bitbucket/pipelines.js.map +1 -0
- package/lib/converters/bitbucket/pull_request_activities.d.ts +12 -0
- package/lib/converters/bitbucket/pull_request_activities.js +113 -0
- package/lib/converters/bitbucket/pull_request_activities.js.map +1 -0
- package/lib/converters/bitbucket/pull_requests.d.ts +10 -0
- package/lib/converters/bitbucket/pull_requests.js +98 -0
- package/lib/converters/bitbucket/pull_requests.js.map +1 -0
- package/lib/converters/bitbucket/repositories.d.ts +7 -0
- package/lib/converters/bitbucket/repositories.js +57 -0
- package/lib/converters/bitbucket/repositories.js.map +1 -0
- package/lib/converters/bitbucket/types.d.ts +662 -0
- package/lib/converters/bitbucket/types.js +3 -0
- package/lib/converters/bitbucket/types.js.map +1 -0
- package/lib/converters/bitbucket/workspace_users.d.ts +7 -0
- package/lib/converters/bitbucket/workspace_users.js +32 -0
- package/lib/converters/bitbucket/workspace_users.js.map +1 -0
- package/lib/converters/bitbucket/workspaces.d.ts +8 -0
- package/lib/converters/bitbucket/workspaces.js +62 -0
- package/lib/converters/bitbucket/workspaces.js.map +1 -0
- package/lib/converters/bitbucket-server/commits.d.ts +7 -0
- package/lib/converters/bitbucket-server/commits.js +34 -0
- package/lib/converters/bitbucket-server/commits.js.map +1 -0
- package/lib/converters/bitbucket-server/common.d.ts +14 -0
- package/lib/converters/bitbucket-server/common.js +47 -0
- package/lib/converters/bitbucket-server/common.js.map +1 -0
- package/lib/converters/bitbucket-server/project_users.d.ts +8 -0
- package/lib/converters/bitbucket-server/project_users.js +36 -0
- package/lib/converters/bitbucket-server/project_users.js.map +1 -0
- package/lib/converters/bitbucket-server/projects.d.ts +7 -0
- package/lib/converters/bitbucket-server/projects.js +29 -0
- package/lib/converters/bitbucket-server/projects.js.map +1 -0
- package/lib/converters/bitbucket-server/pull_request_activities.d.ts +7 -0
- package/lib/converters/bitbucket-server/pull_request_activities.js +89 -0
- package/lib/converters/bitbucket-server/pull_request_activities.js.map +1 -0
- package/lib/converters/bitbucket-server/pull_request_diffs.d.ts +8 -0
- package/lib/converters/bitbucket-server/pull_request_diffs.js +41 -0
- package/lib/converters/bitbucket-server/pull_request_diffs.js.map +1 -0
- package/lib/converters/bitbucket-server/pull_requests.d.ts +9 -0
- package/lib/converters/bitbucket-server/pull_requests.js +88 -0
- package/lib/converters/bitbucket-server/pull_requests.js.map +1 -0
- package/lib/converters/bitbucket-server/repositories.d.ts +7 -0
- package/lib/converters/bitbucket-server/repositories.js +35 -0
- package/lib/converters/bitbucket-server/repositories.js.map +1 -0
- package/lib/converters/bitbucket-server/tags.d.ts +7 -0
- package/lib/converters/bitbucket-server/tags.js +30 -0
- package/lib/converters/bitbucket-server/tags.js.map +1 -0
- package/lib/converters/buildkite/builds.d.ts +7 -0
- package/lib/converters/buildkite/builds.js +89 -0
- package/lib/converters/buildkite/builds.js.map +1 -0
- package/lib/converters/buildkite/common.d.ts +129 -0
- package/lib/converters/buildkite/common.js +162 -0
- package/lib/converters/buildkite/common.js.map +1 -0
- package/lib/converters/buildkite/organizations.d.ts +7 -0
- package/lib/converters/buildkite/organizations.js +30 -0
- package/lib/converters/buildkite/organizations.js.map +1 -0
- package/lib/converters/buildkite/pipelines.d.ts +7 -0
- package/lib/converters/buildkite/pipelines.js +33 -0
- package/lib/converters/buildkite/pipelines.js.map +1 -0
- package/lib/converters/circleci/common.d.ts +27 -0
- package/lib/converters/circleci/common.js +96 -0
- package/lib/converters/circleci/common.js.map +1 -0
- package/lib/converters/circleci/models.d.ts +128 -0
- package/lib/converters/circleci/models.js +10 -0
- package/lib/converters/circleci/models.js.map +1 -0
- package/lib/converters/circleci/pipelines.d.ts +7 -0
- package/lib/converters/circleci/pipelines.js +61 -0
- package/lib/converters/circleci/pipelines.js.map +1 -0
- package/lib/converters/circleci/projects.d.ts +7 -0
- package/lib/converters/circleci/projects.js +39 -0
- package/lib/converters/circleci/projects.js.map +1 -0
- package/lib/converters/circleci/tests.d.ts +18 -0
- package/lib/converters/circleci/tests.js +183 -0
- package/lib/converters/circleci/tests.js.map +1 -0
- package/lib/converters/clickup/common.d.ts +21 -0
- package/lib/converters/clickup/common.js +58 -0
- package/lib/converters/clickup/common.js.map +1 -0
- package/lib/converters/clickup/folders.d.ts +7 -0
- package/lib/converters/clickup/folders.js +34 -0
- package/lib/converters/clickup/folders.js.map +1 -0
- package/lib/converters/clickup/goals.d.ts +6 -0
- package/lib/converters/clickup/goals.js +15 -0
- package/lib/converters/clickup/goals.js.map +1 -0
- package/lib/converters/clickup/lists.d.ts +7 -0
- package/lib/converters/clickup/lists.js +34 -0
- package/lib/converters/clickup/lists.js.map +1 -0
- package/lib/converters/clickup/spaces.d.ts +7 -0
- package/lib/converters/clickup/spaces.js +34 -0
- package/lib/converters/clickup/spaces.js.map +1 -0
- package/lib/converters/clickup/status_histories.d.ts +7 -0
- package/lib/converters/clickup/status_histories.js +42 -0
- package/lib/converters/clickup/status_histories.js.map +1 -0
- package/lib/converters/clickup/tasks.d.ts +11 -0
- package/lib/converters/clickup/tasks.js +141 -0
- package/lib/converters/clickup/tasks.js.map +1 -0
- package/lib/converters/clickup/workspaces.d.ts +7 -0
- package/lib/converters/clickup/workspaces.js +40 -0
- package/lib/converters/clickup/workspaces.js.map +1 -0
- package/lib/converters/common/common.d.ts +10 -0
- package/lib/converters/common/common.js +20 -0
- package/lib/converters/common/common.js.map +1 -0
- package/lib/converters/common/vcs.d.ts +21 -0
- package/lib/converters/common/vcs.js +68 -0
- package/lib/converters/common/vcs.js.map +1 -0
- package/lib/converters/converter-registry.d.ts +25 -0
- package/lib/converters/converter-registry.js +66 -0
- package/lib/converters/converter-registry.js.map +1 -0
- package/lib/converters/converter.d.ts +80 -0
- package/lib/converters/converter.js +153 -0
- package/lib/converters/converter.js.map +1 -0
- package/lib/converters/datadog/common.d.ts +27 -0
- package/lib/converters/datadog/common.js +35 -0
- package/lib/converters/datadog/common.js.map +1 -0
- package/lib/converters/datadog/incidents.d.ts +10 -0
- package/lib/converters/datadog/incidents.js +129 -0
- package/lib/converters/datadog/incidents.js.map +1 -0
- package/lib/converters/datadog/metrics.d.ts +13 -0
- package/lib/converters/datadog/metrics.js +63 -0
- package/lib/converters/datadog/metrics.js.map +1 -0
- package/lib/converters/datadog/users.d.ts +7 -0
- package/lib/converters/datadog/users.js +28 -0
- package/lib/converters/datadog/users.js.map +1 -0
- package/lib/converters/docker/common.d.ts +88 -0
- package/lib/converters/docker/common.js +78 -0
- package/lib/converters/docker/common.js.map +1 -0
- package/lib/converters/docker/tags.d.ts +7 -0
- package/lib/converters/docker/tags.js +97 -0
- package/lib/converters/docker/tags.js.map +1 -0
- package/lib/converters/faros-feed/faros_feed.d.ts +13 -0
- package/lib/converters/faros-feed/faros_feed.js +25 -0
- package/lib/converters/faros-feed/faros_feed.js.map +1 -0
- package/lib/converters/faros-feeds/faros_feed.d.ts +9 -0
- package/lib/converters/faros-feeds/faros_feed.js +69 -0
- package/lib/converters/faros-feeds/faros_feed.js.map +1 -0
- package/lib/converters/faros-feeds/model_names.d.ts +1 -0
- package/lib/converters/faros-feeds/model_names.js +136 -0
- package/lib/converters/faros-feeds/model_names.js.map +1 -0
- package/lib/converters/faros-graphql/faros_graph.d.ts +13 -0
- package/lib/converters/faros-graphql/faros_graph.js +25 -0
- package/lib/converters/faros-graphql/faros_graph.js.map +1 -0
- package/lib/converters/firehydrant/common.d.ts +20 -0
- package/lib/converters/firehydrant/common.js +31 -0
- package/lib/converters/firehydrant/common.js.map +1 -0
- package/lib/converters/firehydrant/incidents.d.ts +14 -0
- package/lib/converters/firehydrant/incidents.js +237 -0
- package/lib/converters/firehydrant/incidents.js.map +1 -0
- package/lib/converters/firehydrant/models.d.ts +212 -0
- package/lib/converters/firehydrant/models.js +77 -0
- package/lib/converters/firehydrant/models.js.map +1 -0
- package/lib/converters/firehydrant/teams.d.ts +7 -0
- package/lib/converters/firehydrant/teams.js +27 -0
- package/lib/converters/firehydrant/teams.js.map +1 -0
- package/lib/converters/firehydrant/users.d.ts +7 -0
- package/lib/converters/firehydrant/users.js +39 -0
- package/lib/converters/firehydrant/users.js.map +1 -0
- package/lib/converters/github/assignees.d.ts +7 -0
- package/lib/converters/github/assignees.js +20 -0
- package/lib/converters/github/assignees.js.map +1 -0
- package/lib/converters/github/branches.d.ts +7 -0
- package/lib/converters/github/branches.js +29 -0
- package/lib/converters/github/branches.js.map +1 -0
- package/lib/converters/github/collaborators.d.ts +7 -0
- package/lib/converters/github/collaborators.js +20 -0
- package/lib/converters/github/collaborators.js.map +1 -0
- package/lib/converters/github/commits.d.ts +7 -0
- package/lib/converters/github/commits.js +49 -0
- package/lib/converters/github/commits.js.map +1 -0
- package/lib/converters/github/common.d.ts +34 -0
- package/lib/converters/github/common.js +165 -0
- package/lib/converters/github/common.js.map +1 -0
- package/lib/converters/github/issue_labels.d.ts +7 -0
- package/lib/converters/github/issue_labels.js +21 -0
- package/lib/converters/github/issue_labels.js.map +1 -0
- package/lib/converters/github/issue_milestones.d.ts +8 -0
- package/lib/converters/github/issue_milestones.js +43 -0
- package/lib/converters/github/issue_milestones.js.map +1 -0
- package/lib/converters/github/issues.d.ts +9 -0
- package/lib/converters/github/issues.js +91 -0
- package/lib/converters/github/issues.js.map +1 -0
- package/lib/converters/github/organizations.d.ts +7 -0
- package/lib/converters/github/organizations.js +39 -0
- package/lib/converters/github/organizations.js.map +1 -0
- package/lib/converters/github/projects.d.ts +7 -0
- package/lib/converters/github/projects.js +22 -0
- package/lib/converters/github/projects.js.map +1 -0
- package/lib/converters/github/pull_request_commits.d.ts +7 -0
- package/lib/converters/github/pull_request_commits.js +46 -0
- package/lib/converters/github/pull_request_commits.js.map +1 -0
- package/lib/converters/github/pull_request_stats.d.ts +7 -0
- package/lib/converters/github/pull_request_stats.js +44 -0
- package/lib/converters/github/pull_request_stats.js.map +1 -0
- package/lib/converters/github/pull_requests.d.ts +7 -0
- package/lib/converters/github/pull_requests.js +63 -0
- package/lib/converters/github/pull_requests.js.map +1 -0
- package/lib/converters/github/releases.d.ts +7 -0
- package/lib/converters/github/releases.js +52 -0
- package/lib/converters/github/releases.js.map +1 -0
- package/lib/converters/github/repositories.d.ts +7 -0
- package/lib/converters/github/repositories.js +45 -0
- package/lib/converters/github/repositories.js.map +1 -0
- package/lib/converters/github/review_comments.d.ts +7 -0
- package/lib/converters/github/review_comments.js +41 -0
- package/lib/converters/github/review_comments.js.map +1 -0
- package/lib/converters/github/reviews.d.ts +7 -0
- package/lib/converters/github/reviews.js +61 -0
- package/lib/converters/github/reviews.js.map +1 -0
- package/lib/converters/github/tags.d.ts +7 -0
- package/lib/converters/github/tags.js +32 -0
- package/lib/converters/github/tags.js.map +1 -0
- package/lib/converters/github/team_memberships.d.ts +7 -0
- package/lib/converters/github/team_memberships.js +41 -0
- package/lib/converters/github/team_memberships.js.map +1 -0
- package/lib/converters/github/teams.d.ts +7 -0
- package/lib/converters/github/teams.js +28 -0
- package/lib/converters/github/teams.js.map +1 -0
- package/lib/converters/github/users.d.ts +7 -0
- package/lib/converters/github/users.js +20 -0
- package/lib/converters/github/users.js.map +1 -0
- package/lib/converters/github/workflow_runs.d.ts +7 -0
- package/lib/converters/github/workflow_runs.js +56 -0
- package/lib/converters/github/workflow_runs.js.map +1 -0
- package/lib/converters/github/workflows.d.ts +8 -0
- package/lib/converters/github/workflows.js +45 -0
- package/lib/converters/github/workflows.js.map +1 -0
- package/lib/converters/gitlab/branches.d.ts +8 -0
- package/lib/converters/gitlab/branches.js +45 -0
- package/lib/converters/gitlab/branches.js.map +1 -0
- package/lib/converters/gitlab/commits.d.ts +7 -0
- package/lib/converters/gitlab/commits.js +34 -0
- package/lib/converters/gitlab/commits.js.map +1 -0
- package/lib/converters/gitlab/common.d.ts +45 -0
- package/lib/converters/gitlab/common.js +143 -0
- package/lib/converters/gitlab/common.js.map +1 -0
- package/lib/converters/gitlab/group_labels.d.ts +7 -0
- package/lib/converters/gitlab/group_labels.js +16 -0
- package/lib/converters/gitlab/group_labels.js.map +1 -0
- package/lib/converters/gitlab/group_milestones.d.ts +8 -0
- package/lib/converters/gitlab/group_milestones.js +42 -0
- package/lib/converters/gitlab/group_milestones.js.map +1 -0
- package/lib/converters/gitlab/groups.d.ts +7 -0
- package/lib/converters/gitlab/groups.js +52 -0
- package/lib/converters/gitlab/groups.js.map +1 -0
- package/lib/converters/gitlab/issues.d.ts +9 -0
- package/lib/converters/gitlab/issues.js +100 -0
- package/lib/converters/gitlab/issues.js.map +1 -0
- package/lib/converters/gitlab/jobs.d.ts +10 -0
- package/lib/converters/gitlab/jobs.js +73 -0
- package/lib/converters/gitlab/jobs.js.map +1 -0
- package/lib/converters/gitlab/merge_request_commits.d.ts +7 -0
- package/lib/converters/gitlab/merge_request_commits.js +35 -0
- package/lib/converters/gitlab/merge_request_commits.js.map +1 -0
- package/lib/converters/gitlab/merge_requests.d.ts +10 -0
- package/lib/converters/gitlab/merge_requests.js +66 -0
- package/lib/converters/gitlab/merge_requests.js.map +1 -0
- package/lib/converters/gitlab/pipelines.d.ts +7 -0
- package/lib/converters/gitlab/pipelines.js +59 -0
- package/lib/converters/gitlab/pipelines.js.map +1 -0
- package/lib/converters/gitlab/project_labels.d.ts +7 -0
- package/lib/converters/gitlab/project_labels.js +16 -0
- package/lib/converters/gitlab/project_labels.js.map +1 -0
- package/lib/converters/gitlab/project_milestones.d.ts +8 -0
- package/lib/converters/gitlab/project_milestones.js +42 -0
- package/lib/converters/gitlab/project_milestones.js.map +1 -0
- package/lib/converters/gitlab/projects.d.ts +7 -0
- package/lib/converters/gitlab/projects.js +57 -0
- package/lib/converters/gitlab/projects.js.map +1 -0
- package/lib/converters/gitlab/releases.d.ts +9 -0
- package/lib/converters/gitlab/releases.js +60 -0
- package/lib/converters/gitlab/releases.js.map +1 -0
- package/lib/converters/gitlab/tags.d.ts +10 -0
- package/lib/converters/gitlab/tags.js +42 -0
- package/lib/converters/gitlab/tags.js.map +1 -0
- package/lib/converters/gitlab/users.d.ts +7 -0
- package/lib/converters/gitlab/users.js +34 -0
- package/lib/converters/gitlab/users.js.map +1 -0
- package/lib/converters/gitlab-ci/groups.d.ts +8 -0
- package/lib/converters/gitlab-ci/groups.js +32 -0
- package/lib/converters/gitlab-ci/groups.js.map +1 -0
- package/lib/converters/gitlab-ci/jobs.d.ts +11 -0
- package/lib/converters/gitlab-ci/jobs.js +69 -0
- package/lib/converters/gitlab-ci/jobs.js.map +1 -0
- package/lib/converters/gitlab-ci/pipelines.d.ts +8 -0
- package/lib/converters/gitlab-ci/pipelines.js +49 -0
- package/lib/converters/gitlab-ci/pipelines.js.map +1 -0
- package/lib/converters/gitlab-ci/projects.d.ts +8 -0
- package/lib/converters/gitlab-ci/projects.js +35 -0
- package/lib/converters/gitlab-ci/projects.js.map +1 -0
- package/lib/converters/googlecalendar/calendar_models.d.ts +554 -0
- package/lib/converters/googlecalendar/calendar_models.js +3 -0
- package/lib/converters/googlecalendar/calendar_models.js.map +1 -0
- package/lib/converters/googlecalendar/calendars.d.ts +7 -0
- package/lib/converters/googlecalendar/calendars.js +30 -0
- package/lib/converters/googlecalendar/calendars.js.map +1 -0
- package/lib/converters/googlecalendar/common.d.ts +52 -0
- package/lib/converters/googlecalendar/common.js +138 -0
- package/lib/converters/googlecalendar/common.js.map +1 -0
- package/lib/converters/googlecalendar/events.d.ts +10 -0
- package/lib/converters/googlecalendar/events.js +150 -0
- package/lib/converters/googlecalendar/events.js.map +1 -0
- package/lib/converters/harness/common.d.ts +102 -0
- package/lib/converters/harness/common.js +17 -0
- package/lib/converters/harness/common.js.map +1 -0
- package/lib/converters/harness/executions.d.ts +15 -0
- package/lib/converters/harness/executions.js +240 -0
- package/lib/converters/harness/executions.js.map +1 -0
- package/lib/converters/hygieia/collector_items.d.ts +8 -0
- package/lib/converters/hygieia/collector_items.js +51 -0
- package/lib/converters/hygieia/collector_items.js.map +1 -0
- package/lib/converters/jenkins/builds.d.ts +11 -0
- package/lib/converters/jenkins/builds.js +144 -0
- package/lib/converters/jenkins/builds.js.map +1 -0
- package/lib/converters/jenkins/common.d.ts +36 -0
- package/lib/converters/jenkins/common.js +70 -0
- package/lib/converters/jenkins/common.js.map +1 -0
- package/lib/converters/jenkins/jobs.d.ts +8 -0
- package/lib/converters/jenkins/jobs.js +30 -0
- package/lib/converters/jenkins/jobs.js.map +1 -0
- package/lib/converters/jira/board_issues.d.ts +7 -0
- package/lib/converters/jira/board_issues.js +29 -0
- package/lib/converters/jira/board_issues.js.map +1 -0
- package/lib/converters/jira/boards.d.ts +7 -0
- package/lib/converters/jira/boards.js +35 -0
- package/lib/converters/jira/boards.js.map +1 -0
- package/lib/converters/jira/common.d.ts +61 -0
- package/lib/converters/jira/common.js +65 -0
- package/lib/converters/jira/common.js.map +1 -0
- package/lib/converters/jira/epics.d.ts +8 -0
- package/lib/converters/jira/epics.js +46 -0
- package/lib/converters/jira/epics.js.map +1 -0
- package/lib/converters/jira/issue_fields.d.ts +6 -0
- package/lib/converters/jira/issue_fields.js +16 -0
- package/lib/converters/jira/issue_fields.js.map +1 -0
- package/lib/converters/jira/issues.d.ts +51 -0
- package/lib/converters/jira/issues.js +544 -0
- package/lib/converters/jira/issues.js.map +1 -0
- package/lib/converters/jira/project_versions.d.ts +9 -0
- package/lib/converters/jira/project_versions.js +49 -0
- package/lib/converters/jira/project_versions.js.map +1 -0
- package/lib/converters/jira/projects.d.ts +7 -0
- package/lib/converters/jira/projects.js +41 -0
- package/lib/converters/jira/projects.js.map +1 -0
- package/lib/converters/jira/pull_requests.d.ts +6 -0
- package/lib/converters/jira/pull_requests.js +16 -0
- package/lib/converters/jira/pull_requests.js.map +1 -0
- package/lib/converters/jira/sprint_issues.d.ts +6 -0
- package/lib/converters/jira/sprint_issues.js +16 -0
- package/lib/converters/jira/sprint_issues.js.map +1 -0
- package/lib/converters/jira/sprints.d.ts +15 -0
- package/lib/converters/jira/sprints.js +79 -0
- package/lib/converters/jira/sprints.js.map +1 -0
- package/lib/converters/jira/users.d.ts +7 -0
- package/lib/converters/jira/users.js +33 -0
- package/lib/converters/jira/users.js.map +1 -0
- package/lib/converters/jira/workflow_statuses.d.ts +6 -0
- package/lib/converters/jira/workflow_statuses.js +16 -0
- package/lib/converters/jira/workflow_statuses.js.map +1 -0
- package/lib/converters/jsonata.d.ts +18 -0
- package/lib/converters/jsonata.js +72 -0
- package/lib/converters/jsonata.js.map +1 -0
- package/lib/converters/notion/common.d.ts +975 -0
- package/lib/converters/notion/common.js +185 -0
- package/lib/converters/notion/common.js.map +1 -0
- package/lib/converters/notion/pages.d.ts +14 -0
- package/lib/converters/notion/pages.js +462 -0
- package/lib/converters/notion/pages.js.map +1 -0
- package/lib/converters/notion/users.d.ts +7 -0
- package/lib/converters/notion/users.js +27 -0
- package/lib/converters/notion/users.js.map +1 -0
- package/lib/converters/octopus/common.d.ts +8 -0
- package/lib/converters/octopus/common.js +18 -0
- package/lib/converters/octopus/common.js.map +1 -0
- package/lib/converters/octopus/deployments.d.ts +13 -0
- package/lib/converters/octopus/deployments.js +89 -0
- package/lib/converters/octopus/deployments.js.map +1 -0
- package/lib/converters/octopus/releases.d.ts +7 -0
- package/lib/converters/octopus/releases.js +30 -0
- package/lib/converters/octopus/releases.js.map +1 -0
- package/lib/converters/okta/common.d.ts +8 -0
- package/lib/converters/okta/common.js +18 -0
- package/lib/converters/okta/common.js.map +1 -0
- package/lib/converters/okta/groups.d.ts +7 -0
- package/lib/converters/okta/groups.js +48 -0
- package/lib/converters/okta/groups.js.map +1 -0
- package/lib/converters/okta/models.d.ts +102 -0
- package/lib/converters/okta/models.js +3 -0
- package/lib/converters/okta/models.js.map +1 -0
- package/lib/converters/okta/users.d.ts +8 -0
- package/lib/converters/okta/users.js +74 -0
- package/lib/converters/okta/users.js.map +1 -0
- package/lib/converters/okta-faros/common.d.ts +4 -0
- package/lib/converters/okta-faros/common.js +12 -0
- package/lib/converters/okta-faros/common.js.map +1 -0
- package/lib/converters/okta-faros/groups.d.ts +13 -0
- package/lib/converters/okta-faros/groups.js +24 -0
- package/lib/converters/okta-faros/groups.js.map +1 -0
- package/lib/converters/okta-faros/users.d.ts +13 -0
- package/lib/converters/okta-faros/users.js +24 -0
- package/lib/converters/okta-faros/users.js.map +1 -0
- package/lib/converters/opsgenie/common.d.ts +20 -0
- package/lib/converters/opsgenie/common.js +31 -0
- package/lib/converters/opsgenie/common.js.map +1 -0
- package/lib/converters/opsgenie/incidents.d.ts +11 -0
- package/lib/converters/opsgenie/incidents.js +163 -0
- package/lib/converters/opsgenie/incidents.js.map +1 -0
- package/lib/converters/opsgenie/models.d.ts +122 -0
- package/lib/converters/opsgenie/models.js +40 -0
- package/lib/converters/opsgenie/models.js.map +1 -0
- package/lib/converters/opsgenie/teams.d.ts +7 -0
- package/lib/converters/opsgenie/teams.js +27 -0
- package/lib/converters/opsgenie/teams.js.map +1 -0
- package/lib/converters/opsgenie/users.d.ts +7 -0
- package/lib/converters/opsgenie/users.js +39 -0
- package/lib/converters/opsgenie/users.js.map +1 -0
- package/lib/converters/pagerduty/common.d.ts +39 -0
- package/lib/converters/pagerduty/common.js +45 -0
- package/lib/converters/pagerduty/common.js.map +1 -0
- package/lib/converters/pagerduty/incident_log_entries.d.ts +8 -0
- package/lib/converters/pagerduty/incident_log_entries.js +57 -0
- package/lib/converters/pagerduty/incident_log_entries.js.map +1 -0
- package/lib/converters/pagerduty/incidents.d.ts +10 -0
- package/lib/converters/pagerduty/incidents.js +114 -0
- package/lib/converters/pagerduty/incidents.js.map +1 -0
- package/lib/converters/pagerduty/priorities_resource.d.ts +10 -0
- package/lib/converters/pagerduty/priorities_resource.js +63 -0
- package/lib/converters/pagerduty/priorities_resource.js.map +1 -0
- package/lib/converters/pagerduty/services.d.ts +9 -0
- package/lib/converters/pagerduty/services.js +87 -0
- package/lib/converters/pagerduty/services.js.map +1 -0
- package/lib/converters/pagerduty/users.d.ts +7 -0
- package/lib/converters/pagerduty/users.js +27 -0
- package/lib/converters/pagerduty/users.js.map +1 -0
- package/lib/converters/phabricator/commits.d.ts +8 -0
- package/lib/converters/phabricator/commits.js +81 -0
- package/lib/converters/phabricator/commits.js.map +1 -0
- package/lib/converters/phabricator/common.d.ts +39 -0
- package/lib/converters/phabricator/common.js +137 -0
- package/lib/converters/phabricator/common.js.map +1 -0
- package/lib/converters/phabricator/projects.d.ts +7 -0
- package/lib/converters/phabricator/projects.js +51 -0
- package/lib/converters/phabricator/projects.js.map +1 -0
- package/lib/converters/phabricator/repositories.d.ts +7 -0
- package/lib/converters/phabricator/repositories.js +68 -0
- package/lib/converters/phabricator/repositories.js.map +1 -0
- package/lib/converters/phabricator/revision_diffs.d.ts +8 -0
- package/lib/converters/phabricator/revision_diffs.js +48 -0
- package/lib/converters/phabricator/revision_diffs.js.map +1 -0
- package/lib/converters/phabricator/revisions.d.ts +7 -0
- package/lib/converters/phabricator/revisions.js +51 -0
- package/lib/converters/phabricator/revisions.js.map +1 -0
- package/lib/converters/phabricator/transactions.d.ts +10 -0
- package/lib/converters/phabricator/transactions.js +101 -0
- package/lib/converters/phabricator/transactions.js.map +1 -0
- package/lib/converters/phabricator/users.d.ts +7 -0
- package/lib/converters/phabricator/users.js +40 -0
- package/lib/converters/phabricator/users.js.map +1 -0
- package/lib/converters/semaphoreci/common.d.ts +27 -0
- package/lib/converters/semaphoreci/common.js +98 -0
- package/lib/converters/semaphoreci/common.js.map +1 -0
- package/lib/converters/semaphoreci/models.d.ts +128 -0
- package/lib/converters/semaphoreci/models.js +35 -0
- package/lib/converters/semaphoreci/models.js.map +1 -0
- package/lib/converters/semaphoreci/pipelines.d.ts +8 -0
- package/lib/converters/semaphoreci/pipelines.js +112 -0
- package/lib/converters/semaphoreci/pipelines.js.map +1 -0
- package/lib/converters/semaphoreci/projects.d.ts +8 -0
- package/lib/converters/semaphoreci/projects.js +46 -0
- package/lib/converters/semaphoreci/projects.js.map +1 -0
- package/lib/converters/servicenow/common.d.ts +39 -0
- package/lib/converters/servicenow/common.js +52 -0
- package/lib/converters/servicenow/common.js.map +1 -0
- package/lib/converters/servicenow/incidents.d.ts +18 -0
- package/lib/converters/servicenow/incidents.js +278 -0
- package/lib/converters/servicenow/incidents.js.map +1 -0
- package/lib/converters/servicenow/users.d.ts +7 -0
- package/lib/converters/servicenow/users.js +27 -0
- package/lib/converters/servicenow/users.js.map +1 -0
- package/lib/converters/shortcut/common.d.ts +16 -0
- package/lib/converters/shortcut/common.js +69 -0
- package/lib/converters/shortcut/common.js.map +1 -0
- package/lib/converters/shortcut/epics.d.ts +7 -0
- package/lib/converters/shortcut/epics.js +30 -0
- package/lib/converters/shortcut/epics.js.map +1 -0
- package/lib/converters/shortcut/iterations.d.ts +7 -0
- package/lib/converters/shortcut/iterations.js +30 -0
- package/lib/converters/shortcut/iterations.js.map +1 -0
- package/lib/converters/shortcut/members.d.ts +7 -0
- package/lib/converters/shortcut/members.js +27 -0
- package/lib/converters/shortcut/members.js.map +1 -0
- package/lib/converters/shortcut/models.d.ts +392 -0
- package/lib/converters/shortcut/models.js +31 -0
- package/lib/converters/shortcut/models.js.map +1 -0
- package/lib/converters/shortcut/projects.d.ts +7 -0
- package/lib/converters/shortcut/projects.js +47 -0
- package/lib/converters/shortcut/projects.js.map +1 -0
- package/lib/converters/shortcut/stories.d.ts +7 -0
- package/lib/converters/shortcut/stories.js +128 -0
- package/lib/converters/shortcut/stories.js.map +1 -0
- package/lib/converters/squadcast/common.d.ts +169 -0
- package/lib/converters/squadcast/common.js +63 -0
- package/lib/converters/squadcast/common.js.map +1 -0
- package/lib/converters/squadcast/events.d.ts +9 -0
- package/lib/converters/squadcast/events.js +54 -0
- package/lib/converters/squadcast/events.js.map +1 -0
- package/lib/converters/squadcast/incidents.d.ts +10 -0
- package/lib/converters/squadcast/incidents.js +132 -0
- package/lib/converters/squadcast/incidents.js.map +1 -0
- package/lib/converters/squadcast/services.d.ts +8 -0
- package/lib/converters/squadcast/services.js +30 -0
- package/lib/converters/squadcast/services.js.map +1 -0
- package/lib/converters/squadcast/users.d.ts +7 -0
- package/lib/converters/squadcast/users.js +28 -0
- package/lib/converters/squadcast/users.js.map +1 -0
- package/lib/converters/statuspage/common.d.ts +125 -0
- package/lib/converters/statuspage/common.js +118 -0
- package/lib/converters/statuspage/common.js.map +1 -0
- package/lib/converters/statuspage/component_groups.d.ts +6 -0
- package/lib/converters/statuspage/component_groups.js +15 -0
- package/lib/converters/statuspage/component_groups.js.map +1 -0
- package/lib/converters/statuspage/component_uptimes.d.ts +8 -0
- package/lib/converters/statuspage/component_uptimes.js +44 -0
- package/lib/converters/statuspage/component_uptimes.js.map +1 -0
- package/lib/converters/statuspage/components.d.ts +8 -0
- package/lib/converters/statuspage/components.js +29 -0
- package/lib/converters/statuspage/components.js.map +1 -0
- package/lib/converters/statuspage/incidents.d.ts +13 -0
- package/lib/converters/statuspage/incidents.js +221 -0
- package/lib/converters/statuspage/incidents.js.map +1 -0
- package/lib/converters/statuspage/pages.d.ts +6 -0
- package/lib/converters/statuspage/pages.js +15 -0
- package/lib/converters/statuspage/pages.js.map +1 -0
- package/lib/converters/statuspage/users.d.ts +7 -0
- package/lib/converters/statuspage/users.js +27 -0
- package/lib/converters/statuspage/users.js.map +1 -0
- package/lib/converters/testrails/cases.d.ts +7 -0
- package/lib/converters/testrails/cases.js +43 -0
- package/lib/converters/testrails/cases.js.map +1 -0
- package/lib/converters/testrails/common.d.ts +20 -0
- package/lib/converters/testrails/common.js +66 -0
- package/lib/converters/testrails/common.js.map +1 -0
- package/lib/converters/testrails/results.d.ts +7 -0
- package/lib/converters/testrails/results.js +41 -0
- package/lib/converters/testrails/results.js.map +1 -0
- package/lib/converters/testrails/runs.d.ts +7 -0
- package/lib/converters/testrails/runs.js +56 -0
- package/lib/converters/testrails/runs.js.map +1 -0
- package/lib/converters/testrails/suites.d.ts +7 -0
- package/lib/converters/testrails/suites.js +33 -0
- package/lib/converters/testrails/suites.js.map +1 -0
- package/lib/converters/victorops/common.d.ts +16 -0
- package/lib/converters/victorops/common.js +25 -0
- package/lib/converters/victorops/common.js.map +1 -0
- package/lib/converters/victorops/incidents.d.ts +12 -0
- package/lib/converters/victorops/incidents.js +204 -0
- package/lib/converters/victorops/incidents.js.map +1 -0
- package/lib/converters/victorops/teams.d.ts +8 -0
- package/lib/converters/victorops/teams.js +31 -0
- package/lib/converters/victorops/teams.js.map +1 -0
- package/lib/converters/victorops/users.d.ts +8 -0
- package/lib/converters/victorops/users.js +34 -0
- package/lib/converters/victorops/users.js.map +1 -0
- package/lib/destination-runner.d.ts +22 -0
- package/lib/destination-runner.js +34 -0
- package/lib/destination-runner.js.map +1 -0
- package/lib/destination.d.ts +57 -0
- package/lib/destination.js +665 -0
- package/lib/destination.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.js +40 -0
- package/lib/index.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +78 -0
- package/resources/cloud.json +73 -0
- package/resources/community.json +39 -0
- package/resources/source-specific-configs/agileaccelerator.json +33 -0
- package/resources/source-specific-configs/azurepipeline.json +27 -0
- package/resources/source-specific-configs/backlog.json +24 -0
- package/resources/source-specific-configs/bamboohr.json +36 -0
- package/resources/source-specific-configs/bitbucket.json +28 -0
- package/resources/source-specific-configs/circleci.json +24 -0
- package/resources/source-specific-configs/clickup.json +35 -0
- package/resources/source-specific-configs/datadog.json +42 -0
- package/resources/source-specific-configs/docker.json +40 -0
- package/resources/source-specific-configs/firehydrant.json +34 -0
- package/resources/source-specific-configs/jenkins.json +24 -0
- package/resources/source-specific-configs/jira.json +45 -0
- package/resources/source-specific-configs/notion.json +313 -0
- package/resources/source-specific-configs/opsgenie.json +34 -0
- package/resources/source-specific-configs/pagerduty.json +48 -0
- package/resources/source-specific-configs/phabricator.json +24 -0
- package/resources/source-specific-configs/servicenow.json +72 -0
- package/resources/source-specific-configs/spec.json +78 -0
- package/resources/source-specific-configs/squadcast.json +28 -0
- package/resources/source-specific-configs/statuspage.json +28 -0
- package/resources/source-specific-configs/victorops.json +37 -0
- package/resources/spec.json +116 -0
|
@@ -0,0 +1,712 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GraphQLClient = exports.toPostgresArrayLiteral = exports.toLevels = exports.groupByKeys = exports.batchIterator = exports.mergeByPrimaryKey = exports.strictPick = exports.serialize = exports.UpsertBuffer = void 0;
|
|
7
|
+
const date_format_1 = __importDefault(require("date-format"));
|
|
8
|
+
const json_to_graphql_query_1 = require("json-to-graphql-query");
|
|
9
|
+
const lodash_1 = require("lodash");
|
|
10
|
+
const traverse_1 = __importDefault(require("traverse"));
|
|
11
|
+
const ts_essentials_1 = require("ts-essentials");
|
|
12
|
+
const verror_1 = require("verror");
|
|
13
|
+
const types_1 = require("./types");
|
|
14
|
+
const ROOT_FLAG = '__root__';
|
|
15
|
+
class UpsertBuffer {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.upsertBuffer = new Map();
|
|
18
|
+
}
|
|
19
|
+
add(upsert) {
|
|
20
|
+
const modelBuffer = this.upsertBuffer.get(upsert.model);
|
|
21
|
+
if (!modelBuffer) {
|
|
22
|
+
this.upsertBuffer.set(upsert.model, [upsert]);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
modelBuffer.push(upsert);
|
|
26
|
+
}
|
|
27
|
+
size() {
|
|
28
|
+
// the limiting factor is size of a single request
|
|
29
|
+
return Array.from(this.upsertBuffer.values()).reduce((acc, arr) => (0, lodash_1.max)([acc, arr.length]), 0);
|
|
30
|
+
}
|
|
31
|
+
pop(model) {
|
|
32
|
+
return this.getInternal(model, true);
|
|
33
|
+
}
|
|
34
|
+
get(model) {
|
|
35
|
+
return this.getInternal(model, false);
|
|
36
|
+
}
|
|
37
|
+
getInternal(model, remove) {
|
|
38
|
+
if (this.upsertBuffer.has(model)) {
|
|
39
|
+
const modelUpserts = this.upsertBuffer.get(model);
|
|
40
|
+
if (remove) {
|
|
41
|
+
this.upsertBuffer.delete(model);
|
|
42
|
+
}
|
|
43
|
+
return modelUpserts;
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
clear() {
|
|
48
|
+
const size = this.size();
|
|
49
|
+
this.upsertBuffer.clear();
|
|
50
|
+
return size;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.UpsertBuffer = UpsertBuffer;
|
|
54
|
+
function serialize(obj) {
|
|
55
|
+
return (0, lodash_1.keys)(obj)
|
|
56
|
+
.sort()
|
|
57
|
+
.map((k) => `${k}:${obj[k]}`)
|
|
58
|
+
.join('|');
|
|
59
|
+
}
|
|
60
|
+
exports.serialize = serialize;
|
|
61
|
+
/**
|
|
62
|
+
* Like lodash pick but with null value replacement.
|
|
63
|
+
*/
|
|
64
|
+
function strictPick(obj, keys, nullValue = 'null') {
|
|
65
|
+
return keys.reduce((result, key) => { var _a; return (0, lodash_1.set)(result, key, (_a = obj[key]) !== null && _a !== void 0 ? _a : nullValue); }, {});
|
|
66
|
+
}
|
|
67
|
+
exports.strictPick = strictPick;
|
|
68
|
+
/**
|
|
69
|
+
* Groups objects by primary key and then merges all related objects into
|
|
70
|
+
* a single object where last-wins for overlapping properties.
|
|
71
|
+
*/
|
|
72
|
+
function mergeByPrimaryKey(objects, primaryKeys) {
|
|
73
|
+
const byPK = (0, lodash_1.groupBy)(objects, (o) => serialize((0, lodash_1.pick)(o, primaryKeys)));
|
|
74
|
+
return Object.values(byPK).map((arr) => arr.reduce((acc, obj) => ({ ...acc, ...obj }), {}));
|
|
75
|
+
}
|
|
76
|
+
exports.mergeByPrimaryKey = mergeByPrimaryKey;
|
|
77
|
+
/**
|
|
78
|
+
* Execute async callback for each batch of upserts.
|
|
79
|
+
*/
|
|
80
|
+
function batchIterator(batches, callback) {
|
|
81
|
+
return {
|
|
82
|
+
async *[Symbol.asyncIterator]() {
|
|
83
|
+
for (const batch of batches) {
|
|
84
|
+
yield await callback(batch);
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
exports.batchIterator = batchIterator;
|
|
90
|
+
/**
|
|
91
|
+
* Separates objects into arrays of objects
|
|
92
|
+
* that all have the same keys.
|
|
93
|
+
*/
|
|
94
|
+
function groupByKeys(objects) {
|
|
95
|
+
const byObjKeyNames = (0, lodash_1.groupBy)(objects, (obj) => Object.keys(obj).sort().join('|'));
|
|
96
|
+
return Object.values(byObjKeyNames);
|
|
97
|
+
}
|
|
98
|
+
exports.groupByKeys = groupByKeys;
|
|
99
|
+
/**
|
|
100
|
+
* Separates upserts into levels. Level 0 has no dependencies on other levels.
|
|
101
|
+
* Level 1 depends on Level 0, 2 on 1 and so on.
|
|
102
|
+
*/
|
|
103
|
+
function toLevels(upserts) {
|
|
104
|
+
const withLevel = (0, lodash_1.flatMap)(upserts, (u) => addLevel(u));
|
|
105
|
+
const byLevel = (0, lodash_1.groupBy)(withLevel, (tuple) => tuple[1]);
|
|
106
|
+
const result = [];
|
|
107
|
+
Object.keys(byLevel)
|
|
108
|
+
.sort()
|
|
109
|
+
.forEach((level) => {
|
|
110
|
+
result.push((0, lodash_1.unzip)(byLevel[level])[0]);
|
|
111
|
+
});
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
exports.toLevels = toLevels;
|
|
115
|
+
/**
|
|
116
|
+
* Converts an Upsert (which is a tree structure) into an array of tuples.
|
|
117
|
+
* Each tuple contains an Upsert and its level in the tree structure.
|
|
118
|
+
* The level indicates the number of steps from a leaf where leaves are level 0.
|
|
119
|
+
* If an Upsert has multiple paths to a leaf, the level is the maximum number of
|
|
120
|
+
* steps.
|
|
121
|
+
*/
|
|
122
|
+
function addLevel(u) {
|
|
123
|
+
const result = [];
|
|
124
|
+
let maxAncestorLevel = 0;
|
|
125
|
+
for (const ancestor of Object.values(u.foreignKeys)) {
|
|
126
|
+
if (ancestor.model === u.model) {
|
|
127
|
+
const ancestorsWithLevels = addLevel(ancestor);
|
|
128
|
+
maxAncestorLevel = (0, lodash_1.max)([ancestorsWithLevels[0][1], maxAncestorLevel]);
|
|
129
|
+
result.push(...ancestorsWithLevels);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const thisLevel = result.length ? maxAncestorLevel + 1 : 0;
|
|
133
|
+
result.unshift([u, thisLevel]);
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
function toPostgresArrayLiteral(value) {
|
|
137
|
+
return `{${value
|
|
138
|
+
.map((s) => {
|
|
139
|
+
if (typeof s === 'string') {
|
|
140
|
+
return `"${s}"`;
|
|
141
|
+
}
|
|
142
|
+
if ((0, lodash_1.isNil)(s)) {
|
|
143
|
+
return 'NULL';
|
|
144
|
+
}
|
|
145
|
+
return s;
|
|
146
|
+
})
|
|
147
|
+
.join(',')}}`;
|
|
148
|
+
}
|
|
149
|
+
exports.toPostgresArrayLiteral = toPostgresArrayLiteral;
|
|
150
|
+
/**
|
|
151
|
+
* Client for writing records as GraphQL mutations. The client supports 3
|
|
152
|
+
* kinds of writes: Upserts, Updates and Deletes.
|
|
153
|
+
*
|
|
154
|
+
* For upserts (when upsertBatchSize is greater than 0), the high-level algorithm is:
|
|
155
|
+
*
|
|
156
|
+
* > For each record, build a tree of Upserts. The tree has more than one node if the current record represents a
|
|
157
|
+
* nested entity (e.g. branch record referencing repo which, in-turn, references org).
|
|
158
|
+
* > Buffer Upserts and index each by model (e.g. vcs_Branch)
|
|
159
|
+
* > When batch size limit is reached, execute a single insert mutation per model. Start with leaves of Upsert tree.
|
|
160
|
+
* > After inserting a batch, copy the id of each record back to the Upsert object. When inserting subsequent batches,
|
|
161
|
+
* required foreign keys will be read from the Upsert tree and copied to the appropriate batch mutation.
|
|
162
|
+
*
|
|
163
|
+
* Note: there is a complication in this algorithm for self-referent models (i.e. org_Employee's manager relationship).
|
|
164
|
+
* For these models, we split the batch into "levels". The first level consists of records with no dependencies on
|
|
165
|
+
* records of the same type. The second depends on the first and so on.
|
|
166
|
+
*
|
|
167
|
+
* For Updates and Deletes (which are much less frequent) we have a separate write buffer. This buffer is
|
|
168
|
+
* flushed if it reaches capacity. There is no attempt to combine these into bulk mutations (as done w/ upserts).
|
|
169
|
+
*/
|
|
170
|
+
class GraphQLClient {
|
|
171
|
+
constructor(logger, schemaLoader, backend, upsertBatchSize, mutationBatchSize, updateResetLimit = true) {
|
|
172
|
+
this.writeBuffer = [];
|
|
173
|
+
this.upsertBuffer = new UpsertBuffer();
|
|
174
|
+
this.selfReferentModels = new Set();
|
|
175
|
+
this.logger = logger;
|
|
176
|
+
this.schemaLoader = schemaLoader;
|
|
177
|
+
this.backend = backend;
|
|
178
|
+
this.upsertBatchSize = upsertBatchSize !== null && upsertBatchSize !== void 0 ? upsertBatchSize : 10000;
|
|
179
|
+
this.mutationBatchSize = mutationBatchSize !== null && mutationBatchSize !== void 0 ? mutationBatchSize : 100;
|
|
180
|
+
(0, ts_essentials_1.assert)(this.upsertBatchSize >= 0, `negative upsert batch size: ${this.upsertBatchSize}`);
|
|
181
|
+
(0, ts_essentials_1.assert)(this.mutationBatchSize > 0, `non-positive mutation batch size: ${this.mutationBatchSize}`);
|
|
182
|
+
this.updateResetLimit = updateResetLimit;
|
|
183
|
+
this.resetLimitMillis = updateResetLimit
|
|
184
|
+
? // January 1, 2200
|
|
185
|
+
7258118400000
|
|
186
|
+
: Date.now();
|
|
187
|
+
}
|
|
188
|
+
async healthCheck() {
|
|
189
|
+
try {
|
|
190
|
+
await this.backend.healthCheck();
|
|
191
|
+
}
|
|
192
|
+
catch (e) {
|
|
193
|
+
throw new verror_1.VError(e, 'Failed to check graphql backend health');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async loadSchema() {
|
|
197
|
+
this.schema = await this.schemaLoader.loadSchema();
|
|
198
|
+
// various derivative values of schema
|
|
199
|
+
this.tableNames = new Set(this.schema.tableNames);
|
|
200
|
+
this.tableDependencies = [...this.schema.sortedModelDependencies];
|
|
201
|
+
(0, lodash_1.reverse)(this.tableDependencies);
|
|
202
|
+
// self-referent models
|
|
203
|
+
for (const [model, modelRefs] of Object.entries(this.schema.references)) {
|
|
204
|
+
for (const reference of Object.values(modelRefs)) {
|
|
205
|
+
if (reference.model === model) {
|
|
206
|
+
this.selfReferentModels.add(model);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
checkSchema() {
|
|
212
|
+
if (!this.schema) {
|
|
213
|
+
throw new verror_1.VError('Schema is not initialized. Please call loadSchema first.');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async resetData(origin, models, keepReferencedRecords) {
|
|
217
|
+
this.checkSchema();
|
|
218
|
+
// ensure deletes are executed after processing records
|
|
219
|
+
await this.flush();
|
|
220
|
+
const minRefreshedAt = new Date(this.resetLimitMillis).toISOString();
|
|
221
|
+
this.logger.info(`Resetting data before ${minRefreshedAt} for origin ${origin}`);
|
|
222
|
+
for (const model of (0, lodash_1.intersection)(this.schema.sortedModelDependencies, models)) {
|
|
223
|
+
this.logger.info(`Resetting ${model} data for origin ${origin}`);
|
|
224
|
+
const deleteConditions = {
|
|
225
|
+
origin: { _eq: origin },
|
|
226
|
+
refreshedAt: { _lt: minRefreshedAt },
|
|
227
|
+
};
|
|
228
|
+
if (keepReferencedRecords) {
|
|
229
|
+
deleteConditions['_not'] = {
|
|
230
|
+
_or: this.schema.backReferences[model].map((br) => {
|
|
231
|
+
return {
|
|
232
|
+
[br.field]: {},
|
|
233
|
+
};
|
|
234
|
+
}),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const mutation = {
|
|
238
|
+
[`delete_${model}`]: {
|
|
239
|
+
__args: {
|
|
240
|
+
where: {
|
|
241
|
+
_and: { ...deleteConditions },
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
affected_rows: true,
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
await this.postQuery({ mutation }, `Failed to reset ${model} data for origin ${origin}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async writeRecord(model, record, origin) {
|
|
251
|
+
this.checkSchema();
|
|
252
|
+
if (!this.tableNames.has(model)) {
|
|
253
|
+
throw new verror_1.VError(`Table ${model} does not exist`);
|
|
254
|
+
}
|
|
255
|
+
if (this.upsertBatchSize) {
|
|
256
|
+
this.addUpsert(model, record, origin);
|
|
257
|
+
if (this.upsertBuffer.size() >= this.upsertBatchSize) {
|
|
258
|
+
await this.flushUpsertBuffer();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
const obj = this.createMutationObject(model, record, origin);
|
|
263
|
+
const mutation = {
|
|
264
|
+
[`insert_${model}_one`]: { __args: obj, id: true, refreshedAt: true },
|
|
265
|
+
};
|
|
266
|
+
await this.postQuery({ mutation }, `Failed to write ${model} record`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async flushUpsertBuffer() {
|
|
270
|
+
try {
|
|
271
|
+
await this.doFlushUpsertBuffer();
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
const numRemoved = this.upsertBuffer.clear();
|
|
275
|
+
throw new verror_1.VError(e, 'failed to flush upsert buffer. abandoned %d records', numRemoved);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async execUpsert(model, op) {
|
|
279
|
+
// write batch
|
|
280
|
+
const opGql = (0, json_to_graphql_query_1.jsonToGraphQLQuery)(op.query);
|
|
281
|
+
const start = Date.now();
|
|
282
|
+
const opRes = await this.backend.postQuery(opGql);
|
|
283
|
+
const end = Date.now();
|
|
284
|
+
// extract ids of newly written records and set on upserts.
|
|
285
|
+
// the ids are used as foreign keys by subsequent batches
|
|
286
|
+
// step 1: access array of results
|
|
287
|
+
// will be at path 'opRes.data.insert_<model>.returning'
|
|
288
|
+
const paths = (0, lodash_1.keys)(opRes.data);
|
|
289
|
+
(0, ts_essentials_1.assert)(paths.length === 1, `expected one element in ${paths}`);
|
|
290
|
+
const objects = (0, lodash_1.get)(opRes.data, `${paths[0]}.returning`);
|
|
291
|
+
(0, ts_essentials_1.assert)(Array.isArray(objects), `expected array`);
|
|
292
|
+
for (const obj of objects) {
|
|
293
|
+
// step 2: assign id to all upserts related to this object
|
|
294
|
+
// construct key from returned result and lookup upsert by key
|
|
295
|
+
const key = this.serializedPrimaryKey(model, obj);
|
|
296
|
+
const upserts = op.upsertsByKey.get(key);
|
|
297
|
+
(0, ts_essentials_1.assert)(upserts, `failed to resolve upserts for ${model} and ${key}`);
|
|
298
|
+
(0, ts_essentials_1.assert)(obj.id, `failed to resolve id for ${model} and ${JSON.stringify(obj)}`);
|
|
299
|
+
upserts.forEach((u) => (u.id = obj.id));
|
|
300
|
+
if (this.updateResetLimit && op.isRoot) {
|
|
301
|
+
const recordRefreshedAtMs = new Date(obj.refreshedAt).getTime();
|
|
302
|
+
this.resetLimitMillis = Math.min(recordRefreshedAtMs, this.resetLimitMillis);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
model,
|
|
307
|
+
numObjects: objects.length,
|
|
308
|
+
durationMs: end - start,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
async doFlushUpsertBuffer() {
|
|
312
|
+
for (const model of this.tableDependencies) {
|
|
313
|
+
const modelUpserts = this.upsertBuffer.pop(model);
|
|
314
|
+
if (modelUpserts) {
|
|
315
|
+
const withLevels = this.selfReferentModels.has(model)
|
|
316
|
+
? toLevels(modelUpserts)
|
|
317
|
+
: [modelUpserts];
|
|
318
|
+
const iterator = batchIterator(withLevels, (batch) => {
|
|
319
|
+
const ops = this.toUpsertOps(model, batch);
|
|
320
|
+
return Promise.all(ops.map((op) => this.execUpsert(model, op)));
|
|
321
|
+
});
|
|
322
|
+
try {
|
|
323
|
+
for await (const results of iterator) {
|
|
324
|
+
for (const result of results) {
|
|
325
|
+
this.logger.debug(`Executed ${model} upsert with ${result.numObjects} object(s) in ${result.durationMs}ms`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch (e) {
|
|
330
|
+
throw new verror_1.VError(e, `failed to write upserts for ${model}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
async writeTimestampedRecord(record) {
|
|
336
|
+
switch (record.operation) {
|
|
337
|
+
case types_1.Operation.UPSERT:
|
|
338
|
+
await this.writeRecord(record.model, record.data, record.origin);
|
|
339
|
+
break;
|
|
340
|
+
case types_1.Operation.UPDATE:
|
|
341
|
+
await this.writeUpdateRecord(record);
|
|
342
|
+
break;
|
|
343
|
+
case types_1.Operation.DELETION:
|
|
344
|
+
await this.writeDeletionRecord(record);
|
|
345
|
+
break;
|
|
346
|
+
default:
|
|
347
|
+
throw new verror_1.VError(`Unsupported operation ${record.operation} for ${record}`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
async writeUpdateRecord(record) {
|
|
351
|
+
const upsertRec = {
|
|
352
|
+
...record.where,
|
|
353
|
+
...(0, lodash_1.pick)(record.patch, record.mask),
|
|
354
|
+
};
|
|
355
|
+
const obj = this.createMutationObject(record.model, upsertRec, record.origin, true);
|
|
356
|
+
const mutation = {
|
|
357
|
+
[`insert_${record.model}_one`]: { __args: obj, id: true },
|
|
358
|
+
};
|
|
359
|
+
await this.postQuery({ mutation }, `Failed to update ${record.model} record`);
|
|
360
|
+
}
|
|
361
|
+
async writeDeletionRecord(record) {
|
|
362
|
+
const mutation = {
|
|
363
|
+
[`delete_${record.model}`]: {
|
|
364
|
+
__args: {
|
|
365
|
+
where: this.createWhereClause(record.model, record.where),
|
|
366
|
+
},
|
|
367
|
+
affected_rows: true,
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
await this.postQuery({ mutation }, `Failed to delete ${record.model} record`);
|
|
371
|
+
}
|
|
372
|
+
async postQuery(query, errorMsg) {
|
|
373
|
+
this.writeBuffer.push({
|
|
374
|
+
query,
|
|
375
|
+
errorMsg,
|
|
376
|
+
});
|
|
377
|
+
if (this.writeBuffer.length >= this.mutationBatchSize) {
|
|
378
|
+
await this.flush();
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
async flush() {
|
|
382
|
+
// sequentially flush upsert then write buffer
|
|
383
|
+
// we do this sequentially because we may have updates
|
|
384
|
+
// that operate on records in the upsert buffers and
|
|
385
|
+
// therefore need the upserts written first
|
|
386
|
+
await this.flushUpsertBuffer();
|
|
387
|
+
await this.flushWriteBuffer();
|
|
388
|
+
}
|
|
389
|
+
async flushWriteBuffer() {
|
|
390
|
+
const queries = this.writeBuffer.map((op) => op.query);
|
|
391
|
+
const gql = GraphQLClient.batchMutation(queries);
|
|
392
|
+
if (gql) {
|
|
393
|
+
const res = await this.backend.postQuery(gql);
|
|
394
|
+
if (res.errors) {
|
|
395
|
+
this.logger.warn(`Error while saving batch: ${JSON.stringify(res.errors)}. Query: ${gql}`);
|
|
396
|
+
// now try mutations individually and fail on the first bad one
|
|
397
|
+
for (const op of this.writeBuffer) {
|
|
398
|
+
const opGql = (0, json_to_graphql_query_1.jsonToGraphQLQuery)(op.query);
|
|
399
|
+
const opRes = await this.backend.postQuery(opGql);
|
|
400
|
+
this.writeBuffer.shift();
|
|
401
|
+
if (opRes.errors) {
|
|
402
|
+
throw new verror_1.VError(`${op.errorMsg} with query '${opGql}': ${JSON.stringify(opRes.errors)}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
// res.data is expected to have one object with 'id' and 'refreshedAt' for each of the mutations
|
|
408
|
+
// {
|
|
409
|
+
// "m0": {
|
|
410
|
+
// "id": ...,
|
|
411
|
+
// "refreshedAt": ...
|
|
412
|
+
// },
|
|
413
|
+
// "m1": {
|
|
414
|
+
// "id": ...,
|
|
415
|
+
// "refreshedAt": ...
|
|
416
|
+
// },
|
|
417
|
+
// ...
|
|
418
|
+
// }
|
|
419
|
+
if (this.updateResetLimit) {
|
|
420
|
+
for (const mutationRes of Object.values(res.data)) {
|
|
421
|
+
const refreshedAt = (0, lodash_1.get)(mutationRes, 'refreshedAt');
|
|
422
|
+
if (refreshedAt) {
|
|
423
|
+
const recordRefreshedAtMs = new Date(refreshedAt).getTime();
|
|
424
|
+
this.resetLimitMillis = Math.min(recordRefreshedAtMs, this.resetLimitMillis);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
// truncate the buffer
|
|
429
|
+
this.writeBuffer.splice(0);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Constructs a gql query from an array of json mutations.
|
|
435
|
+
* The outputted qql mutation might look like:
|
|
436
|
+
*
|
|
437
|
+
* mutation {
|
|
438
|
+
* i1: insert_cicd_Artifact_one(object: {uid: "u1b"}) {
|
|
439
|
+
* id
|
|
440
|
+
* refreshedAt
|
|
441
|
+
* }
|
|
442
|
+
* i2: insert_cicd_Artifact_one(object: {uid: "u2b"}) {
|
|
443
|
+
* id
|
|
444
|
+
* refreshedAt
|
|
445
|
+
* }
|
|
446
|
+
* }
|
|
447
|
+
*
|
|
448
|
+
* Notable here are the i1/i2 aliases. These are required when multiple operations
|
|
449
|
+
* share the same name (e.g. insert_cicd_Artifact_one) and are supported in
|
|
450
|
+
* jsonToGraphQLQuery with __aliasFor directive.
|
|
451
|
+
*
|
|
452
|
+
* @return batch gql mutation or undefined if the input is undefined, empty
|
|
453
|
+
* or doesn't contain any mutations.
|
|
454
|
+
*/
|
|
455
|
+
static batchMutation(queries) {
|
|
456
|
+
if (queries && queries.length > 0) {
|
|
457
|
+
const queryObj = {};
|
|
458
|
+
queries.forEach((query, idx) => {
|
|
459
|
+
if (query.mutation) {
|
|
460
|
+
const queryType = Object.keys(query.mutation)[0];
|
|
461
|
+
const queryBody = query.mutation[queryType];
|
|
462
|
+
queryObj[`m${idx}`] = {
|
|
463
|
+
__aliasFor: queryType,
|
|
464
|
+
...queryBody,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
if (Object.keys(queryObj).length > 0) {
|
|
469
|
+
return (0, json_to_graphql_query_1.jsonToGraphQLQuery)({ mutation: queryObj });
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return undefined;
|
|
473
|
+
}
|
|
474
|
+
createWhereClause(model, record) {
|
|
475
|
+
const obj = {};
|
|
476
|
+
for (const [field, value] of Object.entries(record)) {
|
|
477
|
+
const nestedModel = this.schema.references[model][field];
|
|
478
|
+
if (nestedModel && value) {
|
|
479
|
+
obj[nestedModel.field] = this.createWhereClause(nestedModel.model, value);
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
const val = this.formatFieldValue(model, field, value);
|
|
483
|
+
if (val)
|
|
484
|
+
obj[field] = { _eq: val };
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return obj;
|
|
488
|
+
}
|
|
489
|
+
createMutationObject(model, record, origin, keepExistingOrigin, nested) {
|
|
490
|
+
const obj = {};
|
|
491
|
+
const foreignKeys = [];
|
|
492
|
+
for (const [field, value] of Object.entries(record)) {
|
|
493
|
+
const nestedModel = this.schema.references[model][field];
|
|
494
|
+
if (nestedModel && value) {
|
|
495
|
+
foreignKeys.push(nestedModel.foreignKey);
|
|
496
|
+
obj[nestedModel.field] = this.createMutationObject(nestedModel.model, value, undefined, keepExistingOrigin, true);
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
const val = this.formatFieldValue(model, field, value);
|
|
500
|
+
if (!(0, lodash_1.isNil)(val))
|
|
501
|
+
obj[field] = val;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
if (origin) {
|
|
505
|
+
obj['origin'] = origin;
|
|
506
|
+
}
|
|
507
|
+
const updateFieldMask = new Set(Object.keys(obj).concat(foreignKeys));
|
|
508
|
+
if (keepExistingOrigin) {
|
|
509
|
+
updateFieldMask.delete('origin');
|
|
510
|
+
}
|
|
511
|
+
return {
|
|
512
|
+
[nested ? 'data' : 'object']: obj,
|
|
513
|
+
on_conflict: this.createConflictClause(model, nested, updateFieldMask),
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
addUpsert(model, record, origin) {
|
|
517
|
+
const object = {};
|
|
518
|
+
const foreignKeys = {};
|
|
519
|
+
for (const [field, value] of Object.entries(record)) {
|
|
520
|
+
const nestedModel = this.schema.references[model][field];
|
|
521
|
+
if (nestedModel) {
|
|
522
|
+
if ((0, lodash_1.isNil)(value)) {
|
|
523
|
+
// for explicit nil relation, set the FK of this record to null
|
|
524
|
+
object[nestedModel.foreignKey] = null;
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
foreignKeys[field] = this.addUpsert(nestedModel.model, value);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
else if (this.isValidField(model, field)) {
|
|
531
|
+
const val = this.formatFieldValue(model, field, value);
|
|
532
|
+
object[field] = (0, lodash_1.isNil)(val) ? null : val;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
if (origin) {
|
|
536
|
+
object['origin'] = origin;
|
|
537
|
+
// add root flag to top-level objects
|
|
538
|
+
object[ROOT_FLAG] = true;
|
|
539
|
+
}
|
|
540
|
+
// since all our uids are non-null, check for nil uids early
|
|
541
|
+
// to prevent losing an entire batch later with db constraint
|
|
542
|
+
// error on flush
|
|
543
|
+
if ((0, lodash_1.has)(object, 'uid') && (0, lodash_1.isNil)(object['uid'])) {
|
|
544
|
+
throw new verror_1.VError('cannot upsert null or undefined uid for model %s with keys %s', model, JSON.stringify((0, lodash_1.pick)(record, this.schema.primaryKeys[model])));
|
|
545
|
+
}
|
|
546
|
+
const upsert = {
|
|
547
|
+
model,
|
|
548
|
+
object,
|
|
549
|
+
foreignKeys: foreignKeys,
|
|
550
|
+
};
|
|
551
|
+
// index by model
|
|
552
|
+
this.upsertBuffer.add(upsert);
|
|
553
|
+
return upsert;
|
|
554
|
+
}
|
|
555
|
+
objectWithForeignKeys(upsert) {
|
|
556
|
+
if ((0, lodash_1.isEmpty)(upsert.foreignKeys)) {
|
|
557
|
+
return upsert.object;
|
|
558
|
+
}
|
|
559
|
+
// for each FK, copy id of related upsert to FK field
|
|
560
|
+
// the upsert's id was populated after the associated batch
|
|
561
|
+
// was written in doFlushUpsertBuffer
|
|
562
|
+
const result = (0, lodash_1.clone)(upsert.object);
|
|
563
|
+
for (const [relName, fkUpsert] of Object.entries(upsert.foreignKeys)) {
|
|
564
|
+
// foreign key was constructed from schema so the following is safe to access
|
|
565
|
+
const fkField = this.schema.references[upsert.model][relName].foreignKey;
|
|
566
|
+
const fkValue = fkUpsert.id;
|
|
567
|
+
(0, ts_essentials_1.assert)(!(0, lodash_1.isNil)(fkValue), `failed to resolve fk value for ${relName} from ${JSON.stringify(fkUpsert)}`);
|
|
568
|
+
result[fkField] = fkValue;
|
|
569
|
+
}
|
|
570
|
+
return result;
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* returns serialized version of keys fields
|
|
574
|
+
*/
|
|
575
|
+
serializedPrimaryKey(model, obj) {
|
|
576
|
+
return serialize(strictPick(obj, this.schema.primaryKeys[model]));
|
|
577
|
+
}
|
|
578
|
+
toUpsertOps(model, modelUpserts) {
|
|
579
|
+
// shared among all the results of this method
|
|
580
|
+
const upsertsByKey = new Map();
|
|
581
|
+
// add FKs and index upsert by primary key
|
|
582
|
+
// the index is needed after write to find source
|
|
583
|
+
// upsert and set id
|
|
584
|
+
const all = modelUpserts.map((u) => {
|
|
585
|
+
const fullObj = this.objectWithForeignKeys(u);
|
|
586
|
+
const key = this.serializedPrimaryKey(model, fullObj);
|
|
587
|
+
const upsertsForKey = upsertsByKey.get(key);
|
|
588
|
+
if (!upsertsForKey) {
|
|
589
|
+
upsertsByKey.set(key, [u]);
|
|
590
|
+
}
|
|
591
|
+
else {
|
|
592
|
+
upsertsForKey.push(u);
|
|
593
|
+
}
|
|
594
|
+
return fullObj;
|
|
595
|
+
});
|
|
596
|
+
const primaryKeys = this.schema.primaryKeys[model];
|
|
597
|
+
// there can be multiple records that represent the
|
|
598
|
+
// same object. merge all records into one
|
|
599
|
+
const allObjects = mergeByPrimaryKey(all, primaryKeys);
|
|
600
|
+
const keysObj = primaryKeys
|
|
601
|
+
.sort()
|
|
602
|
+
.reduce((a, v) => ({ ...a, [v]: true }), {});
|
|
603
|
+
// for each set of unique keys, build an UpsertOp
|
|
604
|
+
const groups = groupByKeys(allObjects);
|
|
605
|
+
return groups.map((objects) => {
|
|
606
|
+
(0, ts_essentials_1.assert)(objects === null || objects === void 0 ? void 0 : objects.length, 'objects should not be empty');
|
|
607
|
+
// all objects have same fields due to groupByKeys call
|
|
608
|
+
// pull out fields of first as mask for update fields to ensure
|
|
609
|
+
// fields that aren't in the data are not modified by the upsert
|
|
610
|
+
const updateColumnMask = new Set(Object.keys(objects[0]));
|
|
611
|
+
// determine if this group contains root objects
|
|
612
|
+
let isRoot = false;
|
|
613
|
+
if ((0, lodash_1.has)(objects[0], ROOT_FLAG)) {
|
|
614
|
+
isRoot = true;
|
|
615
|
+
// remove root flag from all objects
|
|
616
|
+
objects.forEach((o) => delete o[ROOT_FLAG]);
|
|
617
|
+
}
|
|
618
|
+
const onConflict = this.createUpsertConflictClause(model, updateColumnMask, isRoot);
|
|
619
|
+
const mutation = {
|
|
620
|
+
mutation: {
|
|
621
|
+
[`insert_${model}`]: {
|
|
622
|
+
__args: {
|
|
623
|
+
// sort objects to avoid deadlocks on concurrent inserts
|
|
624
|
+
objects: (0, lodash_1.orderBy)(objects, primaryKeys),
|
|
625
|
+
on_conflict: onConflict,
|
|
626
|
+
},
|
|
627
|
+
returning: {
|
|
628
|
+
id: true,
|
|
629
|
+
refreshedAt: true,
|
|
630
|
+
...keysObj,
|
|
631
|
+
},
|
|
632
|
+
},
|
|
633
|
+
},
|
|
634
|
+
};
|
|
635
|
+
return {
|
|
636
|
+
query: mutation,
|
|
637
|
+
upsertsByKey,
|
|
638
|
+
isRoot,
|
|
639
|
+
};
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
isValidField(model, field) {
|
|
643
|
+
return (0, lodash_1.has)(this.schema.scalars[model], field);
|
|
644
|
+
}
|
|
645
|
+
formatFieldValue(model, field, value) {
|
|
646
|
+
if ((0, lodash_1.isNil)(value))
|
|
647
|
+
return undefined;
|
|
648
|
+
if (!this.isValidField(model, field)) {
|
|
649
|
+
this.logger.debug(`Could not find type of ${field} in ${model}`);
|
|
650
|
+
return undefined;
|
|
651
|
+
}
|
|
652
|
+
const type = this.schema.scalars[model][field];
|
|
653
|
+
if (type === 'timestamptz') {
|
|
654
|
+
// The field value may already be a string. E.g., if coming from the Faros Feeds source.
|
|
655
|
+
return typeof value === 'string' ? value : timestamptz(value);
|
|
656
|
+
}
|
|
657
|
+
else if (type.startsWith('_') && typeof value !== 'string') {
|
|
658
|
+
if (!Array.isArray(value)) {
|
|
659
|
+
throw new Error(`expected array for ${model}.${field} of type ${type}. Received: ${JSON.stringify(value)}`);
|
|
660
|
+
}
|
|
661
|
+
// format array value as postgres literal
|
|
662
|
+
return toPostgresArrayLiteral(value);
|
|
663
|
+
}
|
|
664
|
+
else if (typeof value === 'object' || Array.isArray(value)) {
|
|
665
|
+
return (0, traverse_1.default)(value).map(function (val) {
|
|
666
|
+
if (val instanceof Date) {
|
|
667
|
+
this.update(val.getTime());
|
|
668
|
+
}
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
return value;
|
|
672
|
+
}
|
|
673
|
+
createConflictClause(model, nested, updateFieldMask) {
|
|
674
|
+
const updateColumns = nested
|
|
675
|
+
? []
|
|
676
|
+
: (0, lodash_1.difference)(Object.keys(this.schema.scalars[model]), this.schema.primaryKeys[model]);
|
|
677
|
+
const filteredUpdateFields = updateFieldMask && !nested
|
|
678
|
+
? updateColumns.filter((c) => updateFieldMask.has(c))
|
|
679
|
+
: updateColumns;
|
|
680
|
+
// if empty, use model keys to ensure queries always return results
|
|
681
|
+
if ((0, lodash_1.isEmpty)(filteredUpdateFields)) {
|
|
682
|
+
filteredUpdateFields.push(...this.schema.primaryKeys[model]);
|
|
683
|
+
}
|
|
684
|
+
return {
|
|
685
|
+
constraint: new json_to_graphql_query_1.EnumType(`${model}_pkey`),
|
|
686
|
+
update_columns: filteredUpdateFields.map((c) => new json_to_graphql_query_1.EnumType(c)),
|
|
687
|
+
};
|
|
688
|
+
}
|
|
689
|
+
createUpsertConflictClause(model, updateFieldMask, isRoot) {
|
|
690
|
+
// superset of fields that can be updated
|
|
691
|
+
const updateColumns = (0, lodash_1.difference)(Object.keys(this.schema.scalars[model]), this.schema.primaryKeys[model]);
|
|
692
|
+
// filter to only those fields that are in the data
|
|
693
|
+
const filteredUpdateFields = updateColumns.filter((c) => updateFieldMask.has(c));
|
|
694
|
+
// for root objects, always update refreshedAt
|
|
695
|
+
if (isRoot) {
|
|
696
|
+
filteredUpdateFields.push('refreshedAt');
|
|
697
|
+
}
|
|
698
|
+
// if empty, use model keys to ensure queries always return results
|
|
699
|
+
if ((0, lodash_1.isEmpty)(filteredUpdateFields)) {
|
|
700
|
+
filteredUpdateFields.push(...this.schema.primaryKeys[model]);
|
|
701
|
+
}
|
|
702
|
+
return {
|
|
703
|
+
constraint: new json_to_graphql_query_1.EnumType(`${model}_pkey`),
|
|
704
|
+
update_columns: filteredUpdateFields.map((c) => new json_to_graphql_query_1.EnumType(c)),
|
|
705
|
+
};
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
exports.GraphQLClient = GraphQLClient;
|
|
709
|
+
function timestamptz(date) {
|
|
710
|
+
return date_format_1.default.asString(date_format_1.default.ISO8601_WITH_TZ_OFFSET_FORMAT, date);
|
|
711
|
+
}
|
|
712
|
+
//# sourceMappingURL=graphql-client.js.map
|