You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.1 KiB
JavaScript

"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: {
//
}
};