Skip to content

Commit 42f7147

Browse files
whitelisabelylucasethan-ozelius-contentfultylerpinamichaelphamcf
authored
feat: add support for releases [DX-374] (#2757)
* feat: add releaseSchema defaults to plain client creation [DX-184] (#2664) * feat: add releaseSchema defaults to plain client creation * fix: rename releaseSchema to releaseSchemaVersion * fix: forgot to fix test * feat(default): release-id (#2666) * feat: add support for releaseSchemaVersion in create/query methods [DX-187] (#2665) * feat: add releaseSchema defaults to plain client creation * fix: rename releaseSchema to releaseSchemaVersion * fix: forgot to fix test * feat: add support for releaseSchemaVersion in create/query methods * chore: lint fixes * feat: add support for release.entry.* pattern * chore: lint fixes * chore: fix test description * feat: add support for release.entry.* pattern [DX-192] (#2667) * feat: add releaseSchema defaults to plain client creation * fix: rename releaseSchema to releaseSchemaVersion * fix: forgot to fix test * feat: add support for releaseSchemaVersion in create/query methods * chore: lint fixes * feat: add support for release.entry.* pattern * chore: lint fix * chore: removing duplicate type * feat: release/update endpoint reflects schemaVersion param [DX-188] (#2668) * feat: add releaseSchema defaults to plain client creation * fix: rename releaseSchema to releaseSchemaVersion * fix: forgot to fix test * feat: add support for releaseSchemaVersion in create/query methods * chore: lint fixes * feat: add support for release.entry.* pattern * chore: lint fixes * feat: add forTemplatedSpaces field for env template creation [DX-173] (#2663) * chore: GetReleaseParams now extends GetReleaseEnvironmentParams * feat: release/update enpoint updated to reflect Release.v2 * chore: removed unnecessary error handling from update endpoint * chore: default integration test implemented * chore: withoutDefault integration test implemented * feat: all integrations tests passing * fix: test:integration-watch action in package.json reverted to default * fix: lint error resolved * fix: prettier passing --------- Co-authored-by: Ely Lucas <[email protected]> Co-authored-by: Lisa White <[email protected]> * Dx 194 Add unit tests for release.entry.get (#2674) * add unit tests and mock for ReleaseEntry * update test to use it.each * Remove wrapper tests; move Rest endpoint tests to proper directory * fix: lint prettier * feat(releases): release.entry.getMany() (#2673) * DX-202 Update entry.get to pass in releaseId (#2679) * feat: entry.get takes releaseId from params to retrieve release entry * add tests * chore:prettier * chore:prettier again * chore: move entry w/ releaseId tests to existing entry integration tests file * chore: cleanup comment, remove QueryParam that was added unnecessarily * chore: cleanup code * feat: update entry.getMany to include releasev2 params [DX-203] (#2685) * chore: getMany first attempt * chore: new integrations test file added (from Michael) * chore: type fixes implemented * chore: test shell added to entry-integration.test.ts * chore: tests implemented with necessary unimplemented release metadata tests commented out * chore: prettier fix * fix: entry integration scope removed from test script * chore: prettier fix * fix: version logic cleaned up and test query modified * chore: prettier fix * feat: add release.entry.update method [DX-206] (#2692) * feat: add release.entry.update method * feat: add entry.release.patch method (#2695) * fix: delete entry2 as part of entry integration test cleanup [DX-258] (#2700) * chore: add canary build to release/releasev2 branch [DX-212] (#2696) * chore: add canary build to release/releasev2 branch * chore: update readme with info on current experimental features * chore: creating canary branch for canary prerelease builds * chore: add canary branch to release process in ci config * feat: add release.entry.createWithId method [DX-61] (#2724) * feat: add release.entry.createWithId method [DX-61] * fix: update types for release entry params * test: debug integration tests * test: update unit tests and remove changes to integration tests * feat: entry.patch handle releaseId [DX-209] (#2725) * feat: entry.patch w/ releaseId alias for release.entry.patch * chore: add unit tests * chore: run prettier * chore: add integration tests for entry.patch with releaseId * chore: run lint * chore: cleanup code * chore: more cleanup * chore(test): remove redundant assertion * chore: cleanup params, console logs * chore: handle undefined headers for typescript * chore: use typecasting to pass param * feat: update entry.createWithId to accept releaseId [DX-208] (#2727) * feat: entry.update supports releaseId [DX-210] (#2728) * feat: entry.update supports releaseId * chore: add unit tests for entry.update * chore: use typecasting to pass param * test: add integration tests for entry.update * chore: keep QueryParams consistent between entry.update and release.entry.update * feat: add release.entry.create method (#2730) * feat: entry.create supports releaseId [DX-207] (#2732) * feat: add releaseId support to entry.create * chore: add QueryParams to be consistent with release.entry.create * fix: remove startDate from releasev2 payload [DX-380] (#2739) * feat: remove release[lte] endpoint [TOL-3408] (#2747) * feat: remove release[lte] endpoint * fix: delete more old tests, fix return types * fix(types): add release to entitymetasysprops [] (#2749) * feat: add support for release asset endpoints [TOL-3357] (#2750) * fix(types): add release to entitymetasysprops [] * feat(release-assets): add support for assets inside of a release [TOL-3357] * fix(types): export ReleasePaylodV2 [] (#2754) * fix: update types, add tests, and cleanup [DX-397] (#2755) * chore: update experimental features in readme --------- Co-authored-by: Ely Lucas <[email protected]> Co-authored-by: ethan ozelius <[email protected]> Co-authored-by: Tyler Pina <[email protected]> Co-authored-by: Michael Pham <[email protected]> Co-authored-by: MayaGillilan <[email protected]> Co-authored-by: Chris Helgert <[email protected]>
1 parent 1eb0ae7 commit 42f7147

25 files changed

+2376
-59
lines changed

.circleci/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,4 @@ workflows:
148148
only:
149149
- master
150150
- beta
151+
- canary

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,18 @@ This means that new versions are released automatically as fixes, features or br
417417

418418
You can check the changelog on the [releases](https://github.com/contentful/contentful-management.js/releases) page.
419419

420+
## Experimental features
421+
422+
To download a build that has features that are not yet released, you can use the `canary` channel. This is a pre-release version of the library that contains features that are still in development and may not be stable. To install a canary version, you can use the following command:
423+
424+
```bash
425+
npm install contentful-management@canary
426+
```
427+
428+
### Current experimental features
429+
430+
Currently there are no features in experimental status.
431+
420432
## Reach out to us
421433

422434
### You have questions about how to use this library?

lib/adapters/REST/endpoints/asset.ts

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,17 @@ import type { AxiosInstance } from 'contentful-sdk-core'
33
import { errorHandler } from 'contentful-sdk-core'
44
import copy from 'fast-copy'
55
import type { SetOptional } from 'type-fest'
6-
import type { CollectionProp, GetSpaceEnvironmentParams, QueryParams } from '../../../common-types'
6+
import type {
7+
CollectionProp,
8+
CreateReleaseAssetParams,
9+
CreateWithFilesReleaseAssetParams,
10+
CreateWithIdReleaseAssetParams,
11+
GetReleaseAssetParams,
12+
GetSpaceEnvironmentParams,
13+
Link,
14+
QueryParams,
15+
UpdateReleaseAssetParams,
16+
} from '../../../common-types'
717
import type {
818
AssetFileProp,
919
AssetProcessingForLocale,
@@ -15,13 +25,18 @@ import type { RestEndpoint } from '../types'
1525
import * as raw from './raw'
1626
import { create as createUpload } from './upload'
1727
import { normalizeSelect } from './utils'
28+
import * as releaseAsset from './release-asset'
1829

1930
export const get: RestEndpoint<'Asset', 'get'> = (
2031
http: AxiosInstance,
21-
params: GetSpaceEnvironmentParams & { assetId: string } & QueryParams,
32+
params: GetSpaceEnvironmentParams & { assetId: string; releaseId?: string } & QueryParams,
2233
rawData?: unknown,
2334
headers?: RawAxiosRequestHeaders,
2435
) => {
36+
if (params.releaseId) {
37+
return releaseAsset.get(http, params as GetReleaseAssetParams)
38+
}
39+
2540
return raw.get<AssetProps>(
2641
http,
2742
`/spaces/${params.spaceId}/environments/${params.environmentId}/assets/${params.assetId}`,
@@ -50,10 +65,14 @@ export const getPublished: RestEndpoint<'Asset', 'getPublished'> = (
5065

5166
export const getMany: RestEndpoint<'Asset', 'getMany'> = (
5267
http: AxiosInstance,
53-
params: GetSpaceEnvironmentParams & QueryParams,
68+
params: GetSpaceEnvironmentParams & QueryParams & { releaseId?: string },
5469
rawData?: unknown,
5570
headers?: RawAxiosRequestHeaders,
5671
) => {
72+
if (params.releaseId) {
73+
return releaseAsset.getMany(http, params as GetReleaseAssetParams)
74+
}
75+
5776
return raw.get<CollectionProp<AssetProps>>(
5877
http,
5978
`/spaces/${params.spaceId}/environments/${params.environmentId}/assets`,
@@ -66,10 +85,14 @@ export const getMany: RestEndpoint<'Asset', 'getMany'> = (
6685

6786
export const update: RestEndpoint<'Asset', 'update'> = (
6887
http: AxiosInstance,
69-
params: GetSpaceEnvironmentParams & { assetId: string },
88+
params: GetSpaceEnvironmentParams & { assetId: string; releaseId?: string },
7089
rawData: AssetProps,
7190
headers?: RawAxiosRequestHeaders,
7291
) => {
92+
if (params.releaseId) {
93+
return releaseAsset.update(http, params as UpdateReleaseAssetParams, rawData, headers ?? {})
94+
}
95+
7396
const data: SetOptional<typeof rawData, 'sys'> = copy(rawData)
7497
delete data.sys
7598
return raw.put<AssetProps>(
@@ -161,9 +184,13 @@ export const unarchive: RestEndpoint<'Asset', 'unarchive'> = (
161184

162185
export const create: RestEndpoint<'Asset', 'create'> = (
163186
http: AxiosInstance,
164-
params: GetSpaceEnvironmentParams,
187+
params: GetSpaceEnvironmentParams & { releaseId?: string },
165188
rawData: CreateAssetProps,
166189
) => {
190+
if (params.releaseId) {
191+
return releaseAsset.create(http, params as CreateReleaseAssetParams, rawData, {})
192+
}
193+
167194
const data = copy(rawData)
168195

169196
return raw.post<AssetProps>(
@@ -175,9 +202,13 @@ export const create: RestEndpoint<'Asset', 'create'> = (
175202

176203
export const createWithId: RestEndpoint<'Asset', 'createWithId'> = (
177204
http: AxiosInstance,
178-
params: GetSpaceEnvironmentParams & { assetId: string },
205+
params: GetSpaceEnvironmentParams & { assetId: string; releaseId?: string },
179206
rawData: CreateAssetProps,
180207
) => {
208+
if (params.releaseId) {
209+
return releaseAsset.createWithId(http, params as CreateWithIdReleaseAssetParams, rawData, {})
210+
}
211+
181212
const data = copy(rawData)
182213

183214
return raw.put<AssetProps>(
@@ -189,9 +220,13 @@ export const createWithId: RestEndpoint<'Asset', 'createWithId'> = (
189220

190221
export const createFromFiles: RestEndpoint<'Asset', 'createFromFiles'> = async (
191222
http: AxiosInstance,
192-
params: GetSpaceEnvironmentParams & { uploadTimeout?: number },
223+
params: GetSpaceEnvironmentParams & { uploadTimeout?: number; releaseId?: string },
193224
data: Omit<AssetFileProp, 'sys'>,
194225
) => {
226+
if (params.releaseId) {
227+
return releaseAsset.createFromFiles(http, params as CreateWithFilesReleaseAssetParams, data, {})
228+
}
229+
195230
const httpUpload = getUploadHttpClient(http, { uploadTimeout: params.uploadTimeout })
196231

197232
const { file } = data.fields
@@ -293,6 +328,15 @@ export const processForLocale: RestEndpoint<'Asset', 'processForLocale'> = async
293328
options?: AssetProcessingForLocale
294329
},
295330
) => {
331+
if (asset.sys.release) {
332+
return releaseAsset.processForLocale(http, {
333+
asset: asset as AssetProps<{ release: Link<'Release'> }>,
334+
locale,
335+
options: { processingCheckRetries, processingCheckWait },
336+
...params,
337+
})
338+
}
339+
296340
return raw
297341
.put<AssetProps>(
298342
http,
@@ -333,6 +377,14 @@ export const processForAllLocales: RestEndpoint<'Asset', 'processForAllLocales'>
333377
...params
334378
}: GetSpaceEnvironmentParams & { asset: AssetProps; options?: AssetProcessingForLocale },
335379
) => {
380+
if (asset.sys.release) {
381+
return releaseAsset.processForAllLocales(http, {
382+
asset: asset as AssetProps<{ release: Link<'Release'> }>,
383+
options,
384+
...params,
385+
})
386+
}
387+
336388
const locales = Object.keys(asset.fields.file || {})
337389

338390
let mostUpToDateAssetVersion: AssetProps = asset

lib/adapters/REST/endpoints/entry.ts

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,32 @@ import type { OpPatch } from 'json-patch'
55
import type { SetOptional } from 'type-fest'
66
import type {
77
CollectionProp,
8+
CreateReleaseEntryParams,
9+
CreateWithIdReleaseEntryParams,
10+
GetManyReleaseEntryParams,
11+
GetReleaseEntryParams,
812
GetSpaceEnvironmentParams,
913
KeyValueMap,
14+
PatchReleaseEntryParams,
1015
QueryParams,
16+
UpdateReleaseEntryParams,
1117
} from '../../../common-types'
1218
import type { CreateEntryProps, EntryProps, EntryReferenceProps } from '../../../entities/entry'
1319
import type { RestEndpoint } from '../types'
1420
import * as raw from './raw'
21+
import * as releaseEntry from './release-entry'
1522
import { normalizeSelect } from './utils'
1623

1724
export const get: RestEndpoint<'Entry', 'get'> = <T extends KeyValueMap = KeyValueMap>(
1825
http: AxiosInstance,
19-
params: GetSpaceEnvironmentParams & { entryId: string } & QueryParams,
26+
params: GetSpaceEnvironmentParams & { entryId: string; releaseId?: string } & QueryParams,
2027
rawData?: unknown,
2128
headers?: RawAxiosRequestHeaders,
2229
) => {
30+
if (params.releaseId) {
31+
return releaseEntry.get(http, params as GetReleaseEntryParams)
32+
}
33+
2334
return raw.get<EntryProps<T>>(
2435
http,
2536
`/spaces/${params.spaceId}/environments/${params.environmentId}/entries/${params.entryId}`,
@@ -50,10 +61,14 @@ export const getPublished: RestEndpoint<'Entry', 'getPublished'> = <
5061

5162
export const getMany: RestEndpoint<'Entry', 'getMany'> = <T extends KeyValueMap = KeyValueMap>(
5263
http: AxiosInstance,
53-
params: GetSpaceEnvironmentParams & QueryParams,
64+
params: GetSpaceEnvironmentParams & QueryParams & { releaseId?: string },
5465
rawData?: unknown,
5566
headers?: RawAxiosRequestHeaders,
5667
) => {
68+
if (params.releaseId) {
69+
return releaseEntry.getMany(http, params as GetManyReleaseEntryParams)
70+
}
71+
5772
return raw.get<CollectionProp<EntryProps<T>>>(
5873
http,
5974
`/spaces/${params.spaceId}/environments/${params.environmentId}/entries`,
@@ -66,10 +81,14 @@ export const getMany: RestEndpoint<'Entry', 'getMany'> = <T extends KeyValueMap
6681

6782
export const patch: RestEndpoint<'Entry', 'patch'> = <T extends KeyValueMap = KeyValueMap>(
6883
http: AxiosInstance,
69-
params: GetSpaceEnvironmentParams & { entryId: string; version: number },
84+
params: GetSpaceEnvironmentParams & { entryId: string; version: number; releaseId?: string },
7085
data: OpPatch[],
7186
headers?: RawAxiosRequestHeaders,
7287
) => {
88+
if (params.releaseId) {
89+
return releaseEntry.patch(http, params as PatchReleaseEntryParams, data, headers ?? {})
90+
}
91+
7392
return raw.patch<EntryProps<T>>(
7493
http,
7594
`/spaces/${params.spaceId}/environments/${params.environmentId}/entries/${params.entryId}`,
@@ -86,10 +105,14 @@ export const patch: RestEndpoint<'Entry', 'patch'> = <T extends KeyValueMap = Ke
86105

87106
export const update: RestEndpoint<'Entry', 'update'> = <T extends KeyValueMap = KeyValueMap>(
88107
http: AxiosInstance,
89-
params: GetSpaceEnvironmentParams & { entryId: string },
108+
params: GetSpaceEnvironmentParams & { entryId: string; releaseId?: string },
90109
rawData: EntryProps<T>,
91110
headers?: RawAxiosRequestHeaders,
92111
) => {
112+
if (params.releaseId) {
113+
return releaseEntry.update(http, params as UpdateReleaseEntryParams, rawData, headers ?? {})
114+
}
115+
93116
const data: SetOptional<typeof rawData, 'sys'> = copy(rawData)
94117
delete data.sys
95118
return raw.put<EntryProps<T>>(
@@ -181,9 +204,13 @@ export const unarchive: RestEndpoint<'Entry', 'unarchive'> = <T extends KeyValue
181204

182205
export const create: RestEndpoint<'Entry', 'create'> = <T extends KeyValueMap = KeyValueMap>(
183206
http: AxiosInstance,
184-
params: GetSpaceEnvironmentParams & { contentTypeId: string },
207+
params: GetSpaceEnvironmentParams & { contentTypeId: string; releaseId?: string },
185208
rawData: CreateEntryProps<T>,
186209
) => {
210+
if (params.releaseId) {
211+
return releaseEntry.create(http, params as CreateReleaseEntryParams, rawData, {})
212+
}
213+
187214
const data = copy(rawData)
188215

189216
return raw.post<EntryProps<T>>(
@@ -202,9 +229,16 @@ export const createWithId: RestEndpoint<'Entry', 'createWithId'> = <
202229
T extends KeyValueMap = KeyValueMap,
203230
>(
204231
http: AxiosInstance,
205-
params: GetSpaceEnvironmentParams & { entryId: string; contentTypeId: string },
232+
params: GetSpaceEnvironmentParams & {
233+
entryId: string
234+
contentTypeId: string
235+
releaseId?: string
236+
},
206237
rawData: CreateEntryProps<T>,
207238
) => {
239+
if (params.releaseId) {
240+
return releaseEntry.createWithId(http, params as CreateWithIdReleaseEntryParams, rawData, {})
241+
}
208242
const data = copy(rawData)
209243

210244
return raw.put<EntryProps<T>>(

lib/adapters/REST/endpoints/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import * as OAuthApplication from './oauth-application'
3939
import * as PersonalAccessToken from './personal-access-token'
4040
import * as PreviewApiKey from './preview-api-key'
4141
import * as Release from './release'
42+
import * as ReleaseAsset from './release-asset'
43+
import * as ReleaseEntry from './release-entry'
4244
import * as ReleaseAction from './release-action'
4345
import * as Resource from './resource'
4446
import * as ResourceProvider from './resource-provider'
@@ -107,6 +109,8 @@ export default {
107109
AccessToken,
108110
PreviewApiKey,
109111
Release,
112+
ReleaseAsset,
113+
ReleaseEntry,
110114
ReleaseAction,
111115
Resource,
112116
ResourceProvider,

0 commit comments

Comments
 (0)