Skip to content

Commit c789d0f

Browse files
authored
Merge pull request #238 from IQSS/feat/236-strict-ts-config
Typescript strict config
2 parents 397bceb + e82bb0f commit c789d0f

29 files changed

+166
-150
lines changed

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ export interface NewCollectionContactRequestPayload {
3333
}
3434

3535
export interface NewCollectionMetadataBlocksRequestPayload {
36-
metadataBlockNames: string[]
37-
facetIds: string[]
38-
inputLevels: NewCollectionInputLevelRequestPayload[]
36+
metadataBlockNames?: string[]
37+
facetIds?: string[]
38+
inputLevels?: NewCollectionInputLevelRequestPayload[]
3939
}
4040

4141
export interface NewCollectionInputLevelRequestPayload {
@@ -179,7 +179,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
179179
})
180180
)
181181

182-
const inputLevelsRequestBody: NewCollectionInputLevelRequestPayload[] =
182+
const inputLevelsRequestBody: NewCollectionInputLevelRequestPayload[] | undefined =
183183
collectionDTO.inputLevels?.map((inputLevel) => ({
184184
datasetFieldTypeName: inputLevel.datasetFieldName,
185185
include: inputLevel.include,

src/core/infra/repositories/ApiRepository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export abstract class ApiRepository {
4747
protected buildApiEndpoint(
4848
resourceName: string,
4949
operation: string,
50-
resourceId: number | string = undefined
50+
resourceId: number | string | undefined = undefined
5151
) {
5252
return typeof resourceId === 'number'
5353
? `/${resourceName}/${resourceId}/${operation}`

src/core/infra/repositories/apiConfigBuilders.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const buildRequestConfig = (
88
contentType: string = ApiConstants.CONTENT_TYPE_APPLICATION_JSON,
99
abortSignal?: AbortSignal
1010
): AxiosRequestConfig => {
11-
const requestConfig: AxiosRequestConfig = {
11+
const requestConfig: AxiosRequestConfig & { headers: Record<string, unknown> } = {
1212
params: queryParams,
1313
headers: {
1414
'Content-Type': contentType

src/datasets/domain/models/Dataset.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export type DatasetMetadataFieldValue =
6565
| DatasetMetadataSubField[]
6666
| AnonymizedField
6767

68-
export type DatasetMetadataSubField = Record<string, string>
68+
export type DatasetMetadataSubField = Record<string, string | undefined>
6969

7070
export interface CitationMetadataBlock extends DatasetMetadataBlock {
7171
name: 'citation'

src/datasets/domain/useCases/validators/DatasetResourceValidator.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ export class DatasetResourceValidator implements ResourceValidator {
1717
metadataBlocks: MetadataBlock[]
1818
) {
1919
const metadataBlockName = metadataBlockValues.name
20-
const metadataBlock: MetadataBlock = metadataBlocks.find(
20+
const metadataBlock = metadataBlocks.find(
2121
(metadataBlock) => metadataBlock.name === metadataBlockName
22-
)
22+
) as MetadataBlock
23+
2324
for (const metadataFieldKey of Object.keys(metadataBlock.metadataFields)) {
2425
this.metadataFieldValidator.validate({
2526
metadataFieldInfo: metadataBlock.metadataFields[metadataFieldKey],

src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { MetadataFieldValidator } from './MetadataFieldValidator'
88
import { DatasetMetadataChildFieldValueDTO } from '../../dtos/DatasetDTO'
99
import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator'
1010
import {
11+
MetadataFieldInfo,
1112
MetadataFieldType,
1213
MetadataFieldWatermark
1314
} from '../../../../metadataBlocks/domain/models/MetadataBlock'
@@ -62,7 +63,7 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator {
6263
datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo
6364
) {
6465
if (
65-
!datasetMetadataFieldAndValueInfo.metadataFieldInfo.controlledVocabularyValues.includes(
66+
!datasetMetadataFieldAndValueInfo.metadataFieldInfo.controlledVocabularyValues?.includes(
6667
datasetMetadataFieldAndValueInfo.metadataFieldValue as string
6768
)
6869
) {
@@ -120,13 +121,21 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator {
120121
datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo
121122
) {
122123
const metadataFieldInfo = datasetMetadataFieldAndValueInfo.metadataFieldInfo
123-
const childMetadataFieldKeys = Object.keys(metadataFieldInfo.childMetadataFields)
124+
125+
const childMetadataFieldKeys = Object.keys(
126+
metadataFieldInfo.childMetadataFields as Record<string, MetadataFieldInfo>
127+
)
128+
124129
const metadataFieldValidator = new MetadataFieldValidator(
125130
this,
126131
new MultipleMetadataFieldValidator(this)
127132
)
133+
128134
for (const childMetadataFieldKey of childMetadataFieldKeys) {
129-
const childMetadataFieldInfo = metadataFieldInfo.childMetadataFields[childMetadataFieldKey]
135+
const childMetadataFieldInfo = (
136+
metadataFieldInfo.childMetadataFields as Record<string, MetadataFieldInfo>
137+
)[childMetadataFieldKey]
138+
130139
metadataFieldValidator.validate({
131140
metadataFieldInfo: childMetadataFieldInfo,
132141
metadataFieldKey: childMetadataFieldKey,

src/datasets/infra/repositories/transformers/datasetTransformers.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ export const transformDatasetModelToUpdateDatasetRequestPayload = (
6868
datasetMetadataBlocksValues.forEach(function (
6969
newDatasetMetadataBlockValues: DatasetMetadataBlockValuesDTO
7070
) {
71-
const metadataBlock: MetadataBlock = metadataBlocks.find(
71+
const metadataBlock = metadataBlocks.find(
7272
(metadataBlock) => metadataBlock.name == newDatasetMetadataBlockValues.name
73-
)
73+
) as MetadataBlock
7474
const metadataBlockFieldsPayload: MetadataFieldRequestPayload[] = []
7575
const metadataBlockFields = metadataBlock.metadataFields
7676
const datasetMetadataFields = newDatasetMetadataBlockValues.fields
@@ -119,7 +119,7 @@ export const transformMetadataBlockModelsToRequestPayload = (
119119
) {
120120
const metadataBlock: MetadataBlock = metadataBlocks.find(
121121
(metadataBlock) => metadataBlock.name == newDatasetMetadataBlockValues.name
122-
)
122+
) as MetadataBlock
123123
metadataBlocksRequestPayload[newDatasetMetadataBlockValues.name] = {
124124
fields: transformMetadataFieldModelsToRequestPayload(
125125
newDatasetMetadataBlockValues.fields,
@@ -195,8 +195,9 @@ export const transformMetadataChildFieldValueToRequestPayload = (
195195
): Record<string, MetadataFieldRequestPayload> => {
196196
const metadataChildFieldRequestPayload: Record<string, MetadataFieldRequestPayload> = {}
197197
for (const metadataChildFieldKey of Object.keys(datasetMetadataChildFieldValue)) {
198-
const childMetadataFieldInfo: MetadataFieldInfo =
199-
metadataBlockFieldInfo.childMetadataFields[metadataChildFieldKey]
198+
const childMetadataFieldInfo: MetadataFieldInfo = (
199+
metadataBlockFieldInfo.childMetadataFields as Record<string, MetadataFieldInfo>
200+
)[metadataChildFieldKey]
200201
const value: string = datasetMetadataChildFieldValue[metadataChildFieldKey] as unknown as string
201202
metadataChildFieldRequestPayload[metadataChildFieldKey] = {
202203
value: value,
@@ -252,7 +253,9 @@ export const transformVersionPayloadToDataset = (
252253
})
253254
}
254255
if ('license' in versionPayload) {
255-
datasetModel.license = transformPayloadToDatasetLicense(versionPayload.license)
256+
datasetModel.license = transformPayloadToDatasetLicense(
257+
versionPayload.license as LicensePayload
258+
)
256259
}
257260
if ('alternativePersistentId' in versionPayload) {
258261
datasetModel.alternativePersistentId = versionPayload.alternativePersistentId

src/files/infra/clients/DirectUploadClient.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ export class DirectUploadClient implements IDirectUploadClient {
7373
if (axios.isCancel(error)) {
7474
throw new FileUploadCancelError(file.name, datasetId)
7575
}
76-
throw new FileUploadError(file.name, datasetId, error.message)
76+
const errorMessage = error instanceof Error ? error.message : 'Upload singlepart file failed'
77+
throw new FileUploadError(file.name, datasetId, errorMessage)
7778
}
7879
}
7980

@@ -114,16 +115,20 @@ export class DirectUploadClient implements IDirectUploadClient {
114115
eTags[`${index + 1}`] = eTag
115116
} catch (error) {
116117
if (axios.isCancel(error)) {
117-
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint)
118+
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint as string)
118119
throw new FileUploadCancelError(file.name, datasetId)
119120
}
120121
if (retries < maxRetries) {
121122
const backoffDelay = Math.pow(2, retries) * 1000
122123
await new Promise((resolve) => setTimeout(resolve, backoffDelay))
123124
await uploadPart(destinationUrl, index, retries + 1)
124125
} else {
125-
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint)
126-
throw new FilePartUploadError(file.name, datasetId, error.message, index + 1)
126+
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint as string)
127+
128+
const errorMessage =
129+
error instanceof Error ? error.message : 'Upload part of multipart file failed'
130+
131+
throw new FilePartUploadError(file.name, datasetId, errorMessage, index + 1)
127132
}
128133
}
129134
}
@@ -165,7 +170,7 @@ export class DirectUploadClient implements IDirectUploadClient {
165170
): Promise<void> {
166171
return await axios
167172
.put(
168-
buildRequestUrl(destination.completeEndpoint),
173+
buildRequestUrl(destination.completeEndpoint as string),
169174
eTags,
170175
buildRequestConfig(
171176
true,
@@ -177,7 +182,7 @@ export class DirectUploadClient implements IDirectUploadClient {
177182
.then(() => undefined)
178183
.catch(async (error) => {
179184
if (axios.isCancel(error)) {
180-
await this.abortMultipartUpload(fileName, datasetId, destination.abortEndpoint)
185+
await this.abortMultipartUpload(fileName, datasetId, destination.abortEndpoint as string)
181186
throw new FileUploadCancelError(fileName, datasetId)
182187
}
183188
throw new MultipartCompletionError(fileName, datasetId, error.message)

src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,19 @@ const transformMetadataBlockPayloadToMetadataBlock = (
6464

6565
const getChildFieldKeys = (metadataBlockFieldsPayload: Record<string, unknown>): Set<string> => {
6666
const childFieldKeys = new Set<string>()
67-
Object.values(metadataBlockFieldsPayload).forEach(
68-
(fieldInfo: { childFields?: Record<string, unknown> }) => {
69-
if (fieldInfo.childFields) {
70-
Object.keys(fieldInfo.childFields).forEach((childKey) => {
71-
childFieldKeys.add(childKey)
72-
})
73-
}
67+
Object.values(metadataBlockFieldsPayload).forEach((fieldInfo) => {
68+
if (
69+
fieldInfo &&
70+
typeof fieldInfo === 'object' &&
71+
'childFields' in fieldInfo &&
72+
typeof fieldInfo.childFields === 'object' &&
73+
(fieldInfo?.childFields as Record<string, unknown>)
74+
) {
75+
Object.keys(fieldInfo.childFields as Record<string, unknown>).forEach((childKey) => {
76+
childFieldKeys.add(childKey)
77+
})
7478
}
75-
)
79+
})
7680
return childFieldKeys
7781
}
7882

test/functional/collections/CreateCollection.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ describe('execute', () => {
2929
test('should throw an error when the parent collection does not exist', async () => {
3030
const testNewCollection = createCollectionDTO()
3131
expect.assertions(2)
32-
let writeError: WriteError
32+
let writeError: WriteError | undefined = undefined
3333
try {
3434
await createCollection.execute(testNewCollection, TestConstants.TEST_DUMMY_COLLECTION_ID)
3535
throw new Error('Use case should throw an error')
3636
} catch (error) {
37-
writeError = error
37+
writeError = error as WriteError
3838
} finally {
3939
expect(writeError).toBeInstanceOf(WriteError)
40-
expect(writeError.message).toEqual(
40+
expect(writeError?.message).toEqual(
4141
`There was an error when writing the resource. Reason was: [404] Can't find dataverse with identifier='${TestConstants.TEST_DUMMY_COLLECTION_ID}'`
4242
)
4343
}

0 commit comments

Comments
 (0)