├── .husky ├── .gitignore └── pre-commit ├── sources ├── bamboohr-source │ ├── test_files │ │ ├── users.json │ │ ├── invalid_config.json │ │ └── full_configured_catalog.json │ ├── src │ │ ├── streams │ │ │ ├── index.ts │ │ │ └── users.ts │ │ ├── tsconfig.json │ │ └── models.ts │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ └── acceptance-test-config.yml ├── okta-source │ ├── test_files │ │ ├── abnormal_state.json │ │ └── invalid_config.json │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ └── acceptance-test-config.yml ├── buildkite-source │ ├── test_files │ │ ├── builds.json │ │ ├── invalid_config.json │ │ ├── pipelines_all.json │ │ ├── abnormal_state.json │ │ ├── incremental_configured_catalog.json │ │ ├── pipelines.json │ │ └── pipelines_input.json │ ├── bin │ │ └── main │ ├── src │ │ ├── streams │ │ │ ├── index.ts │ │ │ └── pipelines.ts │ │ └── tsconfig.json │ ├── test │ │ └── tsconfig.json │ ├── resources │ │ ├── schemas │ │ │ └── organizations.json │ │ └── gql │ │ │ └── pipelines-query.gql │ └── acceptance-test-config.yml ├── jenkins-source │ ├── test_files │ │ ├── jenkins │ │ │ ├── data │ │ │ │ ├── secret.key.not-so-secret │ │ │ │ ├── jobs │ │ │ │ │ └── Faros-test-job │ │ │ │ │ │ ├── builds │ │ │ │ │ │ ├── 1 │ │ │ │ │ │ │ ├── changelog.xml │ │ │ │ │ │ │ └── log │ │ │ │ │ │ ├── 2 │ │ │ │ │ │ │ ├── changelog.xml │ │ │ │ │ │ │ └── log │ │ │ │ │ │ ├── 3 │ │ │ │ │ │ │ ├── changelog.xml │ │ │ │ │ │ │ └── log │ │ │ │ │ │ ├── legacyIds │ │ │ │ │ │ └── permalinks │ │ │ │ │ │ ├── nextBuildNumber │ │ │ │ │ │ └── config.xml │ │ │ │ ├── jenkins.install.UpgradeWizard.state │ │ │ │ ├── jenkins.install.InstallUtil.lastExecVersion │ │ │ │ ├── .owner │ │ │ │ ├── secret.key │ │ │ │ ├── userContent │ │ │ │ │ └── readme.txt │ │ │ │ ├── identity.key.enc │ │ │ │ ├── queue.xml │ │ │ │ ├── queue.xml.bak │ │ │ │ ├── copy_reference_file.log │ │ │ │ ├── hudson.model.UpdateCenter.xml │ │ │ │ ├── jenkins.telemetry.Correlator.xml │ │ │ │ └── users │ │ │ │ │ ├── users.xml │ │ │ │ │ └── admin_14692387833535189143 │ │ │ │ │ └── apiTokenStats.xml │ │ │ ├── docker-compose.yml │ │ │ └── README.md │ │ ├── invalid_config.json │ │ ├── abnormal_state.json │ │ ├── config.json │ │ └── jobs.json │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ └── bootstrap.md ├── datadog-source │ ├── test_files │ │ ├── invalid_config.json │ │ ├── config.json │ │ └── future_state.json │ ├── bin │ │ └── main │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test │ │ └── tsconfig.json │ └── README.md ├── pagerduty-source │ ├── test_files │ │ ├── config.json │ │ ├── invalid_config.json │ │ └── abnormal_state.json │ ├── bin │ │ └── main │ ├── src │ │ ├── tsconfig.json │ │ └── streams │ │ │ ├── index.ts │ │ │ ├── teams.ts │ │ │ └── prioritiesResource.ts │ ├── test │ │ └── tsconfig.json │ ├── resources │ │ └── schemas │ │ │ ├── users.json │ │ │ ├── teams.json │ │ │ └── prioritiesResource.json │ └── bootstrap.md ├── servicenow-source │ ├── test_files │ │ ├── invalid_config.json │ │ ├── config.json │ │ ├── future_state.json │ │ └── incidents.json │ ├── bin │ │ └── main │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test │ │ └── tsconfig.json │ ├── resources │ │ └── schemas │ │ │ ├── user.json │ │ │ └── incident.json │ └── README.md ├── squadcast-source │ ├── test_files │ │ ├── config.json │ │ ├── invalid_config.json │ │ ├── abnormal_state.json │ │ ├── incremental_configured_catalog.json │ │ └── services.json │ ├── bin │ │ └── main │ ├── src │ │ ├── tsconfig.json │ │ └── streams │ │ │ └── index.ts │ ├── test │ │ └── tsconfig.json │ ├── bootstrap.md │ └── acceptance-test-config.yml ├── docker-source │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test_files │ │ ├── invalid_config.json │ │ ├── abnormal_state.json │ │ ├── full_configured_catalog.json │ │ └── incremental_configured_catalog.json │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ └── acceptance-test-config.yml ├── gitlab-ci-source │ ├── src │ │ ├── gitlab │ │ │ └── index.ts │ │ ├── tsconfig.json │ │ └── streams │ │ │ ├── index.ts │ │ │ └── groups.ts │ ├── test_files │ │ ├── abnormal_state.json │ │ ├── invalid_config.json │ │ ├── groups.json │ │ ├── groups-response.json │ │ ├── projects.json │ │ ├── projects-response.json │ │ ├── incremental_configured_catalog.json │ │ ├── pipelines.json │ │ └── pipelines-response.json │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ ├── resources │ │ └── schemas │ │ │ ├── pipelines.json │ │ │ ├── groups.json │ │ │ └── projects.json │ └── acceptance-test-config.yml ├── example-source │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test_files │ │ ├── abnormal_state.json │ │ ├── config.json │ │ ├── invalid_config.json │ │ ├── full_configured_catalog.json │ │ └── incremental_configured_catalog.json │ ├── bin │ │ └── main │ ├── test │ │ ├── index.test.ts │ │ └── tsconfig.json │ ├── resources │ │ └── spec.json │ └── acceptance-test-config.yml ├── agileaccelerator-source │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test_files │ │ ├── abnormal_state.json │ │ ├── invalid_config.json │ │ ├── full_configured_catalog.json │ │ └── incremental_configured_catalog.json │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ ├── bootstrap.md │ └── acceptance-test-config.yml ├── firehydrant-source │ ├── test_files │ │ ├── invalid_config.json │ │ ├── abnormal_state.json │ │ ├── users.json │ │ └── incremental_configured_catalog.json │ ├── bin │ │ └── main │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test │ │ └── tsconfig.json │ ├── resources │ │ └── schemas │ │ │ └── users.json │ └── acceptance-test-config.yml ├── customer-io-source │ ├── test_files │ │ ├── invalid_config.json │ │ └── abnormal_state.json │ ├── bin │ │ └── main │ ├── src │ │ ├── tsconfig.json │ │ ├── streams │ │ │ └── index.ts │ │ └── customer-io │ │ │ └── typings.ts │ ├── test │ │ └── tsconfig.json │ ├── resources │ │ ├── schemas │ │ │ ├── newsletters.json │ │ │ └── campaign-actions.json │ │ └── spec.json │ └── bootstrap.md ├── harness-source │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test_files │ │ ├── abnormal_state.json │ │ ├── invalid_config.json │ │ ├── full_configured_catalog.json │ │ └── incremental_configured_catalog.json │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ ├── bootstrap.md │ └── acceptance-test-config.yml ├── opsgenie-source │ ├── test_files │ │ ├── invalid_config.json │ │ ├── abnormal_state.json │ │ ├── teams.json │ │ └── incremental_configured_catalog.json │ ├── bin │ │ └── main │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test │ │ └── tsconfig.json │ └── resources │ │ └── schemas │ │ └── teams.json ├── googlecalendar-source │ ├── test_files │ │ ├── invalid_config.json │ │ ├── config.json │ │ ├── abnormal_state.json │ │ └── calendars.json │ ├── bin │ │ └── main │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── test │ │ └── tsconfig.json │ └── bootstrap.md ├── circleci-source │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ ├── .DS_Store │ │ └── tsconfig.json │ ├── test_files │ │ ├── invalid_config.json │ │ ├── abnormal_state.json │ │ ├── projects.json │ │ └── incremental_configured_catalog.json │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ ├── bootstrap.md │ ├── resources │ │ └── schemas │ │ │ └── projects.json │ └── acceptance-test-config.yml ├── victorops-source │ ├── test_files │ │ ├── invalid_config.json │ │ ├── abnormal_state.json │ │ ├── users.json │ │ ├── incremental_configured_catalog.json │ │ └── teams.json │ ├── bin │ │ └── main │ ├── src │ │ ├── tsconfig.json │ │ └── streams │ │ │ ├── index.ts │ │ │ ├── teams.ts │ │ │ └── users.ts │ ├── test │ │ └── tsconfig.json │ ├── bootstrap.md │ ├── resources │ │ └── schemas │ │ │ ├── users.json │ │ │ └── teams.json │ └── acceptance-test-config.yml ├── statuspage-source │ ├── test_files │ │ ├── invalid_config.json │ │ ├── abnormal_state.json │ │ └── users.json │ ├── bin │ │ └── main │ ├── src │ │ ├── tsconfig.json │ │ └── streams │ │ │ └── index.ts │ ├── test │ │ └── tsconfig.json │ ├── resources │ │ └── schemas │ │ │ ├── users.json │ │ │ └── incidentUpdates.json │ └── acceptance-test-config.yml ├── phabricator-source │ ├── test_files │ │ ├── abnormal_state.json │ │ ├── invalid_config.json │ │ └── config.json │ ├── bin │ │ └── main │ ├── test │ │ ├── index.test.ts │ │ └── tsconfig.json │ ├── src │ │ ├── tsconfig.json │ │ └── streams │ │ │ └── index.ts │ ├── bootstrap.md │ └── acceptance-test-config.yml ├── azure-repos-source │ ├── test_files │ │ └── invalid_config.json │ ├── bin │ │ └── main │ ├── src │ │ ├── streams │ │ │ ├── index.ts │ │ │ └── users.ts │ │ └── tsconfig.json │ ├── test │ │ └── tsconfig.json │ └── acceptance-test-config.yml ├── backlog-source │ ├── test_files │ │ ├── abnormal_state.json │ │ ├── invalid_config.json │ │ ├── incremental_configured_catalog.json │ │ └── users.json │ ├── bin │ │ └── main │ ├── src │ │ ├── streams │ │ │ ├── index.ts │ │ │ └── users.ts │ │ └── tsconfig.json │ ├── test │ │ └── tsconfig.json │ ├── resources │ │ └── schemas │ │ │ └── users.json │ └── acceptance-test-config.yml ├── shortcut-source │ ├── test_files │ │ ├── abnormal_state.json │ │ ├── invalid_config.json │ │ ├── incremental_configured_catalog.json │ │ └── members.json │ ├── bin │ │ └── main │ ├── src │ │ ├── tsconfig.json │ │ └── streams │ │ │ ├── index.ts │ │ │ ├── members.ts │ │ │ ├── projects.ts │ │ │ ├── stories.ts │ │ │ └── epics.ts │ ├── test │ │ └── tsconfig.json │ └── acceptance-test-config.yml ├── azureactivedirectory-source │ ├── test_files │ │ ├── invalid_config.json │ │ └── full_configured_catalog.json │ ├── src │ │ ├── streams │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── bin │ │ └── main │ ├── test │ │ └── tsconfig.json │ └── acceptance-test-config.yml ├── bitbucket-source │ ├── bin │ │ └── main │ ├── test_files │ │ ├── invalid_config.json │ │ └── abnormal_state.json │ ├── src │ │ ├── tsconfig.json │ │ └── streams │ │ │ ├── index.ts │ │ │ └── workspaces.ts │ ├── test │ │ └── tsconfig.json │ └── resources │ │ └── schemas │ │ └── workspaces.json └── azurepipeline-source │ ├── bin │ └── main │ ├── test_files │ ├── invalid_config.json │ └── abnormal_state.json │ ├── src │ ├── streams │ │ └── index.ts │ └── tsconfig.json │ ├── test │ └── tsconfig.json │ └── acceptance-test-config.yml ├── .github ├── CODEOWNERS ├── workflows │ └── skip-test-sources.txt ├── dependabot.yml └── pull_request_template.md ├── .huskyrc.json ├── .lintstagedrc.json ├── CONTRIBUTING.md ├── .prettierrc.json ├── CODE_OF_CONDUCT.md ├── lerna.json ├── destinations └── airbyte-faros-destination │ ├── bin │ └── main │ ├── img │ └── source_destination.png │ ├── src │ ├── tsconfig.json │ ├── converters │ │ ├── okta_faros │ │ │ ├── common.ts │ │ │ ├── users.ts │ │ │ └── groups.ts │ │ ├── okta │ │ │ └── common.ts │ │ ├── azureactivedirectory │ │ │ └── common.ts │ │ ├── jira │ │ │ ├── sprint_issues.ts │ │ │ ├── pull_requests.ts │ │ │ ├── issue_fields.ts │ │ │ ├── workflow_statuses.ts │ │ │ └── board_issues.ts │ │ ├── gitlab │ │ │ ├── group_labels.ts │ │ │ └── project_labels.ts │ │ ├── asana │ │ │ ├── users.ts │ │ │ └── tags.ts │ │ ├── github │ │ │ ├── issue_labels.ts │ │ │ ├── users.ts │ │ │ ├── assignees.ts │ │ │ ├── collaborators.ts │ │ │ ├── projects.ts │ │ │ └── branches.ts │ │ ├── bamboohr │ │ │ ├── common.ts │ │ │ └── models.ts │ │ ├── pagerduty │ │ │ └── users.ts │ │ ├── servicenow │ │ │ └── users.ts │ │ ├── datadog │ │ │ └── users.ts │ │ ├── statuspage │ │ │ └── users.ts │ │ ├── firehydrant │ │ │ └── teams.ts │ │ ├── opsgenie │ │ │ └── teams.ts │ │ ├── backlog │ │ │ └── users.ts │ │ ├── shortcut │ │ │ └── members.ts │ │ ├── squadcast │ │ │ └── users.ts │ │ ├── victorops │ │ │ └── teams.ts │ │ └── buildkite │ │ │ └── organizations.ts │ ├── community │ │ └── types.ts │ └── destination-runner.ts │ ├── test │ ├── tsconfig.json │ └── resources │ │ ├── docker │ │ └── catalog.json │ │ ├── bamboohr │ │ └── catalog.json │ │ ├── agileaccelerator │ │ └── catalog.json │ │ ├── faros_feeds │ │ └── catalog.json │ │ ├── okta │ │ └── catalog.json │ │ ├── datadog │ │ └── catalog.json │ │ ├── circleci │ │ └── catalog.json │ │ ├── harness │ │ └── catalog.json │ │ ├── servicenow │ │ └── catalog.json │ │ ├── azureactivedirectory │ │ └── catalog.json │ │ ├── jenkins │ │ └── catalog.json │ │ ├── opsgenie │ │ └── catalog.json │ │ ├── victorops │ │ └── catalog.json │ │ ├── firehydrant │ │ └── catalog.json │ │ ├── buildkite │ │ └── catalog.json │ │ ├── statuspage │ │ └── catalog.json │ │ ├── azurepipeline │ │ └── catalog.json │ │ ├── azure-repos │ │ └── catalog.json │ │ ├── backlog │ │ └── catalog.json │ │ ├── squadcast │ │ └── catalog.json │ │ ├── shortcut │ │ └── catalog.json │ │ ├── gitlab-ci │ │ └── catalog.json │ │ ├── phabricator │ │ └── catalog.json │ │ ├── pagerduty │ │ └── catalog.json │ │ └── asana │ │ └── catalog.json │ └── resources │ └── fetch-primary-keys.sql ├── faros-airbyte-cdk ├── src │ ├── tsconfig.json │ ├── runner.ts │ ├── index.ts │ ├── destinations │ │ └── destination.ts │ └── connector.ts ├── test │ └── tsconfig.json └── README.md ├── .dockerignore ├── .tsconfig.json ├── .gitignore └── Dockerfile /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /sources/bamboohr-source/test_files/users.json: -------------------------------------------------------------------------------- 1 | [] 2 | -------------------------------------------------------------------------------- /sources/okta-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/buildkite-source/test_files/builds.json: -------------------------------------------------------------------------------- 1 | [] 2 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @cjwooo @tovbinm @ypc-faros @willmarks 2 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/secret.key.not-so-secret: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.huskyrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "hooks": { 3 | "pre-commit": "lint-staged" 4 | } 5 | } -------------------------------------------------------------------------------- /sources/datadog-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "bad": "" 3 | } 4 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/builds/legacyIds: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/pagerduty-source/test_files/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "token" 3 | } 4 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/nextBuildNumber: -------------------------------------------------------------------------------- 1 | 4 2 | -------------------------------------------------------------------------------- /sources/servicenow-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "bad": "" 3 | } 4 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jenkins.install.UpgradeWizard.state: -------------------------------------------------------------------------------- 1 | 2.303.1 -------------------------------------------------------------------------------- /sources/squadcast-source/test_files/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "squadcast-token" 3 | } 4 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jenkins.install.InstallUtil.lastExecVersion: -------------------------------------------------------------------------------- 1 | 2.303.1 -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/builds/1/changelog.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/builds/2/changelog.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/builds/3/changelog.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.lintstagedrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "*.ts": [ 3 | "prettier --write", 4 | "eslint --fix" 5 | ] 6 | } -------------------------------------------------------------------------------- /sources/bamboohr-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Users} from './users'; 2 | export {Users}; 3 | -------------------------------------------------------------------------------- /sources/docker-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Tags} from './tags'; 2 | 3 | export {Tags}; 4 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/src/gitlab/index.ts: -------------------------------------------------------------------------------- 1 | export * from './gitlab'; 2 | export * from './types'; 3 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/.owner: -------------------------------------------------------------------------------- 1 | 324256173 contextPath="" at 7@ad42d17cdcad 2 | -------------------------------------------------------------------------------- /sources/bamboohr-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "api_key": "", 3 | "domain": "" 4 | } 5 | -------------------------------------------------------------------------------- /sources/example-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Builds} from './builds'; 2 | 3 | export {Builds}; 4 | -------------------------------------------------------------------------------- /sources/pagerduty-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "", 3 | "start_date":"" 4 | } 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | View on [docs.airbyte.io](https://docs.airbyte.io/contributing-to-airbyte) 3 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Works} from './works'; 2 | 3 | export {Works}; 4 | -------------------------------------------------------------------------------- /sources/buildkite-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "", 3 | "cutoff_days":90 4 | } 5 | -------------------------------------------------------------------------------- /sources/firehydrant-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "", 3 | "cutoff_days":90 4 | } 5 | -------------------------------------------------------------------------------- /sources/squadcast-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "", 3 | "cutoff_days":90 4 | } 5 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": false, 3 | "trailingComma": "es5", 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /sources/customer-io-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "app_api_key": "", 3 | "cutoff_days":90 4 | } 5 | -------------------------------------------------------------------------------- /sources/example-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "builds": { 3 | "cutoff": 1735718400000 4 | } 5 | } -------------------------------------------------------------------------------- /sources/harness-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Executions} from './executions'; 2 | 3 | export {Executions}; 4 | -------------------------------------------------------------------------------- /sources/opsgenie-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "api_key": "", 3 | "cutoff_days": 90 4 | } 5 | -------------------------------------------------------------------------------- /sources/buildkite-source/test_files/pipelines_all.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "slug": "kelvin-test" 4 | } 5 | ] 6 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "pipelines": { 3 | "cutoff": 1735718400000 4 | } 5 | } -------------------------------------------------------------------------------- /sources/googlecalendar-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "private_key": "", 3 | "client_email": "" 4 | } 5 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/secret.key: -------------------------------------------------------------------------------- 1 | 7aa047712e6d26248588f27ca6270128cc0cb70e58ab0f75c179bd658e3ca755 -------------------------------------------------------------------------------- /sources/servicenow-source/test_files/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "username": "username", 3 | "password": "password" 4 | } 5 | -------------------------------------------------------------------------------- /sources/circleci-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | export {Projects} from './projects'; 2 | export {Pipelines} from './pipelines'; 3 | -------------------------------------------------------------------------------- /sources/victorops-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiId":"", 3 | "apiKey":"", 4 | "cutoff_days":90 5 | } 6 | -------------------------------------------------------------------------------- /sources/circleci-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "", 3 | "repo_names": [], 4 | "cutoff_days": 90 5 | } 6 | -------------------------------------------------------------------------------- /sources/datadog-source/test_files/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiKey": "key", 3 | "applicationKey": "key", 4 | "pageSize": 10 5 | } 6 | -------------------------------------------------------------------------------- /sources/example-source/test_files/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_url": "http://localhost", 3 | "token": "", 4 | "user": "chris" 5 | } -------------------------------------------------------------------------------- /sources/harness-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "executions": { 3 | "lastEndedAt": 1735689600000 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/harness-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "api_key": "", 3 | "account_id": "", 4 | "cutoff_days":90 5 | } 6 | -------------------------------------------------------------------------------- /sources/statuspage-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "api_key": "", 3 | "page_id": "", 4 | "cutoff_days":90 5 | } 6 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of conduct 2 | View in [docs.airbyte.io](https://docs.airbyte.io/contributing-to-airbyte/code-of-conduct) 3 | -------------------------------------------------------------------------------- /sources/circleci-source/src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/airbyte-connectors/main/sources/circleci-source/src/.DS_Store -------------------------------------------------------------------------------- /sources/docker-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "username": "", 3 | "password": "", 4 | "repositories": "test" 5 | } 6 | -------------------------------------------------------------------------------- /sources/example-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_url":"url", 3 | "user":"baduser", 4 | "token":"token" 5 | } 6 | -------------------------------------------------------------------------------- /sources/googlecalendar-source/test_files/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "private_key": "PRIVATE_KEY", 3 | "client_email": "CLIENT_EMAIL" 4 | } 5 | -------------------------------------------------------------------------------- /sources/okta-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "domain_name": "dev-88164258", 3 | "token": "", 4 | "version": "v1" 5 | } -------------------------------------------------------------------------------- /sources/phabricator-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "repositories": { 3 | "latestCreatedAt": 1735718400000 4 | } 5 | } -------------------------------------------------------------------------------- /sources/azure-repos-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "access_token": "", 3 | "organization": "", 4 | "project": "" 5 | } 6 | -------------------------------------------------------------------------------- /sources/backlog-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "issues": { 3 | "lastUpdatedAt": "2025-01-01T00:00:00Z" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/circleci-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "pipelines": { 3 | "lastUpdatedAt": "2025-01-01 00:00:00" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_url":"url", 3 | "user":"baduser", 4 | "token":"token" 5 | } 6 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_url": "url", 3 | "user": "baduser", 4 | "token": "token" 5 | } 6 | -------------------------------------------------------------------------------- /sources/okta-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Groups} from './groups'; 2 | import {Users} from './users'; 3 | export {Users, Groups}; 4 | -------------------------------------------------------------------------------- /sources/shortcut-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "iterations": { 3 | "lastUpdatedAt": "2025-01-01T00:00:00Z" 4 | } 5 | } -------------------------------------------------------------------------------- /sources/victorops-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "incidents": { 3 | "cutoff": "2025-01-01T08:00:00.000Z" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "works": { 3 | "cutoff": "2025-01-01T08:00:00.000Z" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/buildkite-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "builds": { 3 | "lastCreatedAt": "2025-01-01T00:00:00.000Z" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/docker-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "tags": { 3 | "lastCreatedAt": "2025-01-01T00:00:00.000Z" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/jenkins-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Builds} from './builds'; 2 | import {Jobs} from './jobs'; 3 | 4 | export {Builds, Jobs}; 5 | -------------------------------------------------------------------------------- /sources/phabricator-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_url": "url", 3 | "token": "token", 4 | "cutoff_days": 90 5 | } 6 | -------------------------------------------------------------------------------- /sources/squadcast-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "incidents": { 3 | "lastUpdatedAt": "2025-01-01T00:00:00.000Z" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.1", 3 | "packages": [ 4 | "faros-airbyte-cdk", 5 | "destinations/**", 6 | "sources/**" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /sources/azureactivedirectory-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "client_id": "", 3 | "client_secret": "", 4 | "tenant_id": "" 5 | } 6 | -------------------------------------------------------------------------------- /sources/docker-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/firehydrant-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "incidents": { 3 | "lastCreatedAt": "2025-01-01T00:00:00.000Z" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/okta-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/shortcut-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "", 3 | "base_url":"https://api.app.shortcut.com", 4 | "version":"v3" 5 | } -------------------------------------------------------------------------------- /sources/azure-repos-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/azureactivedirectory-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Groups} from './groups'; 2 | import {Users} from './users'; 3 | export {Users, Groups}; 4 | -------------------------------------------------------------------------------- /sources/backlog-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/backlog-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "apiKey": "", 3 | "space": "devcube", 4 | "cutoff_days":90, 5 | "version": "v2" 6 | } 7 | -------------------------------------------------------------------------------- /sources/bamboohr-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/bitbucket-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/buildkite-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/circleci-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/customer-io-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/datadog-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/datadog-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Incidents} from './incident'; 2 | import {Users} from './users'; 3 | 4 | export {Incidents, Users}; 5 | -------------------------------------------------------------------------------- /sources/example-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/example-source/test/index.test.ts: -------------------------------------------------------------------------------- 1 | describe('index', () => { 2 | test('ok?', async () => { 3 | expect('OK').toEqual('OK'); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /sources/firehydrant-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/harness-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/jenkins-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/userContent/readme.txt: -------------------------------------------------------------------------------- 1 | Files in this directory will be served under your http://yourjenkins/userContent/ 2 | -------------------------------------------------------------------------------- /sources/opsgenie-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/opsgenie-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "incidents": { 3 | "lastCreatedAt": "2025-01-01T00:00:00.000Z" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /sources/pagerduty-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/phabricator-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/servicenow-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/shortcut-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/squadcast-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/statuspage-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/victorops-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/azurepipeline-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/googlecalendar-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/phabricator-source/test/index.test.ts: -------------------------------------------------------------------------------- 1 | describe('index', () => { 2 | test('ok?', async () => { 3 | expect('OK').toEqual('OK'); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /sources/phabricator-source/test_files/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_url": "http://localhost", 3 | "token": "ok", 4 | "start_date": "2021-03-01T00:00:00Z" 5 | } -------------------------------------------------------------------------------- /sources/servicenow-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Incidents} from './incidents'; 2 | import {Users} from './users'; 3 | 4 | export {Incidents, Users}; 5 | -------------------------------------------------------------------------------- /sources/azureactivedirectory-source/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /sources/azurepipeline-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "access_token": "", 3 | "organization": "", 4 | "project": "", 5 | "start_date": "" 6 | } 7 | -------------------------------------------------------------------------------- /sources/googlecalendar-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Calendars} from './calendars'; 2 | import {Events} from './events'; 3 | 4 | export {Calendars, Events}; 5 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "builds": { 3 | "newJobsLastCompletedBuilds": { 4 | "Faros-test-job": 3 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/bin/main: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const {mainCommand} = require('../lib'); 4 | 5 | mainCommand().parseAsync(process.argv); 6 | -------------------------------------------------------------------------------- /faros-airbyte-cdk/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_url": "http://127.0.0.1:8080", 3 | "token": "112886b247f226a0c18f5422e36a3d2806", 4 | "user": "admin" 5 | } 6 | -------------------------------------------------------------------------------- /sources/circleci-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/example-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/gitlab-ci-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/victorops-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/bitbucket-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "serverUrl": "url", 3 | "username": "bad-username", 4 | "password": "bad-password", 5 | "cutoff_days":90 6 | } 7 | -------------------------------------------------------------------------------- /sources/customer-io-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/datadog-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /sources/googlecalendar-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/harness-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /sources/phabricator-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/servicenow-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/img/source_destination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/airbyte-connectors/main/destinations/airbyte-faros-destination/img/source_destination.png -------------------------------------------------------------------------------- /sources/customer-io-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | export {Campaigns} from './campaigns'; 2 | export {CampaignActions} from './campaign-actions'; 3 | export {Newsletters} from './newsletters'; 4 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/identity.key.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/airbyte-connectors/main/sources/jenkins-source/test_files/jenkins/data/identity.key.enc -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib" 6 | } 7 | } -------------------------------------------------------------------------------- /sources/backlog-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Issues} from './issues'; 2 | import {Projects} from './projects'; 3 | import {Users} from './users'; 4 | export {Issues, Projects, Users}; 5 | -------------------------------------------------------------------------------- /sources/firehydrant-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Incidents} from './incidents'; 2 | import {Teams} from './teams'; 3 | import {Users} from './users'; 4 | export {Incidents, Users, Teams}; 5 | -------------------------------------------------------------------------------- /sources/opsgenie-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Incidents} from './incidents'; 2 | import {Teams} from './teams'; 3 | import {Users} from './users'; 4 | export {Incidents, Users, Teams}; 5 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/queue.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 3 4 | 5 | -------------------------------------------------------------------------------- /sources/victorops-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Incidents} from './incidents'; 2 | import {Teams} from './teams'; 3 | import {Users} from './users'; 4 | 5 | export {Incidents, Teams, Users}; 6 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | **/lib 3 | **/secrets 4 | **/*.log 5 | **/*.out 6 | **/.pytest_cache 7 | **/acceptance-test-config.yml 8 | **/acceptance_tests_logs 9 | **/test_files 10 | **/test -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/queue.xml.bak: -------------------------------------------------------------------------------- 1 | 2 | 3 | 3 4 | 5 | -------------------------------------------------------------------------------- /sources/azurepipeline-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Builds} from './builds'; 2 | import {Pipelines} from './pipelines'; 3 | import {Releases} from './releases'; 4 | export {Pipelines, Builds, Releases}; 5 | -------------------------------------------------------------------------------- /sources/pagerduty-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "sourceMap": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/okta_faros/common.ts: -------------------------------------------------------------------------------- 1 | import {Converter} from '../converter'; 2 | 3 | export abstract class OktaFarosConverter extends Converter { 4 | source = 'Okta_Faros'; 5 | } 6 | -------------------------------------------------------------------------------- /sources/buildkite-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Builds} from './builds'; 2 | import {Organizations} from './organizations'; 3 | import {Pipelines} from './pipelines'; 4 | export {Organizations, Pipelines, Builds}; 5 | -------------------------------------------------------------------------------- /sources/datadog-source/test_files/future_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "incidents": { 3 | "lastModified": "2022-02-27T21:14:44.708Z" 4 | }, 5 | "users": { 6 | "lastModifiedAt": "2022-02-27T21:10:44.706Z" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/okta-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/bamboohr-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/bitbucket-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/buildkite-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/docker-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/jenkins-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/opsgenie-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/pagerduty-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "incidents": { 3 | "lastSynced": "2200-10-29T05:52:30Z" 4 | }, 5 | "incident_log_entries": { 6 | "lastSynced": "2200-10-29T05:52:30Z" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/servicenow-source/test_files/future_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "incidents": { 3 | "sys_updated_on": "2022-02-27T21:14:44.708Z" 4 | }, 5 | "users": { 6 | "sys_updated_on": "2022-02-27T21:10:44.706Z" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/shortcut-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/squadcast-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/statuspage-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/azure-repos-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {PullRequests} from './pulllrequests'; 2 | import {Repositories} from './repositories'; 3 | import {Users} from './users'; 4 | export {Repositories, PullRequests, Users}; 5 | -------------------------------------------------------------------------------- /sources/azure-repos-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/azurepipeline-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/firehydrant-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/copy_reference_file.log: -------------------------------------------------------------------------------- 1 | --- Copying files at Mon Sep 6 16:20:12 UTC 2021 2 | --- Copying files at Mon Sep 6 19:51:19 UTC 2021 3 | --- Copying files at Mon Sep 6 20:01:02 UTC 2021 4 | -------------------------------------------------------------------------------- /sources/statuspage-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Incidents} from './incidents'; 2 | import {IncidentUpdates} from './incidentUpdates'; 3 | import {Users} from './users'; 4 | 5 | export {Incidents, IncidentUpdates, Users}; 6 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/azureactivedirectory-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/azurepipeline-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "builds": { 3 | "lastQueueTime": "2025-01-01T00:00:00Z" 4 | }, 5 | "releases": { 6 | "lastCreatedOn": "2025-01-01T00:00:00Z" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/builds/permalinks: -------------------------------------------------------------------------------- 1 | lastCompletedBuild 3 2 | lastFailedBuild -1 3 | lastStableBuild 3 4 | lastSuccessfulBuild 3 5 | lastUnstableBuild -1 6 | lastUnsuccessfulBuild -1 7 | -------------------------------------------------------------------------------- /sources/backlog-source/src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "composite": true, 5 | "outDir": "../lib", 6 | "experimentalDecorators": true, 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /faros-airbyte-cdk/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/test_files/invalid_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "server_url": "", 3 | "client_id": "", 4 | "client_secret": "", 5 | "username": "", 6 | "password": "", 7 | "api_token": "", 8 | "cutoff_days":90 9 | } 10 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Groups} from './groups'; 2 | import {Jobs} from './jobs'; 3 | import {Pipelines} from './pipelines'; 4 | import {Projects} from './projects'; 5 | 6 | export {Groups, Projects, Pipelines, Jobs}; 7 | -------------------------------------------------------------------------------- /sources/okta-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/azure-repos-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/bamboohr-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/circleci-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/customer-io-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/datadog-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/example-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/harness-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/hudson.model.UpdateCenter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | default 5 | https://updates.jenkins.io/update-center.json 6 | 7 | -------------------------------------------------------------------------------- /sources/phabricator-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/servicenow-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/squadcast-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Events} from './events'; 2 | import {Incidents} from './incidents'; 3 | import {Services} from './services'; 4 | import {Users} from './users'; 5 | 6 | export {Events, Incidents, Services, Users}; 7 | -------------------------------------------------------------------------------- /sources/victorops-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/googlecalendar-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jenkins.telemetry.Correlator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 54773ce8-20b2-435b-a3c7-769a568b0abe 4 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /sources/azureactivedirectory-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test" 5 | }, 6 | "references": [ 7 | { 8 | "path": "../src" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/docker/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__docker__tags" 6 | }, 7 | "destination_sync_mode": "append" 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /sources/customer-io-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "campaigns": { 3 | "cutoff": 1735718400000 4 | }, 5 | "campaign_actions": { 6 | "cutoff": 1735718400000 7 | }, 8 | "newsletters": { 9 | "cutoff": 1735718400000 10 | } 11 | } -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/bamboohr/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__bamboohr__users" 6 | }, 7 | "destination_sync_mode": "append" 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | jenkins: 5 | image: jenkins/jenkins:lts-jdk11 6 | ports: 7 | - 8080:8080 8 | - 50000:50000 9 | volumes: 10 | - ./data:/var/jenkins_home 11 | -------------------------------------------------------------------------------- /sources/pagerduty-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "sourceMap": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/agileaccelerator/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__agileaccelerator__works" 6 | }, 7 | "destination_sync_mode": "append" 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /faros-airbyte-cdk/README.md: -------------------------------------------------------------------------------- 1 | # Airbyte Connector Development Kit (CDK) for JavaScript/TypeScript 2 | 3 | [![npm version](https://badge.fury.io/js/faros-airbyte-cdk.svg)](https://badge.fury.io/js/faros-airbyte-cdk) 4 | 5 | 📖 Read more here - https://github.com/faros-ai/airbyte-connectors 6 | -------------------------------------------------------------------------------- /sources/backlog-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true, 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/bitbucket-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/buildkite-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/docker-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/jenkins-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/opsgenie-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/shortcut-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/squadcast-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/statuspage-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/azurepipeline-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/firehydrant-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/shortcut-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Epics} from './epics'; 2 | import {Iterations} from './iterations'; 3 | import {Members} from './members'; 4 | import {Projects} from './projects'; 5 | import {Stories} from './stories'; 6 | export {Projects, Iterations, Epics, Stories, Members}; 7 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../../.tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out/test", 5 | "experimentalDecorators": true 6 | }, 7 | "references": [ 8 | { 9 | "path": "../src" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /sources/googlecalendar-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "calendars": { 3 | "lastSyncToken": "CIDPmvb-q_QCEjRmYXJvcy10ZXN0QGZhcm9zLXRlc3QtMzMyMjA5LmlhbS5nc2VydmljZWFjY291bnQuY29t" 4 | }, 5 | "events": { 6 | "lastSyncToken": "CIDPmvb-q_QCEIDPmvb-q_QCGAUg8PPzxQE=" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sources/statuspage-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "incidents": { 3 | "cutoff": "2025-01-01T08:00:00.000Z" 4 | }, 5 | "incident_updates": { 6 | "cutoff": "2025-01-01T08:00:00.000Z" 7 | }, 8 | "users": { 9 | "cutoff": "2025-01-01T08:00:00.000Z" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/faros_feeds/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__faros_feeds__faros_feed" 6 | }, 7 | "destination_sync_mode": "append" 8 | } 9 | ] 10 | } 11 | 12 | -------------------------------------------------------------------------------- /sources/phabricator-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Commits} from './commits'; 2 | import {Projects} from './projects'; 3 | import {Repositories} from './repositories'; 4 | import {Revisions} from './revisions'; 5 | import {Users} from './users'; 6 | 7 | export {Commits, Projects, Repositories, Revisions, Users}; 8 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/README.md: -------------------------------------------------------------------------------- 1 | You need run Jenkins's server to fix the error: "identity.key.enc is corrupted. Identity.key.enc will be deleted and a new one will be generated. 2 | javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption." 3 | -------------------------------------------------------------------------------- /.github/workflows/skip-test-sources.txt: -------------------------------------------------------------------------------- 1 | agileaccelerator-source 2 | azure-repos-source 3 | azurepipeline-source 4 | bamboohr-source 5 | gitlab-ci-source 6 | googlecalendar-source 7 | datadog-source 8 | jenkins-source 9 | okta-source 10 | opsgenie-source 11 | servicenow-source 12 | squadcast-source 13 | phabricator-source 14 | victorops-source 15 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "monthly" 7 | - package-ecosystem: "npm" 8 | directory: "/" 9 | schedule: 10 | interval: "monthly" 11 | labels: 12 | - 'dependencies' 13 | open-pull-requests-limit: 10 14 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | AgileAccelerator is a REST API. This connector has the following streams: 4 | 5 | * [Works]({DOMAIN_URL}/lightning/setup/ObjectManager/01I7Q000000PsSD/FieldsAndRelationships/view) \(Incremental\) 6 | 7 | See [here]({DOMAIN_URL}/lightning/setup/ObjectManager/home) for API 8 | documentation. 9 | -------------------------------------------------------------------------------- /sources/pagerduty-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {IncidentLogEntries} from './incidentLogEntries'; 2 | import {Incidents} from './incidents'; 3 | import {PrioritiesResource} from './prioritiesResource'; 4 | import {Teams} from './teams'; 5 | import {Users} from './users'; 6 | 7 | export {IncidentLogEntries, Incidents, PrioritiesResource, Users, Teams}; 8 | -------------------------------------------------------------------------------- /sources/firehydrant-source/test_files/users.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "608c2d17-4009-49e5-9491-b93168a7d0c7", 4 | "name": "Kelvin Tran", 5 | "email": "huongkstn@gmail.com", 6 | "created_at": "2022-03-07T15:00:29.757Z", 7 | "updated_at": "2022-03-07T15:00:29.757Z", 8 | "slack_linked?": true 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | 3 | > Provide description here 4 | 5 | ## Type of change 6 | - [ ] Bug fix 7 | - [ ] New feature 8 | - [ ] Breaking change 9 | 10 | ## Related issues 11 | 12 | > Fix [#1]() 13 | 14 | ## Migration notes 15 | 16 | > Describe migration notes if any 17 | 18 | ## Extra info 19 | 20 | > Add any additional information 21 | -------------------------------------------------------------------------------- /faros-airbyte-cdk/src/runner.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteLogger} from './logger'; 2 | 3 | export abstract class Runner { 4 | constructor(logger: AirbyteLogger) { 5 | process.on('unhandledRejection', (error) => { 6 | throw error; 7 | }); 8 | process.on('uncaughtException', (error) => { 9 | logger.trace(error); 10 | process.exit(1); 11 | }); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /sources/servicenow-source/resources/schemas/user.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": [ 5 | "sys_id" 6 | ], 7 | "properties": { 8 | "sys_id": {"type": "string"}, 9 | "name": {"type": "string"}, 10 | "email": {"type": "string"}, 11 | "sys_updated_on": {"type": "string"} 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "esModuleInterop": true, 5 | "module": "commonjs", 6 | "noImplicitAny": false, 7 | "pretty": true, 8 | "resolveJsonModule": false, 9 | "skipLibCheck": true, 10 | "sourceMap": false, 11 | "strict": true, 12 | "strictNullChecks": false, 13 | "target": "es2019" 14 | } 15 | } -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/groups.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "created_at": "2020-01-15T12:36:29.590Z", 4 | "description": "Aliquid qui quis dignissimos distinctio ut commodi voluptas est.", 5 | "name": "Best Group", 6 | "path": "best-group", 7 | "full_path": "best-group", 8 | "visibility": "public", 9 | "web_url": "https://gitlab.example.com/groups/best-group" 10 | } 11 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/users/users.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1 4 | 5 | 6 | admin 7 | admin_14692387833535189143 8 | 9 | 10 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/okta/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__okta__groups" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__okta__users" 12 | }, 13 | "destination_sync_mode": "append" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/datadog/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__datadog__incidents" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__datadog__users" 12 | }, 13 | "destination_sync_mode": "append" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/circleci/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__circleci__projects" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__circleci__pipelines" 12 | }, 13 | "destination_sync_mode": "append" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/groups-response.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "createdAt": "2020-01-15T12:36:29.590Z", 5 | "description": "Aliquid qui quis dignissimos distinctio ut commodi voluptas est.", 6 | "name": "Best Group", 7 | "path": "best-group", 8 | "fullPath": "best-group", 9 | "visibility": "public", 10 | "webUrl": "https://gitlab.example.com/groups/best-group" 11 | } 12 | ] -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/harness/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__harness__executions" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__harness__something_else" 12 | }, 13 | "destination_sync_mode": "append" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/servicenow/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__servicenow__incidents" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__servicenow__users" 12 | }, 13 | "destination_sync_mode": "append" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /sources/victorops-source/test_files/users.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "firstName": "Roman", 4 | "lastName": "Kyrnis", 5 | "displayName": "Roman Kyrnis", 6 | "username": "roman.kyrnis", 7 | "email": "roman.ky@mydevcube.com", 8 | "createdAt": "2021-11-02T16:19:02Z", 9 | "passwordLastUpdated": "2021-11-02T16:19:02Z", 10 | "verified": true, 11 | "_selfUrl": "/api-public/v1/user/roman.kyrnis" 12 | } 13 | ] 14 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/okta/common.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {Converter} from '../converter'; 4 | 5 | /** Okta converter base */ 6 | export abstract class OktaConverter extends Converter { 7 | source = 'Okta'; 8 | 9 | /** Almost every Okta record have id property */ 10 | id(record: AirbyteRecord): any { 11 | return record?.record?.data?.id; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /faros-airbyte-cdk/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './destinations/destination'; 2 | export * from './destinations/destination-runner'; 3 | export {wrapApiError} from './errors'; 4 | export * from './logger'; 5 | export * from './protocol'; 6 | export * from './sources/source-base'; 7 | export * from './sources/source'; 8 | export * from './sources/source-runner'; 9 | export * from './sources/streams/stream-base'; 10 | export * from './utils'; 11 | -------------------------------------------------------------------------------- /sources/buildkite-source/resources/schemas/organizations.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "additionalProperties": true, 5 | "properties": { 6 | "id": { 7 | "type": "string" 8 | }, 9 | "name": { 10 | "type": "string" 11 | }, 12 | "slug": { 13 | "type": "string" 14 | }, 15 | "web_url": { 16 | "type": "string" 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib/ 2 | out/ 3 | secrets/ 4 | node_modules/ 5 | acceptance_tests_logs/ 6 | .vscode/ 7 | 8 | .DS_Store 9 | acceptance-test-*.log 10 | *.code-workspace 11 | 12 | faros-airbyte-cdk/package-lock.json 13 | destinations/**/package-lock.json 14 | sources/**/package-lock.json 15 | 16 | **/jenkins/data/logs 17 | **/jenkins/data/war 18 | **/jenkins/data/.cache 19 | **/jenkins/data/.java 20 | **/jenkins/data/.lastStarted 21 | **/jenkins/data/*.log 22 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/azureactivedirectory/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__azureactivedirectory__groups" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__azureactivedirectory__users" 12 | }, 13 | "destination_sync_mode": "append" 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /sources/opsgenie-source/test_files/teams.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "26f9e160-0aac-40d9-ae19-c1c3fe2000be", 4 | "name": "Nodejs team", 5 | "description": "Nodejs team", 6 | "links": { 7 | "web": "https://huongtn.app.opsgenie.com/teams/dashboard/26f9e160-0aac-40d9-ae19-c1c3fe2000be/main", 8 | "api": "https://api.opsgenie.com/v2/teams/26f9e160-0aac-40d9-ae19-c1c3fe2000be" 9 | } 10 | } 11 | ] 12 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/builds/1/log: -------------------------------------------------------------------------------- 1 | Started by user ha:////4IJFoT+H9WjAPaWj9Ss3Dt1fIxAvrCgzz8aXPlaejePcAAAAlx+LCAAAAAAAAP9b85aBtbiIQTGjNKU4P08vOT+vOD8nVc83PyU1x6OyILUoJzMv2y+/JJUBAhiZGBgqihhk0NSjKDWzXb3RdlLBUSYGJk8GtpzUvPSSDB8G5tKinBIGIZ+sxLJE/ZzEvHT94JKizLx0a6BxUmjGOUNodHsLgAzWEgZu/dLi1CL9xJTczDwAj6GcLcAAAAA=admin 2 | Running as SYSTEM 3 | Building in workspace /var/jenkins_home/workspace/Faros-test-job 4 | Finished: SUCCESS 5 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/builds/2/log: -------------------------------------------------------------------------------- 1 | Started by user ha:////4IJFoT+H9WjAPaWj9Ss3Dt1fIxAvrCgzz8aXPlaejePcAAAAlx+LCAAAAAAAAP9b85aBtbiIQTGjNKU4P08vOT+vOD8nVc83PyU1x6OyILUoJzMv2y+/JJUBAhiZGBgqihhk0NSjKDWzXb3RdlLBUSYGJk8GtpzUvPSSDB8G5tKinBIGIZ+sxLJE/ZzEvHT94JKizLx0a6BxUmjGOUNodHsLgAzWEgZu/dLi1CL9xJTczDwAj6GcLcAAAAA=admin 2 | Running as SYSTEM 3 | Building in workspace /var/jenkins_home/workspace/Faros-test-job 4 | Finished: SUCCESS 5 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/builds/3/log: -------------------------------------------------------------------------------- 1 | Started by user ha:////4IJFoT+H9WjAPaWj9Ss3Dt1fIxAvrCgzz8aXPlaejePcAAAAlx+LCAAAAAAAAP9b85aBtbiIQTGjNKU4P08vOT+vOD8nVc83PyU1x6OyILUoJzMv2y+/JJUBAhiZGBgqihhk0NSjKDWzXb3RdlLBUSYGJk8GtpzUvPSSDB8G5tKinBIGIZ+sxLJE/ZzEvHT94JKizLx0a6BxUmjGOUNodHsLgAzWEgZu/dLi1CL9xJTczDwAj6GcLcAAAAA=admin 2 | Running as SYSTEM 3 | Building in workspace /var/jenkins_home/workspace/Faros-test-job 4 | Finished: SUCCESS 5 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/projects.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 1, 3 | "archived": false, 4 | "created_at": "2022-04-01T11:19:37.180Z", 5 | "default_branch": "main", 6 | "description": "Aliquid qui quis dignissimos distinctio ut commodi voluptas est. project1", 7 | "name": "Project1", 8 | "path": "project1", 9 | "path_with_namespace": "best-group/project1", 10 | "visibility": "private", 11 | "web_url": "https://gitlab.example.com/best-group/project1" 12 | } 13 | -------------------------------------------------------------------------------- /sources/circleci-source/test_files/projects.json: -------------------------------------------------------------------------------- 1 | { 2 | "slug": "gh/huongtn/sample-test", 3 | "organization_name": "huongtn", 4 | "organization_id": "988b9f2e-fc7c-4a81-b2ac-651c352e01b5", 5 | "name": "sample-test", 6 | "id": "19713f32-e5b8-4f7e-9978-ecc3f96b3113", 7 | "organization_slug": "gh/huongtn", 8 | "vcs_info": { 9 | "vcs_url": "https://github.com/huongtn/sample-test", 10 | "default_branch": "main", 11 | "provider": "GitHub" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/azureactivedirectory/common.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {Converter} from '../converter'; 4 | 5 | /** AzureActiveDirectory converter base */ 6 | export abstract class AzureActiveDirectoryConverter extends Converter { 7 | source = 'AzureActiveDirectory'; 8 | /** Almost every Azure Active Directory record have id property */ 9 | id(record: AirbyteRecord): any { 10 | return record?.record?.data?.id; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/projects-response.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "archived": false, 5 | "createdAt": "2022-04-01T11:19:37.180Z", 6 | "defaultBranch": "main", 7 | "description": "Aliquid qui quis dignissimos distinctio ut commodi voluptas est. project1", 8 | "name": "Project1", 9 | "path": "project1", 10 | "pathWithNamespace": "best-group/project1", 11 | "visibility": "private", 12 | "webUrl": "https://gitlab.example.com/best-group/project1" 13 | } 14 | ] -------------------------------------------------------------------------------- /sources/bamboohr-source/test_files/full_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "users", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh" 9 | ], 10 | "source_defined_cursor": true, 11 | "source_defined_primary_key": [ 12 | [ 13 | "uid" 14 | ] 15 | ] 16 | }, 17 | "sync_mode": "full_refresh", 18 | "destination_sync_mode": "overwrite" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /sources/victorops-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | VictorOps is a REST API. This connector has the following streams: 4 | 5 | * [Incidents](https://portal.victorops.com/public/api-docs.html#!/Reporting/get_api_reporting_v2_incidents) \(Incremental\) 6 | * [Teams](https://portal.victorops.com/public/api-docs.html#!/Teams/get_api_public_v1_team) 7 | * [Users](https://portal.victorops.com/public/api-docs.html#!/Users/get_api_public_v1_user) 8 | 9 | See [here](https://portal.victorops.com/public/api-docs.html) for API 10 | documentation. 11 | -------------------------------------------------------------------------------- /sources/customer-io-source/resources/schemas/newsletters.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "integer" 7 | }, 8 | "deduplicate_id": { 9 | "type": "string" 10 | }, 11 | "name": { 12 | "type": "string" 13 | }, 14 | "type": { 15 | "type": "string" 16 | }, 17 | "updated": { 18 | "type": "integer" 19 | }, 20 | "created": { 21 | "type": "integer" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sources/googlecalendar-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | GoogleCalendar is a REST API. This connector has the following streams: 4 | 5 | * [Calendars](https://developers.google.com/calendar/api/v3/reference/calendarList/list) \(Incremental\) 6 | * [Events](https://developers.google.com/calendar/api/v3/reference/events/list) \(Incremental\) 7 | 8 | [Service Account](https://support.google.com/a/answer/7378726?hl=en) is used to authenticate to Google Calendar. See [here](https://developers.google.com/calendar/api/v3/reference) for API 9 | documentation. 10 | -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/users/admin_14692387833535189143/apiTokenStats.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8814633a-e564-4534-a0d1-4a9b96fd6e6d 6 | 2021-09-06 19:43:24.662 UTC 7 | 209 8 | 9 | 10 | -------------------------------------------------------------------------------- /sources/squadcast-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | SquadCast is a REST API. This connector has the following streams: 4 | 5 | * [Events](https://apidocs.squadcast.com/#7be5218b-a817-4c88-92c1-a7f0d4528553) 6 | * [Incidents](https://apidocs.squadcast.com/#3d00d5c6-6b9b-410c-a11b-0da72c60d419) \(Incremental\) 7 | * [Services](https://apidocs.squadcast.com/#abb07c8a-d547-46eb-88f1-19378314ec4e) 8 | * [Users](https://apidocs.squadcast.com/#b6654727-8106-4995-a0a3-6a80d29a4951) 9 | 10 | See [here](https://apidocs.squadcast.com/#intro) for API 11 | documentation. 12 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/jenkins/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__jenkins__jobs" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__jenkins__builds" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__jenkins__something_else" 18 | }, 19 | "destination_sync_mode": "append" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/opsgenie/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__opsgenie__incidents" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__opsgenie__teams" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__opsgenie__users" 18 | }, 19 | "destination_sync_mode": "append" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/victorops/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__victorops__incidents" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__victorops__teams" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__victorops__users" 18 | }, 19 | "destination_sync_mode": "append" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /sources/harness-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | Harness is a GraphQL API. This connector has the following streams: 4 | 5 | * [Executions](https://docs.harness.io/article/ba4vs50071-use-workflows-api) \(Incremental\) 6 | 7 | See [here](https://docs.harness.io/article/tm0w6rruqv-harness-api) for API 8 | documentation. While Harness has both REST and GraphQL APIs, this connector only 9 | uses the GraphQL API. This might change as additional streams are added to the 10 | connector. 11 | 12 | The Execution stream pulls executions from both Harness Pipelines and Workflows. 13 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/firehydrant/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__firehydrant__incidents" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__firehydrant__teams" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__firehydrant__users" 18 | }, 19 | "destination_sync_mode": "append" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/buildkite/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__buildkite__organizations" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__buildkite__pipelines" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__buildkite__builds" 18 | }, 19 | "destination_sync_mode": "append" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/statuspage/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__statuspage__incidents" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__statuspage__incident_updates" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__statuspage__users" 18 | }, 19 | "destination_sync_mode": "append" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/resources/schemas/pipelines.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "number" 7 | }, 8 | "commitSha": { 9 | "type": "string" 10 | }, 11 | "projectId": { 12 | "type": "number" 13 | }, 14 | "status": { 15 | "type": "string" 16 | }, 17 | "createdAt": { 18 | "type": "string" 19 | }, 20 | "updatedAt": { 21 | "type": "string" 22 | }, 23 | "webUrl": { 24 | "type": "string" 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/azurepipeline/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__azurepipeline__pipelines" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__azurepipeline__builds" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__azurepipeline__releases" 18 | }, 19 | "destination_sync_mode": "append" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /sources/googlecalendar-source/test_files/calendars.json: -------------------------------------------------------------------------------- 1 | { 2 | "nextSyncToken": "sync-token", 3 | "items": [ 4 | { 5 | "kind": "calendar#calendarListEntry", 6 | "etag": "\"1637221140246000\"", 7 | "id": "5vokul6v3odfgpopgq0pec51k0@group.calendar.google.com", 8 | "summary": "First created calendar in this account", 9 | "timeZone": "UTC", 10 | "colorId": "10", 11 | "backgroundColor": "#b3dc6c", 12 | "foregroundColor": "#000000", 13 | "selected": true, 14 | "accessRole": "owner", 15 | "defaultReminders": [] 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/jira/sprint_issues.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {JiraConverter} from './common'; 5 | 6 | // Required as dependency Sprints converter 7 | export class SprintIssues extends JiraConverter { 8 | readonly destinationModels: ReadonlyArray = []; 9 | 10 | async convert( 11 | record: AirbyteRecord, 12 | ctx: StreamContext 13 | ): Promise> { 14 | return []; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/azure-repos/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__azure-repos__repositories" 6 | }, 7 | "destination_sync_mode": "overwrite" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__azure-repos__pull_requests" 12 | }, 13 | "destination_sync_mode": "overwrite" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__azure-repos__users" 18 | }, 19 | "destination_sync_mode": "overwrite" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/jira/pull_requests.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {JiraConverter} from './common'; 5 | 6 | // Required as dependency by Issues converter 7 | export class PullRequests extends JiraConverter { 8 | readonly destinationModels: ReadonlyArray = []; 9 | 10 | async convert( 11 | record: AirbyteRecord, 12 | ctx: StreamContext 13 | ): Promise> { 14 | return []; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sources/statuspage-source/resources/schemas/users.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "string" 7 | }, 8 | "first_name": { 9 | "type": "string" 10 | }, 11 | "last_name": { 12 | "type": "string" 13 | }, 14 | "updated_at": { 15 | "type": "string" 16 | }, 17 | "created_at": { 18 | "type": "string" 19 | }, 20 | "email": { 21 | "type": "string" 22 | }, 23 | "organization_id": { 24 | "type": "string" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/jira/issue_fields.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {JiraConverter} from './common'; 5 | 6 | // Required as dependency by Issues and Sprints stream 7 | export class IssueFields extends JiraConverter { 8 | readonly destinationModels: ReadonlyArray = []; 9 | 10 | async convert( 11 | record: AirbyteRecord, 12 | ctx: StreamContext 13 | ): Promise> { 14 | return []; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/jira/workflow_statuses.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {JiraConverter} from './common'; 5 | 6 | // Required as dependency by Issues converter 7 | export class WorkflowStatuses extends JiraConverter { 8 | readonly destinationModels: ReadonlyArray = []; 9 | 10 | async convert( 11 | record: AirbyteRecord, 12 | ctx: StreamContext 13 | ): Promise> { 14 | return []; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/backlog/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__backlog__issues" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__backlog__projects" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__backlog__users" 18 | }, 19 | "destination_sync_mode": "append" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /sources/buildkite-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "builds", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "default_cursor_field": [ 12 | "createdAt" 13 | ], 14 | "source_defined_primary_key": [ 15 | [ 16 | "id" 17 | ] 18 | ] 19 | }, 20 | "sync_mode": "incremental", 21 | "destination_sync_mode": "append" 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /sources/datadog-source/README.md: -------------------------------------------------------------------------------- 1 | # Datadog Source 2 | 3 | This source streams data from the [Datadog APIs](https://docs.datadoghq.com/api/latest/) using the [Datadog Node.js API client](https://www.npmjs.com/package/@datadog/datadog-api-client). 4 | 5 | ## Streams 6 | 7 | | Model | Full | Incremental | 8 | |---|---|---| 9 | | Incidents | ✅ | ✅ | 10 | | Users | ✅ | ✅ | 11 | 12 | ## Testing 13 | 14 | From the Datadog source directory execute: 15 | 16 | ```sh 17 | $ npm t 18 | ``` 19 | 20 | From the repo root directory execute: 21 | 22 | ```sh 23 | $ ./scripts/source-acceptance-test.sh datadog-source 24 | ``` 25 | -------------------------------------------------------------------------------- /sources/squadcast-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "incidents", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "default_cursor_field": [ 12 | "created_at" 13 | ], 14 | "source_defined_primary_key": [ 15 | [ 16 | "id" 17 | ] 18 | ] 19 | }, 20 | "sync_mode": "incremental", 21 | "destination_sync_mode": "append" 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /sources/statuspage-source/resources/schemas/incidentUpdates.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "body": { 6 | "type": "string" 7 | }, 8 | "created_at": { 9 | "type": "string" 10 | }, 11 | "display_at": { 12 | "type": "string" 13 | }, 14 | "id": { 15 | "type": "string" 16 | }, 17 | "incident_id": { 18 | "type": "string" 19 | }, 20 | "status": { 21 | "type": "string" 22 | }, 23 | "updated_at": { 24 | "type": "string" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sources/example-source/test_files/full_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "builds", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "source_defined_primary_key": [ 13 | [ 14 | "uid" 15 | ], 16 | [ 17 | "source" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "full_refresh", 22 | "destination_sync_mode": "overwrite" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jenkins/data/jobs/Faros-test-job/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | false 5 | 6 | 7 | true 8 | false 9 | false 10 | false 11 | 12 | false 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /sources/servicenow-source/README.md: -------------------------------------------------------------------------------- 1 | # ServiceNow Source 2 | 3 | This source streams data from the [ServiceNow GraphQL API](https://docs.servicenow.com/bundle/sandiego-application-development/page/integrate/graphql/task/query-schema-from-component.html) 4 | 5 | ## Streams 6 | 7 | | Model | Full | Incremental | 8 | |---|---|---| 9 | | Incidents | ✅ | ✅ | 10 | | Users | ✅ | ✅ | 11 | 12 | ## Testing 13 | 14 | From the ServiceNow source directory execute: 15 | 16 | ```sh 17 | $ npm t 18 | ``` 19 | 20 | From the repo root directory execute: 21 | 22 | ```sh 23 | $ ./scripts/source-acceptance-test.sh servicenow-source 24 | ``` 25 | -------------------------------------------------------------------------------- /sources/docker-source/test_files/full_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "tags", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "default_cursor_field": [ 12 | "imageConfig", 13 | "created" 14 | ], 15 | "source_defined_primary_key": [ 16 | [ 17 | "name" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "full_refresh", 22 | "destination_sync_mode": "overwrite" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/firehydrant-source/resources/schemas/users.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "string" 7 | }, 8 | "name": { 9 | "type": "string" 10 | }, 11 | "email": { 12 | "type": ["string","null"] 13 | }, 14 | "created_at": { 15 | "type": "string" 16 | }, 17 | "updated_at": { 18 | "type": "string" 19 | }, 20 | "slack_linked?": { 21 | "type": "boolean" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sources/shortcut-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "iterations", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "source_defined_primary_key": [ 13 | [ 14 | "id" 15 | ] 16 | ], 17 | "cursor_field": [ 18 | "updated_at" 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /sources/gitlab-ci-source/resources/schemas/groups.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "number" 7 | }, 8 | "createdAt": { 9 | "type": "string" 10 | }, 11 | "description": { 12 | "type": "string" 13 | }, 14 | "name": { 15 | "type": "string" 16 | }, 17 | "path": { 18 | "type": "string" 19 | }, 20 | "fullPath": { 21 | "type": "string" 22 | }, 23 | "visibility": { 24 | "type": "string" 25 | }, 26 | "webUrl": { 27 | "type": "string" 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "pipelines", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "default_cursor_field": [ 13 | "updatedAt" 14 | ], 15 | "source_defined_primary_key": [ 16 | [ 17 | "id" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /sources/harness-source/test_files/full_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "executions", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "default_cursor_field": [ 13 | "endedAt" 14 | ], 15 | "source_defined_primary_key": [ 16 | [ 17 | "id" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "full_refresh", 22 | "destination_sync_mode": "overwrite" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/circleci-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "pipelines", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "source_defined_primary_key": [ 13 | [ 14 | "id" 15 | ] 16 | ], 17 | "default_cursor_field": [ 18 | "updated_at" 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/test_files/full_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "works", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "default_cursor_field": [ 13 | "LastModifiedDate" 14 | ], 15 | "source_defined_primary_key": [ 16 | [ 17 | "Id" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "full_refresh", 22 | "destination_sync_mode": "overwrite" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/firehydrant-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "incidents", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "default_cursor_field": [ 12 | "created_at" 13 | ], 14 | "source_defined_cursor": true, 15 | "source_defined_primary_key": [ 16 | [ 17 | "id" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "works", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "default_cursor_field": [ 13 | "LastModifiedDate" 14 | ], 15 | "source_defined_primary_key": [ 16 | [ 17 | "Id" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/victorops-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "incidents", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "default_cursor_field": [ 13 | "startTime" 14 | ], 15 | "source_defined_primary_key": [ 16 | [ 17 | "incidentNumber" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/servicenow-source/test_files/incidents.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "severity": "3", 4 | "short_description": "Unable to connect to email", 5 | "closed_at": "2016-12-14 02:46:44", 6 | "cmdb_ci": "Storage Area Network 001", 7 | "business_service": "Email", 8 | "sys_updated_on": "2016-12-14 02:46:44", 9 | "priority": "3", 10 | "sys_id": "1c741bd70b2322007518478d83673af3", 11 | "number": "INC0000060", 12 | "opened_at": "2016-12-12 15:19:57", 13 | "opened_by": "681ccaf9c0a8016400b98a06818d57c7", 14 | "resolved_at": "2016-12-13 21:43:14", 15 | "state": "7", 16 | "assigned_to": "5137153cc611227c000bbd1bd8cd2007" 17 | } 18 | ] 19 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/gitlab/group_labels.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {GitlabConverter} from '../common/gitlab'; 4 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 5 | 6 | export class GroupLabels extends GitlabConverter { 7 | readonly destinationModels: ReadonlyArray = ['tms_Label']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const label = record.record.data; 14 | 15 | return [{model: 'tms_Label', record: {name: label.name}}]; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/gitlab/project_labels.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {GitlabConverter} from '../common/gitlab'; 4 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 5 | 6 | export class ProjectLabels extends GitlabConverter { 7 | readonly destinationModels: ReadonlyArray = ['tms_Label']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const label = record.record.data; 14 | 15 | return [{model: 'tms_Label', record: {name: label.name}}]; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /sources/example-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "builds", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "source_defined_primary_key": [ 13 | [ 14 | "uid" 15 | ], 16 | [ 17 | "source" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append", 23 | "cursor_field": [ 24 | "updated_at" 25 | ] 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /sources/okta-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: okta-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | -------------------------------------------------------------------------------- /sources/bitbucket-source/test_files/abnormal_state.json: -------------------------------------------------------------------------------- 1 | { 2 | "commits": { 3 | "RomanKyrnis/geekhub2019": { 4 | "cutoff": "2025-01-01T00:00:00.000Z" 5 | } 6 | }, 7 | "issues": { 8 | "RomanKyrnis/geekhub2019": { 9 | "cutoff": "2025-01-01T00:00:00.000Z" 10 | } 11 | }, 12 | "pipeline_steps": { 13 | "RomanKyrnis/geekhub2019": { 14 | "cutoff": "2025-01-01T00:00:00.000Z" 15 | } 16 | }, 17 | "pull_request_activities": { 18 | "RomanKyrnis/geekhub2019": { 19 | "cutoff": "2025-01-01T00:00:00.000Z" 20 | } 21 | }, 22 | "pull_requests": { 23 | "RomanKyrnis/geekhub2019": { 24 | "cutoff": "2025-01-01T00:00:00.000Z" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sources/bamboohr-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: bamboohr-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/pipelines.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "sha": "4e8bb881bdde32ab967003895cefea8a5315cbe1", 5 | "project_id": 2, 6 | "status": "success", 7 | "created_at": "2022-04-04T07:04:36.512Z", 8 | "updated_at": "2022-04-04T07:06:54.227Z", 9 | "web_url": "https://gitlab.example.com/best-group/project2/-/pipelines/1" 10 | }, 11 | { 12 | "id": 2, 13 | "sha": "e22e85f05b6ac3ffc2e32cc581b31fe5f3ac5061", 14 | "project_id": 2, 15 | "status": "success", 16 | "created_at": "2022-04-03T16:35:21.749Z", 17 | "updated_at": "2022-04-03T16:35:21.749Z", 18 | "web_url": "https://gitlab.example.com/best-group/project2/-/pipelines/2" 19 | } 20 | ] -------------------------------------------------------------------------------- /sources/azure-repos-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: azure-repos-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/asana/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {AsanaCommon, AsanaConverter, AsanaUser} from './common'; 5 | 6 | export class Users extends AsanaConverter { 7 | readonly destinationModels: ReadonlyArray = ['tms_User']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const user = record.record.data as AsanaUser; 15 | 16 | return [AsanaCommon.tms_User(user, source)]; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/github/issue_labels.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {GitHubConverter} from './common'; 5 | 6 | export class IssueLabels extends GitHubConverter { 7 | readonly destinationModels: ReadonlyArray = ['tms_Label']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const label = record.record.data; 14 | return [ 15 | { 16 | model: 'tms_Label', 17 | record: {name: label.name}, 18 | }, 19 | ]; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/test_files/pipelines-response.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "commitSha": "4e8bb881bdde32ab967003895cefea8a5315cbe1", 5 | "projectId": 2, 6 | "status": "success", 7 | "createdAt": "2022-04-04T07:04:36.512Z", 8 | "updatedAt": "2022-04-04T07:06:54.227Z", 9 | "webUrl": "https://gitlab.example.com/best-group/project2/-/pipelines/1" 10 | }, 11 | { 12 | "id": 2, 13 | "commitSha": "e22e85f05b6ac3ffc2e32cc581b31fe5f3ac5061", 14 | "projectId": 2, 15 | "status": "success", 16 | "createdAt": "2022-04-03T16:35:21.749Z", 17 | "updatedAt": "2022-04-03T16:35:21.749Z", 18 | "webUrl": "https://gitlab.example.com/best-group/project2/-/pipelines/2" 19 | } 20 | ] -------------------------------------------------------------------------------- /sources/harness-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "executions", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "default_cursor_field": [ 13 | "endedAt" 14 | ], 15 | "source_defined_primary_key": [ 16 | [ 17 | "id" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append", 23 | "cursor_field": [ 24 | "endedAt" 25 | ] 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /faros-airbyte-cdk/src/destinations/destination.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteConnector} from '../connector'; 2 | import { 3 | AirbyteConfig, 4 | AirbyteConfiguredCatalog, 5 | AirbyteStateMessage, 6 | } from '../protocol'; 7 | 8 | /** 9 | * Airbyte Destination 10 | * https://docs.airbyte.io/understanding-airbyte/airbyte-specification#destination 11 | */ 12 | export abstract class AirbyteDestination extends AirbyteConnector { 13 | /** 14 | * Implement to define how the connector writes data to the destination 15 | */ 16 | abstract write( 17 | config: AirbyteConfig, 18 | catalog: AirbyteConfiguredCatalog, 19 | stdin: NodeJS.ReadStream, 20 | dryRun: boolean 21 | ): AsyncGenerator; 22 | } 23 | -------------------------------------------------------------------------------- /sources/phabricator-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | Phabricator is a REST API. This connector has the following streams: 4 | 5 | * [Commits](https://secure.phabricator.com/conduit/method/diffusion.commit.search/) \(Incremental\) 6 | * [Projects](https://secure.phabricator.com/conduit/method/project.search/) \(Incremental\) 7 | * [Repositories](https://secure.phabricator.com/conduit/method/diffusion.repository.search/) \(Incremental\) 8 | * [Revisions](https://secure.phabricator.com/conduit/method/differential.revision.search/) \(Incremental\) 9 | * [Users](https://secure.phabricator.com/conduit/method/user.search/) \(Incremental\) 10 | 11 | See [here](https://secure.phabricator.com/conduit/) for API 12 | documentation. 13 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/asana/tags.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {AsanaConverter} from './common'; 5 | 6 | export class Tags extends AsanaConverter { 7 | readonly destinationModels: ReadonlyArray = ['tms_Label']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const tag = record.record.data; 14 | 15 | return [ 16 | { 17 | model: 'tms_Label', 18 | record: { 19 | name: tag.name, 20 | }, 21 | }, 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/squadcast/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__squadcast__events" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__squadcast__incidents" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__squadcast__services" 18 | }, 19 | "destination_sync_mode": "append" 20 | }, 21 | { 22 | "stream": { 23 | "name": "mytestsource__squadcast__users" 24 | }, 25 | "destination_sync_mode": "append" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /sources/azureactivedirectory-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: azureactivedirectory-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | -------------------------------------------------------------------------------- /sources/customer-io-source/src/customer-io/typings.ts: -------------------------------------------------------------------------------- 1 | export interface CustomerIOListCampaignsResponse { 2 | campaigns: CustomerIOCampaign[]; 3 | } 4 | 5 | export interface CustomerIOCampaign { 6 | id: number; 7 | updated: number; 8 | actions?: CustomerIOCampaignAction[]; 9 | } 10 | 11 | export interface CustomerIOListCampaignActionsResponse { 12 | actions: CustomerIOCampaignAction[]; 13 | next: string; 14 | } 15 | 16 | export interface CustomerIOCampaignAction { 17 | id: string; 18 | updated: number; 19 | } 20 | 21 | export interface CustomerIOListNewsletterResponse { 22 | newsletters: CustomerIONewsletter[]; 23 | } 24 | 25 | export interface CustomerIONewsletter { 26 | id: number; 27 | updated: number; 28 | } 29 | -------------------------------------------------------------------------------- /sources/pagerduty-source/resources/schemas/users.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "string" 7 | }, 8 | "type": { 9 | "type": "string" 10 | }, 11 | "summary": { 12 | "type": "string" 13 | }, 14 | "self": { 15 | "type": "string" 16 | }, 17 | "html_url": { 18 | "type": "string" 19 | }, 20 | "email": { 21 | "type": "string" 22 | }, 23 | "name": { 24 | "type": "string" 25 | } 26 | }, 27 | "required": [ 28 | "id", 29 | "type", 30 | "summary", 31 | "self", 32 | "html_url", 33 | "email", 34 | "name" 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16-alpine 2 | 3 | WORKDIR /home/node/airbyte 4 | RUN npm install -g lerna tsc 5 | 6 | COPY lerna.json .tsconfig.json package.json package-lock.json ./ 7 | RUN sed -i "/jest\|mockttp/d" package.json 8 | COPY ./faros-airbyte-cdk ./faros-airbyte-cdk 9 | COPY ./sources ./sources 10 | COPY ./destinations ./destinations 11 | RUN lerna bootstrap --hoist 12 | 13 | ARG path 14 | RUN test -n "$path" || (echo "'path' argument is not set, e.g --build-arg path=destinations/airbyte-faros-destination" && false) 15 | ENV CONNECTOR_PATH $path 16 | 17 | RUN ln -s "/home/node/airbyte/$CONNECTOR_PATH/bin/main" "/home/node/airbyte/main" 18 | 19 | ENV AIRBYTE_ENTRYPOINT "/home/node/airbyte/main" 20 | ENTRYPOINT ["/home/node/airbyte/main"] 21 | -------------------------------------------------------------------------------- /sources/customer-io-source/resources/schemas/campaign-actions.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "string" 7 | }, 8 | "campaign_id": { 9 | "type": "integer" 10 | }, 11 | "parent_action_id": { 12 | "type": "integer" 13 | }, 14 | "deduplicate_id": { 15 | "type": "string" 16 | }, 17 | "name": { 18 | "type": "string" 19 | }, 20 | "created": { 21 | "type": "integer" 22 | }, 23 | "updated": { 24 | "type": "integer" 25 | }, 26 | "body": { 27 | "type": "string" 28 | }, 29 | "type": { 30 | "type": "string" 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /sources/pagerduty-source/resources/schemas/teams.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "string" 7 | }, 8 | "type": { 9 | "type": "string" 10 | }, 11 | "summary": { 12 | "type": "string" 13 | }, 14 | "self": { 15 | "type": "string" 16 | }, 17 | "html_url": { 18 | "type": "string" 19 | }, 20 | "name": { 21 | "type": "string" 22 | }, 23 | "description": { 24 | "type": "string" 25 | } 26 | }, 27 | "required": [ 28 | "id", 29 | "type", 30 | "summary", 31 | "self", 32 | "html_url", 33 | "name", 34 | "description" 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /sources/pagerduty-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | PagerDuty is a REST API. This connector has the following streams: 4 | 5 | * [Incidents](https://developer.pagerduty.com/api-reference/b3A6Mjc0ODEzOA-list-incidents) \(Incremental\) 6 | * [Incident Log Entries](https://developer.pagerduty.com/api-reference/b3A6Mjc0ODE1NA-list-log-entries) \(Incremental\) 7 | * [Priorities](https://developer.pagerduty.com/api-reference/b3A6Mjc0ODE2NA-list-priorities) 8 | * [Users](https://developer.pagerduty.com/api-reference/b3A6Mjc0ODIzMw-list-users) 9 | * [Teams](https://developer.pagerduty.com/api-reference/0138639504311-list-teams) 10 | 11 | See [here](https://developer.pagerduty.com/api-reference/YXBpOjI3NDgwOTk-pager-duty-api) for API 12 | documentation. 13 | -------------------------------------------------------------------------------- /sources/servicenow-source/resources/schemas/incident.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["sys_id"], 5 | "properties": { 6 | "sys_id": {"type": "string"}, 7 | "number": {"type": "string"}, 8 | "short_description": {"type": "string"}, 9 | "severity": {"type": "string"}, 10 | "priority": {"type": "string"}, 11 | "state": {"type": "string"}, 12 | "assigned_to": {"type": "string"}, 13 | "resolved_at": {"type": "string"}, 14 | "opened_at": {"type": "string"}, 15 | "closed_at": {"type": "string"}, 16 | "sys_updated_on": {"type": "string"}, 17 | "business_service": {"type": "string"}, 18 | "cmdb_ci": {"type": "string"} 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/github/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {GitHubCommon, GitHubConverter} from './common'; 5 | 6 | export class Users extends GitHubConverter { 7 | readonly destinationModels: ReadonlyArray = [ 8 | 'vcs_Membership', 9 | 'vcs_User', 10 | ]; 11 | 12 | async convert( 13 | record: AirbyteRecord, 14 | ctx: StreamContext 15 | ): Promise> { 16 | const source = this.streamName.source; 17 | const user = record.record.data; 18 | return GitHubCommon.vcs_User_with_Membership(user, source); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/resources/fetch-primary-keys.sql: -------------------------------------------------------------------------------- 1 | select kcu.table_name, 2 | cols.generation_expression as exp 3 | from information_schema.table_constraints tco 4 | join information_schema.key_column_usage kcu 5 | on kcu.constraint_name = tco.constraint_name 6 | and kcu.constraint_schema = tco.constraint_schema 7 | and kcu.constraint_name = tco.constraint_name 8 | join information_schema.columns cols 9 | on kcu.table_name = cols.table_name 10 | and kcu.column_name = cols.column_name 11 | where tco.constraint_type = 'PRIMARY KEY' 12 | and kcu.table_schema = 'public' 13 | and kcu.column_name = 'id' 14 | and cols.generation_expression is not null 15 | order by kcu.table_schema, 16 | kcu.table_name; 17 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/github/assignees.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {GitHubCommon, GitHubConverter} from './common'; 5 | 6 | export class Assignees extends GitHubConverter { 7 | readonly destinationModels: ReadonlyArray = ['tms_User']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const user = record.record.data; 15 | const res = GitHubCommon.tms_User(user, source); 16 | 17 | if (res) return [res]; 18 | return []; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sources/pagerduty-source/resources/schemas/prioritiesResource.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "string" 7 | }, 8 | "type": { 9 | "type": "string" 10 | }, 11 | "summary": { 12 | "type": "string" 13 | }, 14 | "self": { 15 | "type": "string" 16 | }, 17 | "html_url": { 18 | "type": "string" 19 | }, 20 | "description": { 21 | "type": "string" 22 | }, 23 | "name": { 24 | "type": "string" 25 | } 26 | }, 27 | "required": [ 28 | "id", 29 | "type", 30 | "summary", 31 | "self", 32 | "html_url", 33 | "description", 34 | "name" 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/github/collaborators.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {GitHubCommon, GitHubConverter} from './common'; 5 | 6 | export class Collaborators extends GitHubConverter { 7 | readonly destinationModels: ReadonlyArray = [ 8 | 'vcs_Membership', 9 | 'vcs_User', 10 | ]; 11 | 12 | async convert( 13 | record: AirbyteRecord, 14 | ctx: StreamContext 15 | ): Promise> { 16 | const source = this.streamName.source; 17 | const user = record.record.data; 18 | 19 | return GitHubCommon.vcs_User_with_Membership(user, source); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sources/opsgenie-source/resources/schemas/teams.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "string" 7 | }, 8 | "name": { 9 | "type": "string" 10 | }, 11 | "description": { 12 | "type": [ 13 | "string", 14 | "null" 15 | ] 16 | }, 17 | "links": { 18 | "type": "object", 19 | "properties": { 20 | "web": { 21 | "type": "string" 22 | }, 23 | "api": { 24 | "type": "string" 25 | } 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/resources/schemas/projects.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "number" 7 | }, 8 | "archived": { 9 | "type": "boolean" 10 | }, 11 | "createdAt": { 12 | "type": "string" 13 | }, 14 | "defaultBranch": { 15 | "type": "string" 16 | }, 17 | "description": { 18 | "type": "string" 19 | }, 20 | "name": { 21 | "type": "string" 22 | }, 23 | "path": { 24 | "type": "string" 25 | }, 26 | "pathWithNamespace": { 27 | "type": "string" 28 | }, 29 | "visibility": { 30 | "type": "string" 31 | }, 32 | "webUrl": { 33 | "type": "string" 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /sources/pagerduty-source/src/streams/teams.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteLogger, AirbyteStreamBase, StreamKey} from 'faros-airbyte-cdk'; 2 | import {Dictionary} from 'ts-essentials'; 3 | 4 | import {Pagerduty, PagerdutyConfig, Priority} from '../pagerduty'; 5 | 6 | export class Teams extends AirbyteStreamBase { 7 | constructor(readonly config: PagerdutyConfig, logger: AirbyteLogger) { 8 | super(logger); 9 | } 10 | 11 | getJsonSchema(): Dictionary { 12 | return require('../../resources/schemas/teams.json'); 13 | } 14 | get primaryKey(): StreamKey { 15 | return 'id'; 16 | } 17 | 18 | async *readRecords(): AsyncGenerator { 19 | const pagerduty = Pagerduty.instance(this.config, this.logger); 20 | 21 | yield* pagerduty.getTeams(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /sources/victorops-source/resources/schemas/users.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": [ 5 | "username" 6 | ], 7 | "properties": { 8 | "firstName": { 9 | "type": "string" 10 | }, 11 | "lastName": { 12 | "type": "string" 13 | }, 14 | "displayName": { 15 | "type": "string" 16 | }, 17 | "username": { 18 | "type": "string" 19 | }, 20 | "email": { 21 | "type": "string" 22 | }, 23 | "createdAt": { 24 | "type": "string" 25 | }, 26 | "passwordLastUpdated": { 27 | "type": "string" 28 | }, 29 | "verified": { 30 | "type": "boolean" 31 | }, 32 | "_selfUrl": { 33 | "type": "string" 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /sources/victorops-source/resources/schemas/teams.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": [ 5 | "name", 6 | "slug" 7 | ], 8 | "properties": { 9 | "name": { 10 | "type": "string" 11 | }, 12 | "slug": { 13 | "type": "string" 14 | }, 15 | "_selfUrl": { 16 | "type": "string" 17 | }, 18 | "_membersUrl": { 19 | "type": "string" 20 | }, 21 | "_policiesUrl": { 22 | "type": "string" 23 | }, 24 | "_adminsUrl": { 25 | "type": "string" 26 | }, 27 | "memberCount": { 28 | "type": "number" 29 | }, 30 | "version": { 31 | "type": "number" 32 | }, 33 | "isDefaultTeam": { 34 | "type": "boolean" 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /sources/bitbucket-source/src/streams/index.ts: -------------------------------------------------------------------------------- 1 | import {Branches} from './branches'; 2 | import {Commits} from './commits'; 3 | import {Deployments} from './deployments'; 4 | import {Issues} from './issues'; 5 | import {PipelineSteps} from './pipeline_steps'; 6 | import {Pipelines} from './pipelines'; 7 | import {PullRequestActivities} from './pull_request_activities'; 8 | import {PullRequests} from './pull_requests'; 9 | import {Repositories} from './repositories'; 10 | import {WorkspaceUsers} from './workspace_users'; 11 | import {Workspaces} from './workspaces'; 12 | 13 | export { 14 | Branches, 15 | Commits, 16 | Deployments, 17 | Issues, 18 | PipelineSteps, 19 | Pipelines, 20 | PullRequestActivities, 21 | PullRequests, 22 | Repositories, 23 | WorkspaceUsers, 24 | Workspaces, 25 | }; 26 | -------------------------------------------------------------------------------- /sources/docker-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "tags", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "default_cursor_field": [ 12 | "imageConfig", 13 | "created" 14 | ], 15 | "source_defined_primary_key": [ 16 | [ 17 | "name" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/backlog-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "issues", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "source_defined_cursor": true, 12 | "source_defined_primary_key": [ 13 | [ 14 | "id" 15 | ] 16 | ], 17 | "cursor_field": [ 18 | "updated" 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/statuspage-source/test_files/users.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "3", 4 | "first_name": "#3", 5 | "last_name": "testUser", 6 | "updated_at": "2021-11-11T00:00:00", 7 | "created_at": "2021-11-11T00:00:00", 8 | "email": "testUser", 9 | "organization_id": "321" 10 | }, 11 | { 12 | "id": "2", 13 | "first_name": "#2", 14 | "last_name": "testUser", 15 | "updated_at": "2021-11-08T00:00:00", 16 | "created_at": "2021-11-08T00:00:00", 17 | "email": "testUser", 18 | "organization_id": "321" 19 | }, 20 | { 21 | "id": "1", 22 | "first_name": "#1", 23 | "last_name": "testUser", 24 | "updated_at": "2021-11-01T00:00:00", 25 | "created_at": "2021-11-01T00:00:00", 26 | "email": "testUser", 27 | "organization_id": "321" 28 | } 29 | ] 30 | -------------------------------------------------------------------------------- /sources/buildkite-source/resources/gql/pipelines-query.gql: -------------------------------------------------------------------------------- 1 | query pipelinesQuery($slug: ID!, $pageSize: Int!, $after: String) { 2 | organization(slug: $slug) { 3 | pipelines(first: $pageSize, after: $after){ 4 | edges{ 5 | node { 6 | id 7 | organization() 8 | { 9 | slug 10 | } 11 | uuid 12 | name 13 | slug 14 | url 15 | createdAt 16 | description 17 | repository { 18 | url 19 | provider { 20 | name 21 | } 22 | } 23 | } 24 | cursor 25 | } 26 | pageInfo{ 27 | hasNextPage 28 | endCursor 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sources/opsgenie-source/test_files/incremental_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "incidents", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh", 9 | "incremental" 10 | ], 11 | "default_cursor_field": [ 12 | "createdAt" 13 | ], 14 | "source_defined_cursor": true, 15 | "source_defined_primary_key": [ 16 | [ 17 | "id" 18 | ] 19 | ] 20 | }, 21 | "sync_mode": "incremental", 22 | "destination_sync_mode": "append" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /sources/buildkite-source/test_files/pipelines.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "UGlwZWxpbmUtLS01ZjBhZmM1MC04YTcxLTQyMzUtYTE0Ny00ZmY4YmU5ZTM4Njg=", 4 | "organization": { 5 | "slug": "devcube" 6 | }, 7 | "uuid": "5f0afc50-8a71-4235-a147-4ff8be9e3868", 8 | "name": "Kelvin test", 9 | "slug": "kelvin-test", 10 | "url": "https://buildkite.com/devcube/kelvin-test", 11 | "createdAt": "2021-12-20T03:21:28.048Z", 12 | "description": null, 13 | "cursor":"ktkhMjAyMS0xMi0yMCAwMzoyMToyOC4wNDgxMDUwMDAgVVRD2SQ1ZjBhZmM1MC04YTcxLTQyMzUtYTE0Ny00ZmY4YmU5ZTM4Njg=", 14 | "repository": { 15 | "url": "git@github.com:huongtn/ECHTMen.git", 16 | "provider": { 17 | "name": "GitHub" 18 | } 19 | } 20 | } 21 | ] 22 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/community/types.ts: -------------------------------------------------------------------------------- 1 | import {Dictionary} from 'ts-essentials'; 2 | 3 | export enum Operation { 4 | UPSERT = 'Upsert', 5 | UPDATE = 'Update', 6 | DELETION = 'Deletion', 7 | } 8 | 9 | export interface TimestampedRecord { 10 | model: string; 11 | origin: string; 12 | at: number; 13 | operation: Operation; 14 | } 15 | 16 | export interface UpsertRecord extends TimestampedRecord { 17 | operation: Operation.UPSERT; 18 | data: Dictionary; 19 | } 20 | 21 | export interface UpdateRecord extends TimestampedRecord { 22 | operation: Operation.UPDATE; 23 | where: Dictionary; 24 | mask: string[]; 25 | patch: Dictionary; 26 | } 27 | 28 | export interface DeletionRecord extends TimestampedRecord { 29 | operation: Operation.DELETION; 30 | where: Dictionary; 31 | } 32 | -------------------------------------------------------------------------------- /sources/jenkins-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | Jenkins is a REST API. This connector has the following streams: 4 | 5 | * [Builds](https://your.jenkins.url/job/$JOB_NAME/$BUILD_NUMBER/api/json?pretty=true) \(Incremental\) 6 | * [Jobs](https://your.jenkins.url/job/$JOB_NAME/api/json?pretty=true) 7 | 8 | In the above links, replace `your.jenkins.url` with the url of your Jenkins 9 | instance, and replace any environment variables with an existing Jenkins job or 10 | build id. 11 | 12 | See [https://your.jenkins.url/api](https://your.jenkins.url/api) for API 13 | documentation. 14 | 15 | ## Testing 16 | 17 | A live Jenkins Server is required to run the Source Acceptance Tests. An example 18 | of how to do this is in [our Github Actions 19 | Workflow](https://github.com/faros-ai/airbyte-connectors/blob/main/.github/workflows/ci.yml#L54). 20 | -------------------------------------------------------------------------------- /sources/customer-io-source/resources/spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentationUrl": "https://docs.faros.ai", 3 | "connectionSpecification": { 4 | "$schema": "http://json-schema.org/draft-07/schema#", 5 | "title": "Customer.io Spec", 6 | "type": "object", 7 | "required": [ 8 | "app_api_key", 9 | "cutoff_days" 10 | ], 11 | "additionalProperties": false, 12 | "properties": { 13 | "app_api_key": { 14 | "type": "string", 15 | "title": "App API Key", 16 | "description": "App API Key for Customer.io API authentication", 17 | "airbyte_secret": true 18 | }, 19 | "cutoff_days": { 20 | "type": "integer", 21 | "title": "Cutoff Days", 22 | "default": 90, 23 | "description": "Only fetch data updated after cutoff" 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sources/bitbucket-source/src/streams/workspaces.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteLogger, AirbyteStreamBase, StreamKey} from 'faros-airbyte-cdk'; 2 | import {Dictionary} from 'ts-essentials'; 3 | 4 | import {Bitbucket} from '../bitbucket/bitbucket'; 5 | import {BitbucketConfig, Workspace} from '../bitbucket/types'; 6 | 7 | export class Workspaces extends AirbyteStreamBase { 8 | constructor(readonly config: BitbucketConfig, logger: AirbyteLogger) { 9 | super(logger); 10 | } 11 | 12 | getJsonSchema(): Dictionary { 13 | return require('../../resources/schemas/workspaces.json'); 14 | } 15 | get primaryKey(): StreamKey { 16 | return ['uuid']; 17 | } 18 | 19 | async *readRecords(): AsyncGenerator { 20 | const bitbucket = Bitbucket.instance(this.config, this.logger); 21 | 22 | yield* bitbucket.getWorkspaces(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /sources/example-source/resources/spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentationUrl": "https://docs.faros.ai", 3 | "connectionSpecification": { 4 | "$schema": "http://json-schema.org/draft-07/schema#", 5 | "title": "Jenkins Spec", 6 | "type": "object", 7 | "required": [ 8 | "server_url", 9 | "user", 10 | "token" 11 | ], 12 | "additionalProperties": false, 13 | "properties": { 14 | "server_url": { 15 | "type": "string", 16 | "title": "Jenkins Server URL", 17 | "examples": [ 18 | "https://my-jenkins-server.example.com" 19 | ] 20 | }, 21 | "user": { 22 | "type": "string", 23 | "title": "Jenkins User" 24 | }, 25 | "token": { 26 | "type": "string", 27 | "title": "Jenkins Token", 28 | "airbyte_secret": true 29 | } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /faros-airbyte-cdk/src/connector.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteConfig, 3 | AirbyteConnectionStatusMessage, 4 | AirbyteSpec, 5 | } from './protocol'; 6 | 7 | export abstract class AirbyteConnector { 8 | /** 9 | * @returns the spec for this integration. The spec is a JSON-Schema object 10 | * describing the required configurations (e.g: username and password) 11 | * required to run this integration. 12 | */ 13 | abstract spec(): Promise; 14 | 15 | /** 16 | * Tests if the input configuration can be used to successfully connect to the 17 | * integration e.g: if a provided Stripe API token can be used to connect to 18 | * the Stripe API. 19 | * 20 | * @returns Whether the check succeeds or fails with an error message. 21 | */ 22 | abstract check( 23 | config: AirbyteConfig 24 | ): Promise; 25 | } 26 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/bamboohr/common.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {Converter, StreamContext} from '../converter'; 4 | 5 | export interface BambooHRConfig { 6 | bootstrap_teams_from_managers?: boolean; 7 | } 8 | 9 | /** BambooHR converter base */ 10 | export abstract class BambooHRConverter extends Converter { 11 | source = 'BambooHR'; 12 | /** Almost every BambooHR record have id property */ 13 | id(record: AirbyteRecord): any { 14 | return record?.record?.data?.id; 15 | } 16 | 17 | protected bamboohrConfig(ctx: StreamContext): BambooHRConfig { 18 | return ctx.config.source_specific_configs?.bamboohr ?? {}; 19 | } 20 | 21 | protected bootstrapTeamsFromManagers(ctx: StreamContext): boolean { 22 | return this.bamboohrConfig(ctx).bootstrap_teams_from_managers ?? false; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/pagerduty/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {PagerDutyConverter} from './common'; 5 | 6 | export class Users extends PagerDutyConverter { 7 | readonly destinationModels: ReadonlyArray = ['ims_User']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const user = record.record.data; 15 | 16 | return [ 17 | { 18 | model: 'ims_User', 19 | record: { 20 | uid: user.id, 21 | email: user.email, 22 | name: user.name, 23 | source, 24 | }, 25 | }, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /sources/circleci-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | Customer.io is a REST API. This connector has the following streams: 4 | 5 | * [Campaigns](https://customer.io/docs/api/#operation/listCampaigns) \(Incremental\) 6 | * [Campaign Actions](https://customer.io/docs/api/#operation/listCampaignActions) \(Incremental\) 7 | * [Newsletters](https://customer.io/docs/api/#operation/listNewsletters) \(Incremental\) 8 | 9 | See [here](https://customer.io/docs/api/) for API documentation. Note that the 10 | API is divided into three different API hosts: Track, App, and Beta. These hosts 11 | provide access to different components of Customer.io, and each host has its own 12 | request limits and authentication methods. The current connector streams all use 13 | the [Beta API](https://customer.io/docs/api/#tag/betaOverview). In the future, 14 | additional streams may use the other API hosts. 15 | -------------------------------------------------------------------------------- /sources/circleci-source/resources/schemas/projects.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "properties": { 5 | "slug": { 6 | "type": "string" 7 | }, 8 | "organization_name": { 9 | "type": "string" 10 | }, 11 | "organization_id": { 12 | "type": "string" 13 | }, 14 | "name": { 15 | "type": "string" 16 | }, 17 | "id": { 18 | "type": "string" 19 | }, 20 | "organization_slug": { 21 | "type": "string" 22 | }, 23 | "vcs_info": { 24 | "type": "object", 25 | "properties": { 26 | "vcs_url": { 27 | "type": "string" 28 | }, 29 | "default_branch": { 30 | "type": "string" 31 | }, 32 | "provider": { 33 | "type": "string" 34 | } 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/servicenow/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {ServiceNowConverter} from './common'; 5 | 6 | export class Users extends ServiceNowConverter { 7 | readonly destinationModels: ReadonlyArray = ['ims_User']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const user = record.record.data; 15 | 16 | return [ 17 | { 18 | model: 'ims_User', 19 | record: { 20 | uid: user.sys_id, 21 | email: user.email, 22 | name: user.name, 23 | source, 24 | }, 25 | }, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/shortcut/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__shortcut__projects" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__shortcut__iterations" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__shortcut__epics" 18 | }, 19 | "destination_sync_mode": "append" 20 | }, 21 | { 22 | "stream": { 23 | "name": "mytestsource__shortcut__stories" 24 | }, 25 | "destination_sync_mode": "append" 26 | }, 27 | { 28 | "stream": { 29 | "name": "mytestsource__shortcut__members" 30 | }, 31 | "destination_sync_mode": "append" 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /sources/customer-io-source/bootstrap.md: -------------------------------------------------------------------------------- 1 | ## Streams 2 | 3 | Customer.io is a REST API. This connector has the following streams: 4 | 5 | * [Campaigns](https://customer.io/docs/api/#operation/listCampaigns) \(Incremental\) 6 | * [Campaign Actions](https://customer.io/docs/api/#operation/listCampaignActions) \(Incremental\) 7 | * [Newsletters](https://customer.io/docs/api/#operation/listNewsletters) \(Incremental\) 8 | 9 | See [here](https://customer.io/docs/api/) for API documentation. Note that the 10 | API is divided into three different API hosts: Track, App, and Beta. These hosts 11 | provide access to different components of Customer.io, and each host has its own 12 | request limits and authentication methods. The current connector streams all use 13 | the [Beta API](https://customer.io/docs/api/#tag/betaOverview). In the future, 14 | additional streams may use the other API hosts. 15 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/gitlab-ci/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__gitlab-ci__groups" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__gitlab-ci__projects" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__gitlab-ci__pipelines" 18 | }, 19 | "destination_sync_mode": "append" 20 | }, 21 | { 22 | "stream": { 23 | "name": "mytestsource__gitlab-ci__jobs" 24 | }, 25 | "destination_sync_mode": "append" 26 | }, 27 | { 28 | "stream": { 29 | "name": "mytestsource__gitlab-ci__something_else" 30 | }, 31 | "destination_sync_mode": "append" 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/datadog/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {DatadogConverter} from './common'; 5 | 6 | export class Users extends DatadogConverter { 7 | readonly destinationModels: ReadonlyArray = ['ims_User']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const user = record.record.data; 15 | 16 | return [ 17 | { 18 | model: 'ims_User', 19 | record: { 20 | uid: user?.id, 21 | email: user?.attributes?.email, 22 | name: user?.attributes?.name, 23 | source, 24 | }, 25 | }, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/statuspage/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {StatuspageConverter} from './common'; 5 | 6 | export class Users extends StatuspageConverter { 7 | readonly destinationModels: ReadonlyArray = ['ims_User']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const user = record.record.data; 15 | 16 | return [ 17 | { 18 | model: 'ims_User', 19 | record: { 20 | uid: user.id, 21 | email: user.email, 22 | name: `${user.first_name} ${user.last_name}`, 23 | source, 24 | }, 25 | }, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/phabricator/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__phabricator__repositories" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__phabricator__commits" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__phabricator__revisions" 18 | }, 19 | "destination_sync_mode": "append" 20 | }, 21 | { 22 | "stream": { 23 | "name": "mytestsource__phabricator__users" 24 | }, 25 | "destination_sync_mode": "append" 26 | }, 27 | { 28 | "stream": { 29 | "name": "mytestsource__phabricator__projects" 30 | }, 31 | "destination_sync_mode": "append" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /sources/bamboohr-source/src/models.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | id: number; 3 | employeeId: number; 4 | employeeNumber: string; 5 | jobTitle: string; 6 | status: string; 7 | employmentHistoryStatus: string; 8 | fullName1: string; 9 | address1?: string; 10 | address2?: string; 11 | birthday?: string; 12 | bestEmail: string; 13 | workEmail: string; 14 | workPhone?: string; 15 | city?: string; 16 | country?: string; 17 | department?: string; 18 | ethnicity?: string; 19 | firstName?: string; 20 | gender?: string; 21 | middleName?: string; 22 | mobilePhone?: string; 23 | zipcode?: string; 24 | supervisor?: string; 25 | // managerId 26 | supervisorId?: string; 27 | supervisorEId?: string; 28 | supervisorEmail?: string; 29 | payRate?: string; 30 | payFrequency?: string; 31 | hireDate?: string; 32 | terminationDate?: string; 33 | lastName?: string; 34 | } 35 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/firehydrant/teams.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {FireHydrantConverter} from './common'; 5 | import {Team} from './models'; 6 | 7 | export class Teams extends FireHydrantConverter { 8 | readonly destinationModels: ReadonlyArray = ['ims_Team']; 9 | 10 | async convert( 11 | record: AirbyteRecord, 12 | ctx: StreamContext 13 | ): Promise> { 14 | const source = this.streamName.source; 15 | const team = record.record.data as Team; 16 | 17 | return [ 18 | { 19 | model: 'ims_Team', 20 | record: { 21 | uid: team.id, 22 | name: team.name, 23 | url: undefined, 24 | source, 25 | }, 26 | }, 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/opsgenie/teams.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {OpsGenieConverter} from './common'; 5 | import {Team} from './models'; 6 | 7 | export class Teams extends OpsGenieConverter { 8 | readonly destinationModels: ReadonlyArray = ['ims_Team']; 9 | 10 | async convert( 11 | record: AirbyteRecord, 12 | ctx: StreamContext 13 | ): Promise> { 14 | const source = this.streamName.source; 15 | const team = record.record.data as Team; 16 | 17 | return [ 18 | { 19 | model: 'ims_Team', 20 | record: { 21 | uid: team.id, 22 | name: team.name, 23 | url: team.links.web, 24 | source, 25 | }, 26 | }, 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/pagerduty/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__pagerduty__incident_log_entries" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__pagerduty__incidents" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__pagerduty__priorities_resource" 18 | }, 19 | "destination_sync_mode": "append" 20 | }, 21 | { 22 | "stream": { 23 | "name": "mytestsource__pagerduty__users" 24 | }, 25 | "destination_sync_mode": "append" 26 | }, 27 | { 28 | "stream": { 29 | "name": "mytestsource__pagerduty__something_else" 30 | }, 31 | "destination_sync_mode": "append" 32 | } 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /sources/victorops-source/src/streams/teams.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {Team, Victorops, VictoropsConfig} from '../victorops'; 10 | 11 | export class Teams extends AirbyteStreamBase { 12 | constructor(readonly config: VictoropsConfig, logger: AirbyteLogger) { 13 | super(logger); 14 | } 15 | 16 | getJsonSchema(): Dictionary { 17 | return require('../../resources/schemas/teams.json'); 18 | } 19 | get primaryKey(): StreamKey { 20 | return 'slug'; 21 | } 22 | 23 | async *readRecords( 24 | syncMode: SyncMode, 25 | cursorField?: string[], 26 | streamSlice?: Team, 27 | streamState?: Dictionary 28 | ): AsyncGenerator { 29 | yield* Victorops.instance(this.config, this.logger).getTeams(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/backlog/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {BacklogConverter} from './common'; 5 | import {User} from './models'; 6 | 7 | export class Users extends BacklogConverter { 8 | readonly destinationModels: ReadonlyArray = ['tms_User']; 9 | 10 | async convert( 11 | record: AirbyteRecord, 12 | ctx: StreamContext 13 | ): Promise> { 14 | const source = this.streamName.source; 15 | const user = record.record.data as User; 16 | return [ 17 | { 18 | model: 'tms_User', 19 | record: { 20 | uid: String(user.id), 21 | name: user.name, 22 | emailAddress: user.mailAddress, 23 | source, 24 | }, 25 | }, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /sources/victorops-source/src/streams/users.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {User, Victorops, VictoropsConfig, VictoropsState} from '../victorops'; 10 | 11 | export class Users extends AirbyteStreamBase { 12 | constructor(readonly config: VictoropsConfig, logger: AirbyteLogger) { 13 | super(logger); 14 | } 15 | 16 | getJsonSchema(): Dictionary { 17 | return require('../../resources/schemas/users.json'); 18 | } 19 | get primaryKey(): StreamKey { 20 | return 'username'; 21 | } 22 | 23 | async *readRecords( 24 | syncMode: SyncMode, 25 | cursorField?: string[], 26 | streamSlice?: User, 27 | streamState?: VictoropsState 28 | ): AsyncGenerator { 29 | yield* Victorops.instance(this.config, this.logger).getUsers(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /sources/squadcast-source/test_files/services.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "619cb17408e88c8a8acdf395", 4 | "name": "Example Service", 5 | "slug": "example-service", 6 | "email": "452959c568f99df7042d1a9a2ab8446d76f00847@devcube.incidents.squadcast.com", 7 | "escalation_policy_id": "619cb17408e88c8a8acdf394", 8 | "organization_id": "619cb174c80d2600080df0d7", 9 | "api_key": "452959c568f99df7042d1a9a2ab8446d76f00847", 10 | "description": "On-Boarding Example Service", 11 | "depends": null, 12 | "owner": { 13 | "id": "619cb17408e88c8a8acdf393", 14 | "type": "team" 15 | }, 16 | "access_control": null, 17 | "on_maintenance": false, 18 | "escalation_policy": { 19 | "id": "619cb17408e88c8a8acdf394", 20 | "name": "Example Escalation Policy", 21 | "description": "On-Boarding Example Escalation Policy", 22 | "slug": "example-escalation-policy" 23 | } 24 | } 25 | ] 26 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/destination-runner.ts: -------------------------------------------------------------------------------- 1 | import {Command} from 'commander'; 2 | import {AirbyteDestinationRunner, AirbyteLogger} from 'faros-airbyte-cdk'; 3 | 4 | import {Converter} from './converters/converter'; 5 | import {ConverterRegistry} from './converters/converter-registry'; 6 | import {FarosDestination} from './destination'; 7 | 8 | /** Faros destination runner. */ 9 | export class FarosDestinationRunner extends AirbyteDestinationRunner { 10 | readonly program: Command; 11 | 12 | constructor() { 13 | const logger = new AirbyteLogger(); 14 | const destination = new FarosDestination(logger); 15 | super(logger, destination); 16 | this.program = super.mainCommand(); 17 | } 18 | 19 | /** 20 | * Register converters for custom streams 21 | */ 22 | registerConverters(...converters: ReadonlyArray): void { 23 | converters.forEach(ConverterRegistry.addConverter); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sources/buildkite-source/test_files/pipelines_input.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "node": { 4 | "id": "UGlwZWxpbmUtLS01ZjBhZmM1MC04YTcxLTQyMzUtYTE0Ny00ZmY4YmU5ZTM4Njg=", 5 | "organization": { 6 | "slug": "devcube" 7 | }, 8 | "uuid": "5f0afc50-8a71-4235-a147-4ff8be9e3868", 9 | "name": "Kelvin test", 10 | "slug": "kelvin-test", 11 | "url": "https://buildkite.com/devcube/kelvin-test", 12 | "createdAt": "2021-12-20T03:21:28.048Z", 13 | "description": null, 14 | "cursor":"ktkhMjAyMS0xMi0yMCAwMzoyMToyOC4wNDgxMDUwMDAgVVRD2SQ1ZjBhZmM1MC04YTcxLTQyMzUtYTE0Ny00ZmY4YmU5ZTM4Njg=", 15 | "repository": { 16 | "url": "git@github.com:huongtn/ECHTMen.git", 17 | "provider": { 18 | "name": "GitHub" 19 | } 20 | } 21 | } 22 | } 23 | ] 24 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/shortcut/members.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {ShortcutConverter} from './common'; 5 | import {Member} from './models'; 6 | export class Members extends ShortcutConverter { 7 | readonly destinationModels: ReadonlyArray = ['tms_User']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const user = record.record.data as Member; 15 | return [ 16 | { 17 | model: 'tms_User', 18 | record: { 19 | uid: String(user.id), 20 | name: user.profile.name, 21 | emailAddress: user.profile.email_address, 22 | source, 23 | }, 24 | }, 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sources/backlog-source/resources/schemas/users.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "type": "object", 4 | "properties": { 5 | "id": { 6 | "type": "number" 7 | }, 8 | "userId": { 9 | "type": "string" 10 | }, 11 | "name": { 12 | "type": "string" 13 | }, 14 | "roleType": { 15 | "type": "number" 16 | }, 17 | "lang": { 18 | "type": ["string","null"] 19 | }, 20 | "mailAddress": { 21 | "type": "string" 22 | }, 23 | "nulabAccount": { 24 | "type": ["object","null"], 25 | "properties": { 26 | "nulabId": { 27 | "type": ["string","null"] 28 | }, 29 | "name": { 30 | "type": ["string","null"] 31 | }, 32 | "uniqueId": { 33 | "type": ["string","null"] 34 | } 35 | } 36 | }, 37 | "keyword": { 38 | "type": "string" 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/bamboohr/models.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | id: string; 3 | employeeNumber: string; 4 | jobTitle: string; 5 | status: string; 6 | employmentHistoryStatus: string; 7 | fullName1: string; 8 | address1?: string; 9 | address2?: string; 10 | birthday?: string; 11 | bestEmail: string; 12 | workEmail: string; 13 | workPhone?: string; 14 | city?: string; 15 | state?: string; 16 | stateCode?: string; 17 | country?: string; 18 | department?: string; 19 | ethnicity?: string; 20 | firstName?: string; 21 | gender?: string; 22 | middleName?: string; 23 | mobilePhone?: string; 24 | zipcode?: string; 25 | supervisor?: string; 26 | // managerId 27 | supervisorId?: string; 28 | supervisorEId?: string; 29 | supervisorEmail?: string; 30 | payRate?: string; 31 | payFrequency?: string; 32 | hireDate?: string; 33 | terminationDate?: string; 34 | lastName?: string; 35 | } 36 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/squadcast/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {SquadcastConverter, User} from './common'; 5 | 6 | export class Users extends SquadcastConverter { 7 | readonly destinationModels: ReadonlyArray = ['ims_User']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const user = record.record.data as User; 15 | 16 | const username = `${user.first_name} ${user.last_name}`; 17 | 18 | return [ 19 | { 20 | model: 'ims_User', 21 | record: { 22 | uid: user.id, 23 | email: user.email, 24 | name: username, 25 | source, 26 | }, 27 | }, 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/jira/board_issues.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {JiraConverter} from './common'; 5 | 6 | export class BoardIssues extends JiraConverter { 7 | readonly destinationModels: ReadonlyArray = [ 8 | 'tms_TaskBoardRelationship', 9 | ]; 10 | 11 | async convert( 12 | record: AirbyteRecord, 13 | ctx: StreamContext 14 | ): Promise> { 15 | if (!this.useBoardOwnership(ctx)) return []; 16 | const issue = record.record.data; 17 | const source = this.streamName.source; 18 | return [ 19 | { 20 | model: 'tms_TaskBoardRelationship', 21 | record: { 22 | task: {uid: issue.key, source}, 23 | board: {uid: String(issue.boardId), source}, 24 | }, 25 | }, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/okta_faros/users.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {Users as OktaUsers} from '../okta/users'; 5 | import {OktaFarosConverter} from './common'; 6 | 7 | /** 8 | * This converter is identical to OktaUsers for Okta community source. 9 | * It is here to support the Okta source we developed at Faros. 10 | */ 11 | export class Users extends OktaFarosConverter { 12 | private alias = new OktaUsers(); 13 | 14 | readonly destinationModels: ReadonlyArray = 15 | this.alias.destinationModels; 16 | 17 | id(record: AirbyteRecord): any { 18 | return this.alias.id(record); 19 | } 20 | 21 | async convert( 22 | record: AirbyteRecord, 23 | ctx: StreamContext 24 | ): Promise> { 25 | return this.alias.convert(record, ctx); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sources/shortcut-source/test_files/members.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "role": "owner", 4 | "entity_type": "member", 5 | "disabled": false, 6 | "state": "full", 7 | "updated_at": "2021-12-07T14:09:40Z", 8 | "created_without_invite": false, 9 | "group_ids": [ 10 | "61af6b25-a7f5-46c4-8803-13ab5ff5cd32" 11 | ], 12 | "id": "61af6b25-0b86-4afa-adf1-c3ea4ba0982c", 13 | "profile": { 14 | "entity_type": "profile", 15 | "deactivated": false, 16 | "two_factor_auth_activated": false, 17 | "mention_name": "kelvintran", 18 | "name": "Kelvin Tran", 19 | "gravatar_hash": "f98c99e3cd53ece58face0377bc238f0", 20 | "id": "61af6b25-8f22-42d9-85ba-8d4220f86f97", 21 | "display_icon": null, 22 | "email_address": "huongkstn@gmail.com" 23 | }, 24 | "created_at": "2021-12-07T14:09:40Z" 25 | } 26 | ] -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/okta_faros/groups.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {Groups as OktaGroups} from '../okta/groups'; 5 | import {OktaFarosConverter} from './common'; 6 | 7 | /** 8 | * This converter is identical to OktaGroups for Okta community source. 9 | * It is here to support the Okta source we developed at Faros. 10 | */ 11 | export class Groups extends OktaFarosConverter { 12 | private alias = new OktaGroups(); 13 | 14 | readonly destinationModels: ReadonlyArray = 15 | this.alias.destinationModels; 16 | 17 | id(record: AirbyteRecord): any { 18 | return this.alias.id(record); 19 | } 20 | 21 | async convert( 22 | record: AirbyteRecord, 23 | ctx: StreamContext 24 | ): Promise> { 25 | return this.alias.convert(record, ctx); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/victorops/teams.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {VictorOpsConverter} from './common'; 5 | 6 | export class Teams extends VictorOpsConverter { 7 | readonly destinationModels: ReadonlyArray = ['ims_Team']; 8 | 9 | id(record: AirbyteRecord): any { 10 | return record?.record?.data?.slug; 11 | } 12 | 13 | async convert( 14 | record: AirbyteRecord, 15 | ctx: StreamContext 16 | ): Promise> { 17 | const source = this.streamName.source; 18 | const team = record.record.data; 19 | 20 | return [ 21 | { 22 | model: 'ims_Team', 23 | record: { 24 | uid: team.slug, 25 | name: team.name, 26 | url: team._selfUrl, 27 | source, 28 | }, 29 | }, 30 | ]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sources/backlog-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: backlog-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | issues: ["lastUpdatedAt"] 25 | -------------------------------------------------------------------------------- /sources/docker-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: docker-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | tags: [ "lastCreatedAt" ] 25 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: gitlab-ci-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | pipelines: [ "cutoff" ] 25 | -------------------------------------------------------------------------------- /sources/victorops-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: victorops-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | incidents: [ "cutoff" ] 25 | -------------------------------------------------------------------------------- /sources/buildkite-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: buildkite-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | builds: ["lastCreatedAt"] 25 | -------------------------------------------------------------------------------- /sources/circleci-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: circleci-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | pipelines: [ "lastUpdatedAt" ] 25 | -------------------------------------------------------------------------------- /sources/harness-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: harness-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | executions: [ "lastEndedAt" ] 25 | -------------------------------------------------------------------------------- /sources/shortcut-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: shortcut-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | iterations: ["lastUpdatedAt"] 25 | -------------------------------------------------------------------------------- /sources/agileaccelerator-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: agileaccelerator-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | works: [ "cutoff" ] 25 | -------------------------------------------------------------------------------- /sources/backlog-source/test_files/users.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 319076, 4 | "userId": "64kfUlnZKJ", 5 | "name": "Hướng Trần Ngọc", 6 | "roleType": 1, 7 | "lang": "en", 8 | "mailAddress": "huongkstn@gmail.com", 9 | "nulabAccount": { 10 | "nulabId": "vgoiBUrAEkKt99RytjfQb968FlrBblq9SBuxbdIC5Fdezsv5t3", 11 | "name": "Hướng Trần Ngọc", 12 | "uniqueId": "huongkstn" 13 | }, 14 | "keyword": "Hướng Trần Ngọc Hướng Trần Ngọc" 15 | }, 16 | { 17 | "id": 319270, 18 | "userId": "*EwHbgb48dL", 19 | "name": "yenhh8", 20 | "roleType": 2, 21 | "lang": null, 22 | "mailAddress": "yenhh8@gmail.com", 23 | "nulabAccount": { 24 | "nulabId": "xaQqGyCdHzChG15NfoXMH9cI1TDZfnLonhD2aIib8PiKBuLAvB", 25 | "name": null, 26 | "uniqueId": null 27 | }, 28 | "keyword": "yenhh8 yenhh8" 29 | } 30 | ] 31 | -------------------------------------------------------------------------------- /sources/firehydrant-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: firehydrant-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | incidents: ["lastCreatedAt"] 25 | -------------------------------------------------------------------------------- /sources/squadcast-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: squadcast-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | incidents: [ "lastUpdatedAt" ] 25 | -------------------------------------------------------------------------------- /sources/example-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: example-source 2 | tests: 3 | spec: 4 | - config_path: "test_files/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "test_files/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "test_files/config.json" 13 | basic_read: 14 | - config_path: "test_files/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "test_files/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "test_files/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | builds: [ "cutoff" ] 25 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/github/projects.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {GitHubCommon, GitHubConverter} from './common'; 5 | 6 | export class Projects extends GitHubConverter { 7 | readonly destinationModels: ReadonlyArray = [ 8 | 'tms_Project', 9 | 'tms_TaskBoard', 10 | 'tms_TaskBoardProjectRelationship', 11 | ]; 12 | 13 | async convert( 14 | record: AirbyteRecord, 15 | ctx: StreamContext 16 | ): Promise> { 17 | const source = this.streamName.source; 18 | const project = record.record.data; 19 | 20 | const res = GitHubCommon.tms_ProjectBoard_with_TaskBoard( 21 | {uid: `${project.id}`, source}, 22 | project.name, 23 | project.body, 24 | project.created_at, 25 | project.updated_at 26 | ); 27 | 28 | return res; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /sources/azureactivedirectory-source/test_files/full_configured_catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "users", 6 | "json_schema": {}, 7 | "supported_sync_modes": [ 8 | "full_refresh" 9 | ], 10 | "source_defined_cursor": true, 11 | "source_defined_primary_key": [ 12 | [ 13 | "uid" 14 | ] 15 | ] 16 | }, 17 | "sync_mode": "full_refresh", 18 | "destination_sync_mode": "overwrite" 19 | }, 20 | { 21 | "stream": { 22 | "name": "groups", 23 | "json_schema": {}, 24 | "supported_sync_modes": [ 25 | "full_refresh" 26 | ], 27 | "source_defined_cursor": true, 28 | "source_defined_primary_key": [ 29 | [ 30 | "uid" 31 | ] 32 | ] 33 | }, 34 | "sync_mode": "full_refresh", 35 | "destination_sync_mode": "overwrite" 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /sources/phabricator-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: phabricator-source 2 | tests: 3 | spec: 4 | - config_path: "test_files/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "test_files/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "test_files/config.json" 13 | basic_read: 14 | - config_path: "test_files/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "test_files/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "test_files/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | builds: [ "cutoff" ] 25 | -------------------------------------------------------------------------------- /sources/shortcut-source/src/streams/members.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {Member, Shortcut, ShortcutConfig} from '../shortcut'; 10 | export class Members extends AirbyteStreamBase { 11 | constructor( 12 | private readonly config: ShortcutConfig, 13 | protected readonly logger: AirbyteLogger 14 | ) { 15 | super(logger); 16 | } 17 | getJsonSchema(): Dictionary { 18 | return require('../../resources/schemas/members.json'); 19 | } 20 | get primaryKey(): StreamKey { 21 | return ['id']; 22 | } 23 | async *readRecords( 24 | syncMode: SyncMode, 25 | cursorField?: string[], 26 | streamSlice?: Dictionary, 27 | streamState?: Dictionary 28 | ): AsyncGenerator { 29 | const shortcut = await Shortcut.instance(this.config); 30 | yield* shortcut.getMembers(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sources/shortcut-source/src/streams/projects.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {Project, Shortcut, ShortcutConfig} from '../shortcut'; 10 | export class Projects extends AirbyteStreamBase { 11 | constructor( 12 | private readonly config: ShortcutConfig, 13 | protected readonly logger: AirbyteLogger 14 | ) { 15 | super(logger); 16 | } 17 | getJsonSchema(): Dictionary { 18 | return require('../../resources/schemas/projects.json'); 19 | } 20 | get primaryKey(): StreamKey { 21 | return ['id']; 22 | } 23 | async *readRecords( 24 | syncMode: SyncMode, 25 | cursorField?: string[], 26 | streamSlice?: Dictionary, 27 | streamState?: Dictionary 28 | ): AsyncGenerator { 29 | const shortcut = await Shortcut.instance(this.config); 30 | yield* shortcut.getProjects(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /sources/bamboohr-source/src/streams/users.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {BambooHR, BambooHRConfig} from '../bamboohr'; 10 | import {User} from '../models'; 11 | 12 | export class Users extends AirbyteStreamBase { 13 | constructor( 14 | private readonly config: BambooHRConfig, 15 | protected readonly logger: AirbyteLogger 16 | ) { 17 | super(logger); 18 | } 19 | 20 | getJsonSchema(): Dictionary { 21 | return require('../../resources/schemas/users.json'); 22 | } 23 | get primaryKey(): StreamKey { 24 | return 'id'; 25 | } 26 | 27 | async *readRecords( 28 | syncMode: SyncMode, 29 | cursorField?: string[], 30 | streamSlice?: Dictionary 31 | ): AsyncGenerator { 32 | const bambooHR = await BambooHR.instance(this.config, this.logger); 33 | yield* bambooHR.getUsers(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /sources/bitbucket-source/resources/schemas/workspaces.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema", 3 | "type": "object", 4 | "properties": { 5 | "uuid": { 6 | "type": "string", 7 | "format": "uuid" 8 | }, 9 | "links": { 10 | "type": "object", 11 | "properties": { 12 | "ownersUrl": { 13 | "type": "string", 14 | "format": "uri" 15 | }, 16 | "repositoriesUrl": { 17 | "type": "string", 18 | "format": "uri" 19 | }, 20 | "htmlUrl": { 21 | "type": "string", 22 | "format": "uri" 23 | } 24 | } 25 | }, 26 | "createdOn": { 27 | "type": "string", 28 | "format": "date-time" 29 | }, 30 | "type": { 31 | "type": "string" 32 | }, 33 | "slug": { 34 | "type": "string" 35 | }, 36 | "isPrivate": { 37 | "type": "boolean" 38 | }, 39 | "name": { 40 | "type": "string" 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /sources/jenkins-source/test_files/jobs.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "_class": "hudson.model.FreeStyleProject", 4 | "fullName": "Faros-test-job", 5 | "name": "Faros-test-job", 6 | "url": "http://localhost:8080/job/Faros-test-job", 7 | "allBuilds": [ 8 | { 9 | "building": false, 10 | "id": "3", 11 | "number": 3, 12 | "url": "http://localhost:8080/job/Faros-test-job/3", 13 | "fullDisplayName": "Faros-test-job #3" 14 | }, 15 | { 16 | "building": false, 17 | "id": "2", 18 | "number": 2, 19 | "url": "http://localhost:8080/job/Faros-test-job/2", 20 | "fullDisplayName": "Faros-test-job #2" 21 | }, 22 | { 23 | "building": false, 24 | "id": "1", 25 | "number": 1, 26 | "url": "http://localhost:8080/job/Faros-test-job/1", 27 | "fullDisplayName": "Faros-test-job #1" 28 | } 29 | ], 30 | "lastCompletedBuild": { 31 | "number": 3 32 | } 33 | } 34 | ] 35 | -------------------------------------------------------------------------------- /sources/shortcut-source/src/streams/stories.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {ExtendStory, Shortcut, ShortcutConfig} from '../shortcut'; 10 | 11 | export class Stories extends AirbyteStreamBase { 12 | constructor( 13 | private readonly config: ShortcutConfig, 14 | protected readonly logger: AirbyteLogger 15 | ) { 16 | super(logger); 17 | } 18 | getJsonSchema(): Dictionary { 19 | return require('../../resources/schemas/stories.json'); 20 | } 21 | get primaryKey(): StreamKey { 22 | return ['id']; 23 | } 24 | async *readRecords( 25 | syncMode: SyncMode, 26 | cursorField?: string[], 27 | streamSlice?: Dictionary, 28 | streamState?: Dictionary 29 | ): AsyncGenerator { 30 | const shortcut = await Shortcut.instance(this.config); 31 | yield* shortcut.getStories(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /sources/azure-repos-source/src/streams/users.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {AzureRepo, AzureRepoConfig} from '../azure-repos'; 10 | import {User} from '../models'; 11 | 12 | export class Users extends AirbyteStreamBase { 13 | constructor( 14 | private readonly config: AzureRepoConfig, 15 | protected readonly logger: AirbyteLogger 16 | ) { 17 | super(logger); 18 | } 19 | 20 | getJsonSchema(): Dictionary { 21 | return require('../../resources/schemas/users.json'); 22 | } 23 | get primaryKey(): StreamKey { 24 | return 'principalName'; 25 | } 26 | 27 | async *readRecords( 28 | syncMode: SyncMode, 29 | cursorField?: string[], 30 | streamSlice?: Dictionary 31 | ): AsyncGenerator { 32 | const azureRepo = await AzureRepo.instance(this.config); 33 | yield* azureRepo.getUsers(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /sources/backlog-source/src/streams/users.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {Backlog, BacklogConfig} from '../backlog'; 10 | import {User} from '../models'; 11 | 12 | export class Users extends AirbyteStreamBase { 13 | constructor( 14 | private readonly config: BacklogConfig, 15 | protected readonly logger: AirbyteLogger 16 | ) { 17 | super(logger); 18 | } 19 | 20 | getJsonSchema(): Dictionary { 21 | return require('../../resources/schemas/users.json'); 22 | } 23 | 24 | get primaryKey(): StreamKey { 25 | return 'id'; 26 | } 27 | 28 | async *readRecords( 29 | syncMode: SyncMode, 30 | cursorField?: string[], 31 | streamSlice?: Dictionary 32 | ): AsyncGenerator { 33 | const backlog = await Backlog.instance(this.config, this.logger); 34 | yield* backlog.getUsers(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /sources/pagerduty-source/src/streams/prioritiesResource.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {Pagerduty, PagerdutyConfig, Priority} from '../pagerduty'; 10 | 11 | export class PrioritiesResource extends AirbyteStreamBase { 12 | constructor(readonly config: PagerdutyConfig, logger: AirbyteLogger) { 13 | super(logger); 14 | } 15 | 16 | getJsonSchema(): Dictionary { 17 | return require('../../resources/schemas/prioritiesResource.json'); 18 | } 19 | get primaryKey(): StreamKey { 20 | return 'id'; 21 | } 22 | 23 | async *readRecords( 24 | syncMode: SyncMode, 25 | cursorField?: string[], 26 | streamSlice?: Priority, 27 | streamState?: Dictionary 28 | ): AsyncGenerator { 29 | const pagerduty = Pagerduty.instance(this.config, this.logger); 30 | 31 | yield* pagerduty.getPrioritiesResource(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/buildkite/organizations.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {BuildkiteConverter, Organization} from './common'; 5 | 6 | export class Organizations extends BuildkiteConverter { 7 | readonly destinationModels: ReadonlyArray = [ 8 | 'cicd_Organization', 9 | ]; 10 | 11 | async convert( 12 | record: AirbyteRecord, 13 | ctx: StreamContext 14 | ): Promise> { 15 | const source = this.streamName.source; 16 | const organization = record.record.data as Organization; 17 | return [ 18 | { 19 | model: 'cicd_Organization', 20 | record: { 21 | uid: organization.slug, 22 | name: organization.name, 23 | slug: organization.slug, 24 | url: organization.web_url, 25 | source, 26 | }, 27 | }, 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/test/resources/asana/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "streams": [ 3 | { 4 | "stream": { 5 | "name": "mytestsource__asana__users" 6 | }, 7 | "destination_sync_mode": "append" 8 | }, 9 | { 10 | "stream": { 11 | "name": "mytestsource__asana__projects" 12 | }, 13 | "destination_sync_mode": "append" 14 | }, 15 | { 16 | "stream": { 17 | "name": "mytestsource__asana__sections" 18 | }, 19 | "destination_sync_mode": "append" 20 | }, 21 | { 22 | "stream": { 23 | "name": "mytestsource__asana__tasks" 24 | }, 25 | "destination_sync_mode": "append" 26 | }, 27 | { 28 | "stream": { 29 | "name": "mytestsource__asana__stories" 30 | }, 31 | "destination_sync_mode": "append" 32 | }, 33 | { 34 | "stream": { 35 | "name": "mytestsource__asana__something_else" 36 | }, 37 | "destination_sync_mode": "append" 38 | } 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /sources/statuspage-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: statuspage-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | incidents: [ "cutoff" ] 25 | incident_updates: [ "cutoff" ] 26 | -------------------------------------------------------------------------------- /sources/azurepipeline-source/acceptance-test-config.yml: -------------------------------------------------------------------------------- 1 | connector_image: azurepipeline-source 2 | tests: 3 | spec: 4 | - config_path: "secrets/config.json" 5 | spec_path: "resources/spec.json" 6 | connection: 7 | - config_path: "secrets/config.json" 8 | status: "succeed" 9 | - config_path: "test_files/invalid_config.json" 10 | status: "failed" 11 | discovery: 12 | - config_path: "secrets/config.json" 13 | basic_read: 14 | - config_path: "secrets/config.json" 15 | configured_catalog_path: "test_files/full_configured_catalog.json" 16 | full_refresh: 17 | - config_path: "secrets/config.json" 18 | configured_catalog_path: "test_files/full_configured_catalog.json" 19 | incremental: 20 | - config_path: "secrets/config.json" 21 | configured_catalog_path: "test_files/incremental_configured_catalog.json" 22 | future_state_path: "test_files/abnormal_state.json" 23 | cursor_paths: 24 | builds: ["lastQueueTime"] 25 | releases: ["lastCreatedOn"] 26 | -------------------------------------------------------------------------------- /sources/gitlab-ci-source/src/streams/groups.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteStreamBase, StreamKey, SyncMode} from 'faros-airbyte-cdk'; 2 | import {AirbyteLogger} from 'faros-airbyte-cdk/lib'; 3 | import {Dictionary} from 'ts-essentials'; 4 | 5 | import {Gitlab, GitlabConfig, Group} from '../gitlab'; 6 | 7 | export class Groups extends AirbyteStreamBase { 8 | constructor(readonly config: GitlabConfig, readonly logger: AirbyteLogger) { 9 | super(logger); 10 | } 11 | 12 | getJsonSchema(): Dictionary { 13 | return require('../../resources/schemas/groups.json'); 14 | } 15 | 16 | get primaryKey(): StreamKey { 17 | return 'id'; 18 | } 19 | 20 | async *readRecords( 21 | syncMode: SyncMode, 22 | cursorField?: string[], 23 | streamSlice?: Dictionary, 24 | streamState?: Dictionary 25 | ): AsyncGenerator { 26 | const gitlab = Gitlab.instance(this.config, this.logger); 27 | 28 | yield* gitlab.getGroups(this.config.groupName, this.config.projects); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /sources/shortcut-source/src/streams/epics.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {Epic, Shortcut, ShortcutConfig} from '../shortcut'; 10 | 11 | export class Epics extends AirbyteStreamBase { 12 | constructor( 13 | private readonly config: ShortcutConfig, 14 | protected readonly logger: AirbyteLogger, 15 | protected readonly projectId?: number 16 | ) { 17 | super(logger); 18 | } 19 | 20 | getJsonSchema(): Dictionary { 21 | return require('../../resources/schemas/epics.json'); 22 | } 23 | 24 | get primaryKey(): StreamKey { 25 | return ['id']; 26 | } 27 | 28 | async *readRecords( 29 | syncMode: SyncMode, 30 | cursorField?: string[], 31 | streamState?: Dictionary 32 | ): AsyncGenerator { 33 | const shortcut = await Shortcut.instance(this.config); 34 | yield* shortcut.getEpics(this.projectId); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /sources/victorops-source/test_files/teams.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "_selfUrl": "/api-public/v1/team/team-Z3scfG2gh0qF3QsL", 4 | "_membersUrl": "/api-public/v1/team/team-Z3scfG2gh0qF3QsL/members", 5 | "_policiesUrl": "/api-public/v1/team/team-Z3scfG2gh0qF3QsL/policies", 6 | "_adminsUrl": "/api-public/v1/team/team-Z3scfG2gh0qF3QsL/admins", 7 | "name": "Example", 8 | "slug": "team-Z3scfG2gh0qF3QsL", 9 | "memberCount": 1, 10 | "version": 1, 11 | "isDefaultTeam": false, 12 | "description": "Example team." 13 | }, 14 | { 15 | "_selfUrl": "/api-public/v1/team/team-JsxJ4dtL2oX4SkEx", 16 | "_membersUrl": "/api-public/v1/team/team-JsxJ4dtL2oX4SkEx/members", 17 | "_policiesUrl": "/api-public/v1/team/team-JsxJ4dtL2oX4SkEx/policies", 18 | "_adminsUrl": "/api-public/v1/team/team-JsxJ4dtL2oX4SkEx/admins", 19 | "name": "Faros", 20 | "slug": "team-JsxJ4dtL2oX4SkEx", 21 | "memberCount": 1, 22 | "version": 1, 23 | "isDefaultTeam": false, 24 | "description": "team" 25 | } 26 | ] 27 | -------------------------------------------------------------------------------- /sources/buildkite-source/src/streams/pipelines.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AirbyteLogger, 3 | AirbyteStreamBase, 4 | StreamKey, 5 | SyncMode, 6 | } from 'faros-airbyte-cdk'; 7 | import {Dictionary} from 'ts-essentials'; 8 | 9 | import {Buildkite, BuildkiteConfig, Pipeline} from '../buildkite/buildkite'; 10 | export class Pipelines extends AirbyteStreamBase { 11 | constructor( 12 | private readonly config: BuildkiteConfig, 13 | protected readonly logger: AirbyteLogger 14 | ) { 15 | super(logger); 16 | } 17 | 18 | getJsonSchema(): Dictionary { 19 | return require('../../resources/schemas/pipelines.json'); 20 | } 21 | get primaryKey(): StreamKey { 22 | return 'id'; 23 | } 24 | async *readRecords( 25 | syncMode: SyncMode, 26 | cursorField?: string[], 27 | streamSlice?: Dictionary, 28 | streamState?: Dictionary 29 | ): AsyncGenerator { 30 | const buildkite = Buildkite.instance(this.config, this.logger); 31 | yield* buildkite.getPipelines(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /destinations/airbyte-faros-destination/src/converters/github/branches.ts: -------------------------------------------------------------------------------- 1 | import {AirbyteRecord} from 'faros-airbyte-cdk'; 2 | 3 | import {DestinationModel, DestinationRecord, StreamContext} from '../converter'; 4 | import {GitHubCommon, GitHubConverter} from './common'; 5 | 6 | export class Branches extends GitHubConverter { 7 | readonly destinationModels: ReadonlyArray = ['vcs_Branch']; 8 | 9 | async convert( 10 | record: AirbyteRecord, 11 | ctx: StreamContext 12 | ): Promise> { 13 | const source = this.streamName.source; 14 | const branch = record.record.data; 15 | 16 | const repository = GitHubCommon.parseRepositoryKey( 17 | branch.repository, 18 | source 19 | ); 20 | 21 | if (!repository) return []; 22 | 23 | return [ 24 | { 25 | model: 'vcs_Branch', 26 | record: { 27 | name: branch.name, 28 | uid: branch.name, 29 | repository, 30 | }, 31 | }, 32 | ]; 33 | } 34 | } 35 | --------------------------------------------------------------------------------