"use strict"; const lookupTimezoneName = require("../lookup-timezone-name"); module.exports = { // Note that this mapping can be used to determine the losslessness of both forward and backward migrations! types: { bytes: { requiredAttributes: new Set([ "required" ]), losslessConversionTo: {} }, string: { requiredAttributes: new Set([ "required" ]), losslessConversionTo: { bytes: (string) => Buffer.from(string, "utf8") } }, decimal: { requiredAttributes: new Set([ "required", "signed", "precision" ]), losslessConversionTo: { // Decimals are already internally represented as strings string: (decimal) => decimal } }, integer: { requiredAttributes: new Set([ "required", "signed" ]), losslessConversionTo: { string: (integer) => String(integer), decimal: (integer) => String(integer) } }, boolean: { requiredAttributes: new Set([ "required" ]), losslessConversionTo: {} }, date: { requiredAttributes: new Set([ "required", "withTimezone" ]), losslessConversionTo: {} }, duration: { requiredAttributes: new Set([ "required" ]), losslessConversionTo: {} }, }, attributes: { precision: { validForTypes: new Set([ "decimal" ]), isLossless: (oldSetting, newSetting) => (newSetting > oldSetting), losslessTransformer: (value) => value, // No change to value requiresMigrationDefault: false }, signed: { validForTypes: new Set([ "decimal", "integer" ]), isLossless: (oldSetting, newSetting) => (oldSetting === false && newSetting === true), losslessTransformer: (value, _oldAttribute, _newAttribute) => value, // No change requiresMigrationDefault: false, }, withTimezone: { validForTypes: new Set([ "date" ]), isLossless: (oldSetting, newSetting) => (oldSetting === false && newSetting === true), losslessTransformer: (value) => ({ ... value, timezone: lookupTimezoneName("Etc/UTC") }), requiresMigrationDefault: false }, required: { // Valid for all types validForTypes: true, isLossless: true, requiresMigrationDefault: true } }, operations: { // } };