@lifeomic/bitrise
Advanced tools
Comparing version 0.6.0 to 0.7.0
@@ -21,4 +21,36 @@ import { AxiosInstance } from 'axios'; | ||
triggerBuild(buildParams?: BuildOptions): Promise<Build>; | ||
/** | ||
* @see https://api-docs.bitrise.io/#/builds/build-list | ||
* | ||
* @param listParams Parameters for the builds to list. | ||
*/ | ||
listBuilds(listParams?: ListBuildOptions): Promise<BuildList>; | ||
} | ||
declare interface ListBuildOptions { | ||
readonly sort_by?: string; | ||
readonly branch?: string; | ||
readonly workflow?: string; | ||
readonly commit_message?: string; | ||
readonly trigger_event_type?: string; | ||
readonly pull_request_id?: number; | ||
readonly build_number?: number; | ||
readonly after?: number; | ||
readonly before?: number; | ||
readonly status?: number; | ||
readonly next?: string; | ||
readonly limit?: number; | ||
} | ||
declare interface BuildList { | ||
readonly builds: Build[]; | ||
readonly paging: PageInfo; | ||
} | ||
declare interface PageInfo { | ||
readonly next?: string; | ||
readonly total_item_count: number; | ||
} | ||
declare interface AbortOptions { | ||
@@ -72,2 +104,9 @@ readonly reason?: string; | ||
/** | ||
* @see https://api-docs.bitrise.io/#/build-artifact/artifact-list | ||
* | ||
* @param listParams Parameters for the artifacts to list. | ||
*/ | ||
listArtifacts(listParams?: ListArtifactsOptions): Promise<ArtifactList>; | ||
follow(options?: FollowOptions): Promise<void>; | ||
@@ -78,2 +117,27 @@ | ||
declare interface ArtifactDescription { | ||
readonly artifact_meta: object | ||
readonly artifact_type: string | ||
readonly expiring_download_url: string | ||
readonly file_size_bytes: number | ||
readonly is_public_page_enabled: boolean | ||
readonly public_install_page_url: string | ||
readonly slug: string | ||
readonly title: string | ||
} | ||
declare interface Artifact { | ||
describe(): Promise<ArtifactDescription>; | ||
} | ||
declare interface ListArtifactsOptions { | ||
readonly next?: string; | ||
readonly limit?: number; | ||
} | ||
declare interface ArtifactList { | ||
readonly artifacts: Artifact[]; | ||
readonly paging: PageInfo; | ||
} | ||
declare interface CommitPathsFilter { | ||
@@ -80,0 +144,0 @@ readonly added?: string[]; |
{ | ||
"name": "@lifeomic/bitrise", | ||
"version": "0.6.0", | ||
"version": "0.7.0", | ||
"description": "Bitrise API client", | ||
@@ -26,3 +26,4 @@ "main": "src/client.js", | ||
"axios-retry": "^3.1.1", | ||
"lodash": "^4.17.10" | ||
"lodash": "^4.17.10", | ||
"query-string": "^6.8.3" | ||
}, | ||
@@ -29,0 +30,0 @@ "devDependencies": { |
@@ -6,2 +6,3 @@ const build = require('./build'); | ||
const project = require('../package.json'); | ||
const queryString = require('query-string'); | ||
@@ -69,6 +70,23 @@ const buildEnvironment = (environment) => { | ||
const listBuilds = async ({ client, slug }, options = {}) => { | ||
const query = queryString.stringify(options); | ||
const queryPart = query ? `?${query}` : ''; | ||
const response = await client.get(`/apps/${slug}/builds${queryPart}`); | ||
const builds = response.data.data.map((buildInfo) => { | ||
return build({ appSlug: slug, client, buildSlug: buildInfo.slug }); | ||
}); | ||
return { | ||
builds, | ||
paging: response.data.paging | ||
}; | ||
}; | ||
module.exports = ({ client, slug }) => { | ||
const app = { slug }; | ||
app.triggerBuild = triggerBuild.bind(app, { client, slug }); | ||
app.listBuilds = listBuilds.bind(app, { client, slug }); | ||
return app; | ||
}; |
const isNil = require('lodash/isNil'); | ||
const negate = require('lodash/negate'); | ||
const pickBy = require('lodash/pickBy'); | ||
const queryString = require('query-string'); | ||
const artifact = require('./artifact'); | ||
@@ -72,2 +74,18 @@ const abortBuild = async ({ appSlug, buildSlug, client }, options = {}) => { | ||
const listArtifacts = async ({ appSlug, buildSlug, client }, options = {}) => { | ||
const query = queryString.stringify(options); | ||
const queryPart = query ? `?${query}` : ''; | ||
const response = await client.get(`/apps/${appSlug}/builds/${buildSlug}/artifacts${queryPart}`); | ||
const artifacts = response.data.data.map((artifactDescription) => { | ||
const artifactSlug = artifactDescription.slug; | ||
return artifact({ appSlug, buildSlug, client, artifactSlug }); | ||
}); | ||
return { | ||
artifacts, | ||
paging: response.data.paging | ||
}; | ||
}; | ||
const isFinished = async ({ appSlug, buildSlug, client }) => { | ||
@@ -86,2 +104,3 @@ const attributes = await describeBuild({ appSlug, buildSlug, client }); | ||
build.describe = describeBuild.bind(build, state); | ||
build.listArtifacts = listArtifacts.bind(build, state); | ||
build.follow = followBuild.bind(build, state); | ||
@@ -88,0 +107,0 @@ build.isFinished = isFinished.bind(build, state); |
@@ -7,3 +7,3 @@ const app = require('../src/app'); | ||
const { stubTriggerBuild } = require('./stubs'); | ||
const { stubTriggerBuild, stubListBuilds } = require('./stubs'); | ||
@@ -284,1 +284,26 @@ test.beforeEach((test) => { | ||
}); | ||
test('an app can list builds', async (test) => { | ||
const { app, client, slug } = test.context; | ||
const stub = stubListBuilds({ appSlug: slug, axios: client }); | ||
const buildList = await app.listBuilds(); | ||
test.is(buildList.builds.length, 2); | ||
test.is(buildList.builds[0].appSlug, slug); | ||
test.is(buildList.builds[0].buildSlug, stub.builds[0].build_slug); | ||
test.is(buildList.builds[1].appSlug, slug); | ||
test.is(buildList.builds[1].buildSlug, stub.builds[1].build_slug); | ||
}); | ||
test('an app can list a second page of builds', async (test) => { | ||
const { app, client, slug } = test.context; | ||
const next = uuid(); | ||
const stub = stubListBuilds({ appSlug: slug, axios: client, next }); | ||
const buildList = await app.listBuilds({ next }); | ||
test.is(buildList.builds.length, 2); | ||
test.is(buildList.builds[0].appSlug, slug); | ||
test.is(buildList.builds[0].buildSlug, stub.builds[0].build_slug); | ||
test.is(buildList.builds[1].appSlug, slug); | ||
test.is(buildList.builds[1].buildSlug, stub.builds[1].build_slug); | ||
}); |
@@ -8,3 +8,3 @@ const axios = require('axios'); | ||
const { DateTime } = require('luxon'); | ||
const { stubAbortBuild, stubArchivedBuildLog, stubBuildLogStream, stubGetBuild } = require('./stubs'); | ||
const { stubAbortBuild, stubArchivedBuildLog, stubBuildLogStream, stubGetBuild, stubListArtifacts } = require('./stubs'); | ||
@@ -242,1 +242,30 @@ test.beforeEach((test) => { | ||
}); | ||
test('an build can list artifacts', async (test) => { | ||
const { build, client, appSlug, buildSlug } = test.context; | ||
const stub = stubListArtifacts({ appSlug, buildSlug, axios: client }); | ||
const artifactList = await build.listArtifacts(); | ||
test.is(artifactList.artifacts.length, 2); | ||
test.is(artifactList.artifacts[0].appSlug, appSlug); | ||
test.is(artifactList.artifacts[0].buildSlug, buildSlug); | ||
test.is(artifactList.artifacts[0].artifactSlug, stub.artifacts[0].slug); | ||
test.is(artifactList.artifacts[1].appSlug, appSlug); | ||
test.is(artifactList.artifacts[1].buildSlug, buildSlug); | ||
test.is(artifactList.artifacts[1].artifactSlug, stub.artifacts[1].slug); | ||
}); | ||
test('a build can list a second page of artifacts', async (test) => { | ||
const { build, client, appSlug, buildSlug } = test.context; | ||
const next = uuid(); | ||
const stub = stubListArtifacts({ appSlug, buildSlug, axios: client, next }); | ||
const artifactList = await build.listArtifacts({ next }); | ||
test.is(artifactList.artifacts.length, 2); | ||
test.is(artifactList.artifacts[0].appSlug, appSlug); | ||
test.is(artifactList.artifacts[0].buildSlug, buildSlug); | ||
test.is(artifactList.artifacts[0].artifactSlug, stub.artifacts[0].slug); | ||
test.is(artifactList.artifacts[1].appSlug, appSlug); | ||
test.is(artifactList.artifacts[1].buildSlug, buildSlug); | ||
test.is(artifactList.artifacts[1].artifactSlug, stub.artifacts[1].slug); | ||
}); |
@@ -21,2 +21,13 @@ const get = require('lodash/get'); | ||
const generateArtifact = (options = {}) => ({ | ||
artifact_meta: {}, | ||
artifact_type: 'android-apk', | ||
expiring_download_url: `https://example.com/downloads/${uuid()}`, | ||
file_size_bytes: 100, | ||
is_public_page_enabled: true, | ||
public_install_page_url: `https://example.com/install/${uuid()}`, | ||
slug: options.artifactSlug, | ||
title: `Artifact ${uuid()}` | ||
}); | ||
const unmatchedRequest = async (...args) => { | ||
@@ -102,2 +113,16 @@ throw new Error( | ||
exports.stubGetArtifact = ({ appSlug, axios, buildSlug, artifactSlug }) => { | ||
const artifact = generateArtifact({ appSlug, buildSlug, artifactSlug }); | ||
const stub = getStub(axios, 'get') | ||
.withArgs(`/apps/${appSlug}/builds/${buildSlug}/artifacts/${artifactSlug}`) | ||
.resolves({ | ||
data: { data: artifact }, | ||
status: 200 | ||
}); | ||
stub.artifact = artifact; | ||
return stub; | ||
}; | ||
exports.stubTriggerBuild = ({ appSlug, axios, body }) => { | ||
@@ -119,1 +144,61 @@ const build = generateBuild(); | ||
}; | ||
exports.stubListBuilds = ({ appSlug, axios, next }) => { | ||
const build1 = generateBuild(); | ||
const build2 = generateBuild(); | ||
const urlParts = [`/apps/${appSlug}/builds`]; | ||
if (next) { | ||
urlParts.push(`?next=${next}`); | ||
} | ||
const url = urlParts.join(''); | ||
const stub = getStub(axios, 'get') | ||
.withArgs(url) | ||
.resolves({ | ||
data: { | ||
data: [ | ||
{ slug: build1.build_slug }, | ||
{ slug: build2.build_slug } | ||
], | ||
paging: { | ||
page_item_limit: 2, | ||
total_item_count: 2 | ||
} | ||
}, | ||
status: 200 | ||
}); | ||
stub.builds = [build1, build2]; | ||
return stub; | ||
}; | ||
exports.stubListArtifacts = ({ appSlug, buildSlug, axios, next }) => { | ||
const artifact1 = generateArtifact(); | ||
const artifact2 = generateArtifact(); | ||
const urlParts = [`/apps/${appSlug}/builds/${buildSlug}/artifacts`]; | ||
if (next) { | ||
urlParts.push(`?next=${next}`); | ||
} | ||
const url = urlParts.join(''); | ||
const stub = getStub(axios, 'get') | ||
.withArgs(url) | ||
.resolves({ | ||
data: { | ||
data: [ | ||
{ slug: artifact1.slug }, | ||
{ slug: artifact2.slug } | ||
], | ||
paging: { | ||
page_item_limit: 2, | ||
total_item_count: 2 | ||
} | ||
}, | ||
status: 200 | ||
}); | ||
stub.artifacts = [artifact1, artifact2]; | ||
return stub; | ||
}; |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
256282
17
1119
4
+ Addedquery-string@^6.8.3
+ Addeddecode-uri-component@0.2.2(transitive)
+ Addedfilter-obj@1.1.0(transitive)
+ Addedquery-string@6.14.1(transitive)
+ Addedsplit-on-first@1.1.0(transitive)
+ Addedstrict-uri-encode@2.0.0(transitive)