diff --git a/keyserver/src/scripts/generate-converter-from-validator.js b/keyserver/src/scripts/generate-converter-from-validator.js new file mode 100644 --- /dev/null +++ b/keyserver/src/scripts/generate-converter-from-validator.js @@ -0,0 +1,201 @@ +// @flow + +import { type TInterface, type TType, type TUnion } from 'tcomb'; + +import { nativeMediaSelectionValidator } from 'lib/types/media-types.js'; +import { threadPermissionInfoValidator } from 'lib/types/thread-permission-types.js'; +import { rawThreadInfoValidator } from 'lib/types/thread-types.js'; +import { keyserverPrefixID, tID } from 'lib/utils/validation-utils.js'; + +import { main } from './utils.js'; + +function getDiscriminatorFieldForUnionValidator(validator: TType) { + if (validator === threadPermissionInfoValidator) { + return 'value'; + } + if (validator === nativeMediaSelectionValidator) { + return 'step'; + } + return 'type'; +} + +function flattenInnerUnionValidators( + unionValidator: TUnion, +): TInterface<{ +[string]: mixed }>[] { + let innerValidators = []; + for (const innerValidator of unionValidator.meta.types) { + if (innerValidator.meta.kind === 'interface') { + const innerInterfaceValidator: TInterface<{ +[string]: mixed }> = + (innerValidator: any); + innerValidators.push(innerInterfaceValidator); + } else if (innerValidator.meta.kind === 'union') { + const innerUnionValidator: TUnion = (innerValidator: any); + innerValidators = [ + ...innerValidators, + ...flattenInnerUnionValidators(innerUnionValidator), + ]; + } else { + throw new Error( + `Validator not supported in union: ${innerValidator.displayName}`, + ); + } + } + return innerValidators; +} + +// `null` is returned if there is no conversion needed in T or any +// of it's inner types +function generateConverterFromValidator( + validator: TType, + inputName: string, + validatorToBeConverted: TType, + conversionExpressionString: (inputName: string) => string, +): ?string { + if (validator === validatorToBeConverted) { + return `(${conversionExpressionString(inputName)})`; + } + + if (validator.meta.kind === 'maybe') { + const inner = generateConverterFromValidator( + validator.meta.type, + inputName, + validatorToBeConverted, + conversionExpressionString, + ); + if (!inner) { + return null; + } + return `((${inputName} !== null && ${inputName} !== undefined) ? (${inner}) : (${inputName}))`; + } + if (validator.meta.kind === 'subtype') { + return generateConverterFromValidator( + validator.meta.type, + inputName, + validatorToBeConverted, + conversionExpressionString, + ); + } + if (validator.meta.kind === 'interface') { + const recastValidator: TInterface<{ +[string]: mixed }> = (validator: any); + const fieldConverters = []; + for (const key in recastValidator.meta.props) { + const inner = generateConverterFromValidator( + recastValidator.meta.props[key], + `${inputName}.${key}`, + validatorToBeConverted, + conversionExpressionString, + ); + if (inner) { + fieldConverters.push(`${key}:${inner}`); + } + } + if (fieldConverters.length === 0) { + return null; + } + + return `({...${inputName}, ${fieldConverters.join(',')}})`; + } + if (validator.meta.kind === 'union') { + const unionValidator: TUnion = (validator: any); + let flattenedInnerValidators = null; + flattenedInnerValidators = flattenInnerUnionValidators(unionValidator); + + const variantConverters = []; + for (const innerValidator of flattenedInnerValidators) { + const discriminatorField = + getDiscriminatorFieldForUnionValidator(validator); + const discriminatorValidator: TType = + innerValidator.meta.props[discriminatorField]; + + if (!discriminatorValidator) { + throw new Error( + 'Union should have a discriminator ' + validator.displayName, + ); + } + + const discriminator = discriminatorValidator.meta.name; + + const inner = generateConverterFromValidator( + innerValidator, + inputName, + validatorToBeConverted, + conversionExpressionString, + ); + + if (inner) { + variantConverters.push( + `(${inputName}.${discriminatorField} === ${discriminator}) ? (${inner})`, + ); + } + } + if (variantConverters.length === 0) { + return null; + } + variantConverters.push(`(${inputName})`); + return `(${variantConverters.join(':')})`; + } + if (validator.meta.kind === 'list') { + const inner = generateConverterFromValidator( + validator.meta.type, + 'elem', + validatorToBeConverted, + conversionExpressionString, + ); + if (!inner) { + return inputName; + } + return `(${inputName}.map(elem => ${inner}))`; + } + if (validator.meta.kind === 'dict') { + const domainValidator = validator.meta.domain; + const codomainValidator = validator.meta.codomain; + + let domainConverter = null; + if (domainValidator === validatorToBeConverted) { + domainConverter = conversionExpressionString('key'); + } + + let codomainConverter = generateConverterFromValidator( + codomainValidator, + 'value', + validatorToBeConverted, + conversionExpressionString, + ); + + if (!domainConverter && !codomainConverter) { + return null; + } + + domainConverter = domainConverter ?? 'key'; + codomainConverter = codomainConverter ?? 'value'; + + return `(Object.fromEntries( + entries(${inputName}).map( + ([key, value]) => [${domainConverter}, ${codomainConverter}] + ) + ))`; + } + + return null; +} + +// Input arguments: +const validator = rawThreadInfoValidator; +const typeName = 'RawThreadInfo'; +const validatorToBeConverted = tID; +const conversionExpressionString = inputName => + `'${keyserverPrefixID}|' + ${inputName}`; +main([ + async () => { + console.log( + `export function convert${typeName}ToNewIDSchema(input: ${typeName}): ${typeName} { return`, + generateConverterFromValidator( + validator, + 'input', + validatorToBeConverted, + conversionExpressionString, + ) ?? 'input', + ';}', + ); + }, +]); diff --git a/lib/_generated/migration-utils.js b/lib/_generated/migration-utils.js new file mode 100644 --- /dev/null +++ b/lib/_generated/migration-utils.js @@ -0,0 +1,880 @@ +// @flow + +import type { EntryStore } from '../types/entry-types.js'; +import type { InviteLinksStore } from '../types/link-types.js'; +import type { MessageStore, RawMessageInfo } from '../types/message-types.js'; +import type { RawThreadInfo } from '../types/thread-types.js'; +import { entries } from '../utils/objects.js'; + +export function convertRawMessageInfoToNewIDSchema( + input: RawMessageInfo, +): RawMessageInfo { + return input.type === 0 + ? { + ...input, + threadID: '256|' + input.threadID, + id: + input.id !== null && input.id !== undefined + ? '256|' + input.id + : input.id, + } + : input.type === 14 + ? { + ...input, + threadID: '256|' + input.threadID, + media: input.media.map(elem => ({ ...elem, id: '256|' + elem.id })), + id: + input.id !== null && input.id !== undefined + ? '256|' + input.id + : input.id, + } + : input.type === 15 + ? { + ...input, + threadID: '256|' + input.threadID, + media: input.media.map(elem => + elem.type === 'photo' + ? { ...elem, id: '256|' + elem.id } + : elem.type === 'video' + ? { + ...elem, + id: '256|' + elem.id, + thumbnailID: '256|' + elem.thumbnailID, + } + : elem.type === 'encrypted_photo' + ? { ...elem, id: '256|' + elem.id } + : elem.type === 'encrypted_video' + ? { + ...elem, + id: '256|' + elem.id, + thumbnailID: '256|' + elem.thumbnailID, + } + : elem, + ), + id: + input.id !== null && input.id !== undefined + ? '256|' + input.id + : input.id, + } + : input.type === 1 + ? { + ...input, + threadID: '256|' + input.threadID, + initialThreadState: { + ...input.initialThreadState, + parentThreadID: + input.initialThreadState.parentThreadID !== null && + input.initialThreadState.parentThreadID !== undefined + ? '256|' + input.initialThreadState.parentThreadID + : input.initialThreadState.parentThreadID, + memberIDs: input.initialThreadState.memberIDs, + }, + id: '256|' + input.id, + } + : input.type === 2 + ? { + ...input, + threadID: '256|' + input.threadID, + addedUserIDs: input.addedUserIDs, + id: '256|' + input.id, + } + : input.type === 3 + ? { + ...input, + threadID: '256|' + input.threadID, + childThreadID: '256|' + input.childThreadID, + id: '256|' + input.id, + } + : input.type === 4 + ? { ...input, threadID: '256|' + input.threadID, id: '256|' + input.id } + : input.type === 5 + ? { + ...input, + threadID: '256|' + input.threadID, + removedUserIDs: input.removedUserIDs, + id: '256|' + input.id, + } + : input.type === 6 + ? { + ...input, + threadID: '256|' + input.threadID, + userIDs: input.userIDs, + newRole: '256|' + input.newRole, + id: '256|' + input.id, + } + : input.type === 7 + ? { ...input, threadID: '256|' + input.threadID, id: '256|' + input.id } + : input.type === 8 + ? { ...input, threadID: '256|' + input.threadID, id: '256|' + input.id } + : input.type === 9 + ? { + ...input, + threadID: '256|' + input.threadID, + entryID: '256|' + input.entryID, + id: '256|' + input.id, + } + : input.type === 10 + ? { + ...input, + threadID: '256|' + input.threadID, + entryID: '256|' + input.entryID, + id: '256|' + input.id, + } + : input.type === 11 + ? { + ...input, + threadID: '256|' + input.threadID, + entryID: '256|' + input.entryID, + id: '256|' + input.id, + } + : input.type === 12 + ? { + ...input, + threadID: '256|' + input.threadID, + entryID: '256|' + input.entryID, + id: '256|' + input.id, + } + : input.type === 16 + ? { ...input, threadID: '256|' + input.threadID, id: '256|' + input.id } + : input.type === 18 + ? { + ...input, + threadID: '256|' + input.threadID, + initialThreadState: { + ...input.initialThreadState, + parentThreadID: '256|' + input.initialThreadState.parentThreadID, + memberIDs: input.initialThreadState.memberIDs, + }, + id: '256|' + input.id, + } + : input.type === 13 + ? { ...input, id: '256|' + input.id, threadID: '256|' + input.threadID } + : input.type === 21 + ? { + ...input, + threadID: '256|' + input.threadID, + targetMessageID: '256|' + input.targetMessageID, + id: '256|' + input.id, + } + : input.type === 17 + ? { + ...input, + threadID: '256|' + input.threadID, + sourceMessage: + input.sourceMessage !== null && input.sourceMessage !== undefined + ? input.sourceMessage.type === 0 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + id: + input.sourceMessage.id !== null && + input.sourceMessage.id !== undefined + ? '256|' + input.sourceMessage.id + : input.sourceMessage.id, + } + : input.sourceMessage.type === 14 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + id: + input.sourceMessage.id !== null && + input.sourceMessage.id !== undefined + ? '256|' + input.sourceMessage.id + : input.sourceMessage.id, + media: input.sourceMessage.media.map(elem => ({ + ...elem, + id: '256|' + elem.id, + })), + } + : input.sourceMessage.type === 15 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + id: + input.sourceMessage.id !== null && + input.sourceMessage.id !== undefined + ? '256|' + input.sourceMessage.id + : input.sourceMessage.id, + media: input.sourceMessage.media.map(elem => + elem.type === 'photo' + ? { ...elem, id: '256|' + elem.id } + : elem.type === 'video' + ? { + ...elem, + id: '256|' + elem.id, + thumbnailID: '256|' + elem.thumbnailID, + } + : elem.type === 'encrypted_photo' + ? { ...elem, id: '256|' + elem.id } + : elem.type === 'encrypted_video' + ? { + ...elem, + id: '256|' + elem.id, + thumbnailID: '256|' + elem.thumbnailID, + } + : elem, + ), + } + : input.sourceMessage.type === 1 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + initialThreadState: { + ...input.sourceMessage.initialThreadState, + parentThreadID: + input.sourceMessage.initialThreadState.parentThreadID !== + null && + input.sourceMessage.initialThreadState.parentThreadID !== + undefined + ? '256|' + + input.sourceMessage.initialThreadState.parentThreadID + : input.sourceMessage.initialThreadState.parentThreadID, + memberIDs: input.sourceMessage.initialThreadState.memberIDs, + }, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 2 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + addedUserIDs: input.sourceMessage.addedUserIDs, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 3 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + childThreadID: '256|' + input.sourceMessage.childThreadID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 4 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 5 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + removedUserIDs: input.sourceMessage.removedUserIDs, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 6 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + userIDs: input.sourceMessage.userIDs, + newRole: '256|' + input.sourceMessage.newRole, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 7 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 8 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 9 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + entryID: '256|' + input.sourceMessage.entryID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 10 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + entryID: '256|' + input.sourceMessage.entryID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 11 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + entryID: '256|' + input.sourceMessage.entryID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 12 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + entryID: '256|' + input.sourceMessage.entryID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 16 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 18 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + initialThreadState: { + ...input.sourceMessage.initialThreadState, + parentThreadID: + '256|' + + input.sourceMessage.initialThreadState.parentThreadID, + memberIDs: input.sourceMessage.initialThreadState.memberIDs, + }, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage.type === 13 + ? { + ...input.sourceMessage, + id: '256|' + input.sourceMessage.id, + threadID: '256|' + input.sourceMessage.threadID, + } + : input.sourceMessage.type === 21 + ? { + ...input.sourceMessage, + threadID: '256|' + input.sourceMessage.threadID, + targetMessageID: '256|' + input.sourceMessage.targetMessageID, + id: '256|' + input.sourceMessage.id, + } + : input.sourceMessage + : input.sourceMessage, + id: '256|' + input.id, + } + : input.type === 19 + ? { + ...input, + threadID: '256|' + input.threadID, + targetMessageID: '256|' + input.targetMessageID, + id: + input.id !== null && input.id !== undefined + ? '256|' + input.id + : input.id, + } + : input.type === 20 + ? { + ...input, + threadID: '256|' + input.threadID, + targetMessageID: '256|' + input.targetMessageID, + id: '256|' + input.id, + } + : input; +} + +export function convertRawThreadInfoToNewIDSchema( + input: RawThreadInfo, +): RawThreadInfo { + return { + ...input, + id: '256|' + input.id, + parentThreadID: + input.parentThreadID !== null && input.parentThreadID !== undefined + ? '256|' + input.parentThreadID + : input.parentThreadID, + containingThreadID: + input.containingThreadID !== null && + input.containingThreadID !== undefined + ? '256|' + input.containingThreadID + : input.containingThreadID, + community: + input.community !== null && input.community !== undefined + ? '256|' + input.community + : input.community, + members: input.members.map(elem => ({ + ...elem, + role: + elem.role !== null && elem.role !== undefined + ? '256|' + elem.role + : elem.role, + permissions: Object.fromEntries( + entries(elem.permissions).map(([key, value]) => [ + key, + value.value === true + ? { ...value, source: '256|' + value.source } + : value, + ]), + ), + })), + roles: Object.fromEntries( + entries(input.roles).map(([key, value]) => [ + '256|' + key, + { ...value, id: '256|' + value.id }, + ]), + ), + currentUser: { + ...input.currentUser, + role: + input.currentUser.role !== null && input.currentUser.role !== undefined + ? '256|' + input.currentUser.role + : input.currentUser.role, + permissions: Object.fromEntries( + entries(input.currentUser.permissions).map(([key, value]) => [ + key, + value.value === true + ? { ...value, source: '256|' + value.source } + : value, + ]), + ), + }, + sourceMessageID: + input.sourceMessageID !== null && input.sourceMessageID !== undefined + ? '256|' + input.sourceMessageID + : input.sourceMessageID, + }; +} + +export function convertMessageStoreToNewIDSchema( + input: MessageStore, +): MessageStore { + return { + ...input, + messages: Object.fromEntries( + entries(input.messages).map(([key, value]) => [ + '256|' + key, + value.type === 0 + ? { + ...value, + threadID: '256|' + value.threadID, + id: + value.id !== null && value.id !== undefined + ? '256|' + value.id + : value.id, + } + : value.type === 14 + ? { + ...value, + threadID: '256|' + value.threadID, + media: value.media.map(elem => ({ + ...elem, + id: '256|' + elem.id, + })), + id: + value.id !== null && value.id !== undefined + ? '256|' + value.id + : value.id, + } + : value.type === 15 + ? { + ...value, + threadID: '256|' + value.threadID, + media: value.media.map(elem => + elem.type === 'photo' + ? { ...elem, id: '256|' + elem.id } + : elem.type === 'video' + ? { + ...elem, + id: '256|' + elem.id, + thumbnailID: '256|' + elem.thumbnailID, + } + : elem.type === 'encrypted_photo' + ? { ...elem, id: '256|' + elem.id } + : elem.type === 'encrypted_video' + ? { + ...elem, + id: '256|' + elem.id, + thumbnailID: '256|' + elem.thumbnailID, + } + : elem, + ), + id: + value.id !== null && value.id !== undefined + ? '256|' + value.id + : value.id, + } + : value.type === 1 + ? { + ...value, + threadID: '256|' + value.threadID, + initialThreadState: { + ...value.initialThreadState, + parentThreadID: + value.initialThreadState.parentThreadID !== null && + value.initialThreadState.parentThreadID !== undefined + ? '256|' + value.initialThreadState.parentThreadID + : value.initialThreadState.parentThreadID, + memberIDs: value.initialThreadState.memberIDs, + }, + id: '256|' + value.id, + } + : value.type === 2 + ? { + ...value, + threadID: '256|' + value.threadID, + addedUserIDs: value.addedUserIDs, + id: '256|' + value.id, + } + : value.type === 3 + ? { + ...value, + threadID: '256|' + value.threadID, + childThreadID: '256|' + value.childThreadID, + id: '256|' + value.id, + } + : value.type === 4 + ? { + ...value, + threadID: '256|' + value.threadID, + id: '256|' + value.id, + } + : value.type === 5 + ? { + ...value, + threadID: '256|' + value.threadID, + removedUserIDs: value.removedUserIDs, + id: '256|' + value.id, + } + : value.type === 6 + ? { + ...value, + threadID: '256|' + value.threadID, + userIDs: value.userIDs, + newRole: '256|' + value.newRole, + id: '256|' + value.id, + } + : value.type === 7 + ? { + ...value, + threadID: '256|' + value.threadID, + id: '256|' + value.id, + } + : value.type === 8 + ? { + ...value, + threadID: '256|' + value.threadID, + id: '256|' + value.id, + } + : value.type === 9 + ? { + ...value, + threadID: '256|' + value.threadID, + entryID: '256|' + value.entryID, + id: '256|' + value.id, + } + : value.type === 10 + ? { + ...value, + threadID: '256|' + value.threadID, + entryID: '256|' + value.entryID, + id: '256|' + value.id, + } + : value.type === 11 + ? { + ...value, + threadID: '256|' + value.threadID, + entryID: '256|' + value.entryID, + id: '256|' + value.id, + } + : value.type === 12 + ? { + ...value, + threadID: '256|' + value.threadID, + entryID: '256|' + value.entryID, + id: '256|' + value.id, + } + : value.type === 16 + ? { + ...value, + threadID: '256|' + value.threadID, + id: '256|' + value.id, + } + : value.type === 18 + ? { + ...value, + threadID: '256|' + value.threadID, + initialThreadState: { + ...value.initialThreadState, + parentThreadID: + '256|' + value.initialThreadState.parentThreadID, + memberIDs: value.initialThreadState.memberIDs, + }, + id: '256|' + value.id, + } + : value.type === 13 + ? { + ...value, + id: '256|' + value.id, + threadID: '256|' + value.threadID, + } + : value.type === 21 + ? { + ...value, + threadID: '256|' + value.threadID, + targetMessageID: '256|' + value.targetMessageID, + id: '256|' + value.id, + } + : value.type === 17 + ? { + ...value, + threadID: '256|' + value.threadID, + sourceMessage: + value.sourceMessage !== null && + value.sourceMessage !== undefined + ? value.sourceMessage.type === 0 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + id: + value.sourceMessage.id !== null && + value.sourceMessage.id !== undefined + ? '256|' + value.sourceMessage.id + : value.sourceMessage.id, + } + : value.sourceMessage.type === 14 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + id: + value.sourceMessage.id !== null && + value.sourceMessage.id !== undefined + ? '256|' + value.sourceMessage.id + : value.sourceMessage.id, + media: value.sourceMessage.media.map(elem => ({ + ...elem, + id: '256|' + elem.id, + })), + } + : value.sourceMessage.type === 15 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + id: + value.sourceMessage.id !== null && + value.sourceMessage.id !== undefined + ? '256|' + value.sourceMessage.id + : value.sourceMessage.id, + media: value.sourceMessage.media.map(elem => + elem.type === 'photo' + ? { ...elem, id: '256|' + elem.id } + : elem.type === 'video' + ? { + ...elem, + id: '256|' + elem.id, + thumbnailID: '256|' + elem.thumbnailID, + } + : elem.type === 'encrypted_photo' + ? { ...elem, id: '256|' + elem.id } + : elem.type === 'encrypted_video' + ? { + ...elem, + id: '256|' + elem.id, + thumbnailID: '256|' + elem.thumbnailID, + } + : elem, + ), + } + : value.sourceMessage.type === 1 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + initialThreadState: { + ...value.sourceMessage.initialThreadState, + parentThreadID: + value.sourceMessage.initialThreadState + .parentThreadID !== null && + value.sourceMessage.initialThreadState + .parentThreadID !== undefined + ? '256|' + + value.sourceMessage.initialThreadState + .parentThreadID + : value.sourceMessage.initialThreadState + .parentThreadID, + memberIDs: + value.sourceMessage.initialThreadState.memberIDs, + }, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 2 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + addedUserIDs: value.sourceMessage.addedUserIDs, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 3 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + childThreadID: + '256|' + value.sourceMessage.childThreadID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 4 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 5 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + removedUserIDs: value.sourceMessage.removedUserIDs, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 6 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + userIDs: value.sourceMessage.userIDs, + newRole: '256|' + value.sourceMessage.newRole, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 7 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 8 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 9 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + entryID: '256|' + value.sourceMessage.entryID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 10 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + entryID: '256|' + value.sourceMessage.entryID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 11 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + entryID: '256|' + value.sourceMessage.entryID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 12 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + entryID: '256|' + value.sourceMessage.entryID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 16 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 18 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + initialThreadState: { + ...value.sourceMessage.initialThreadState, + parentThreadID: + '256|' + + value.sourceMessage.initialThreadState + .parentThreadID, + memberIDs: + value.sourceMessage.initialThreadState.memberIDs, + }, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage.type === 13 + ? { + ...value.sourceMessage, + id: '256|' + value.sourceMessage.id, + threadID: '256|' + value.sourceMessage.threadID, + } + : value.sourceMessage.type === 21 + ? { + ...value.sourceMessage, + threadID: '256|' + value.sourceMessage.threadID, + targetMessageID: + '256|' + value.sourceMessage.targetMessageID, + id: '256|' + value.sourceMessage.id, + } + : value.sourceMessage + : value.sourceMessage, + id: '256|' + value.id, + } + : value.type === 19 + ? { + ...value, + threadID: '256|' + value.threadID, + targetMessageID: '256|' + value.targetMessageID, + id: + value.id !== null && value.id !== undefined + ? '256|' + value.id + : value.id, + } + : value.type === 20 + ? { + ...value, + threadID: '256|' + value.threadID, + targetMessageID: '256|' + value.targetMessageID, + id: '256|' + value.id, + } + : value, + ]), + ), + threads: Object.fromEntries( + entries(input.threads).map(([key, value]) => [ + '256|' + key, + { ...value, messageIDs: value.messageIDs.map(elem => '256|' + elem) }, + ]), + ), + }; +} + +export function convertEntryStoreToNewIDSchema(input: EntryStore): EntryStore { + return { + ...input, + entryInfos: Object.fromEntries( + entries(input.entryInfos).map(([key, value]) => [ + '256|' + key, + { + ...value, + id: + value.id !== null && value.id !== undefined + ? '256|' + value.id + : value.id, + threadID: '256|' + value.threadID, + }, + ]), + ), + daysToEntries: Object.fromEntries( + entries(input.daysToEntries).map(([key, value]) => [ + key, + value.map(elem => '256|' + elem), + ]), + ), + }; +} + +export function convertInviteLinksStoreToNewIDSchema( + input: InviteLinksStore, +): InviteLinksStore { + return { + ...input, + links: Object.fromEntries( + entries(input.links).map(([key, value]) => [ + '256|' + key, + { + ...value, + primaryLink: + value.primaryLink !== null && value.primaryLink !== undefined + ? { + ...value.primaryLink, + role: '256|' + value.primaryLink.role, + communityID: '256|' + value.primaryLink.communityID, + } + : value.primaryLink, + }, + ]), + ), + }; +} diff --git a/lib/utils/objects.js b/lib/utils/objects.js --- a/lib/utils/objects.js +++ b/lib/utils/objects.js @@ -50,6 +50,11 @@ return Object.keys(map); } +function entries(map: ObjectMap): [K, T][] { + // $FlowFixMe - flow treats the values as mixed, but we know that they are T + return Object.entries(map); +} + function assignValueWithKey( obj: NestedObjectMap, key: K, @@ -116,4 +121,11 @@ ); } -export { findMaximumDepth, values, hash, assertObjectsAreEqual, deepDiff }; +export { + findMaximumDepth, + values, + hash, + assertObjectsAreEqual, + deepDiff, + entries, +}; diff --git a/lib/utils/validation-utils.js b/lib/utils/validation-utils.js --- a/lib/utils/validation-utils.js +++ b/lib/utils/validation-utils.js @@ -27,15 +27,15 @@ } from '../types/messages/media'; function tBool(value: boolean): TIrreducible { - return t.irreducible('literal bool', x => x === value); + return t.irreducible(value.toString(), x => x === value); } function tString(value: string): TIrreducible { - return t.irreducible('literal string', x => x === value); + return t.irreducible(`'${value}'`, x => x === value); } function tNumber(value: number): TIrreducible { - return t.irreducible('literal number', x => x === value); + return t.irreducible(value.toString(), x => x === value); } function tShape(spec: TStructProps): TInterface {