type matrixAssetUriValidationData = { message: string; data: any }; type uriParts = 'scheme' | 'identifier' | 'assetId'; type matrixAssetUriValidationErrorMap = Record | object; export function getValidationDataForMatrixUri(uri: string): matrixAssetUriValidationErrorMap | undefined { let validationDataMap: matrixAssetUriValidationErrorMap = {}; const [scheme, path] = uri.split('://'); if (scheme !== 'matrix-asset') { const validationData: matrixAssetUriValidationData = { message: 'Uri scheme is invalid, must match "matrix-asset"', data: { expected: 'matrix-asset', received: scheme, }, }; validationDataMap = { ...validationDataMap, scheme: validationData, }; } const [identifier, ...assetIdArray] = path.split('/'); const assetId = assetIdArray.join('/'); const identifierRegex = /^[a-zA-Z0-9.-]+$/; if (identifierRegex.test(identifier) === false) { const validationData: matrixAssetUriValidationData = { message: 'Matrix Identifier has invalid format, must match /^[a-zA-Z0-9.-]+$/', data: { expected: /^[a-zA-Z0-9.-]+$/, received: identifier, }, }; validationDataMap = { ...validationDataMap, identifier: validationData, }; } const realAssetIdRegex = /^\d+$/; const [realAssetId] = assetId.split(':'); if (realAssetIdRegex.test(realAssetId) === false) { const validationData: matrixAssetUriValidationData = { message: 'Matrix Asset Id has invalid format, must match /^d+(?::.+)?$/', data: { expected: /^\d+(?::.+)?$/, received: assetId, }, }; validationDataMap = { ...validationDataMap, assetId: validationData, }; } return Object.keys(validationDataMap).length > 0 ? validationDataMap : undefined; }