node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
113 lines (112 loc) • 5.92 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.migrate = migrate;
exports.getCurrentVersion = getCurrentVersion;
exports.isMigrationArray = isMigrationArray;
const const_1 = require("../const");
const migrations_1 = __importDefault(require("../nodes/action/migrations"));
const migrations_2 = __importDefault(require("../nodes/api/migrations"));
const migrations_3 = __importDefault(require("../nodes/binary-sensor/migrations"));
const migrations_4 = __importDefault(require("../nodes/config-server/migrations"));
const migrations_5 = __importDefault(require("../nodes/current-state/migrations"));
const migrations_6 = __importDefault(require("../nodes/device/migrations"));
const migrations_7 = __importDefault(require("../nodes/device-config/migrations"));
const migrations_8 = __importDefault(require("../nodes/entity/migrations"));
const migrations_9 = __importDefault(require("../nodes/entity-config/migrations"));
const migrations_10 = __importDefault(require("../nodes/events-all/migrations"));
const migrations_11 = __importDefault(require("../nodes/events-calendar/migrations"));
const migrations_12 = __importDefault(require("../nodes/events-state/migrations"));
const migrations_13 = __importDefault(require("../nodes/fire-event/migrations"));
const migrations_14 = __importDefault(require("../nodes/get-entities/migrations"));
const migrations_15 = __importDefault(require("../nodes/get-history/migrations"));
const migrations_16 = __importDefault(require("../nodes/number/migrations"));
const migrations_17 = __importDefault(require("../nodes/poll-state/migrations"));
const migrations_18 = __importDefault(require("../nodes/render-template/migrations"));
const migrations_19 = __importDefault(require("../nodes/select/migrations"));
const migrations_20 = __importDefault(require("../nodes/sensor/migrations"));
const migrations_21 = __importDefault(require("../nodes/sentence/migrations"));
const migrations_22 = __importDefault(require("../nodes/switch/migrations"));
const migrations_23 = __importDefault(require("../nodes/tag/migrations"));
const migrations_24 = __importDefault(require("../nodes/text/migrations"));
const migrations_25 = __importDefault(require("../nodes/time/migrations"));
const migrations_26 = __importDefault(require("../nodes/trigger-state/migrations"));
const migrations_27 = __importDefault(require("../nodes/wait-until/migrations"));
const migrations_28 = __importDefault(require("../nodes/webhook/migrations"));
const migrations_29 = __importDefault(require("../nodes/zone/migrations"));
const nodeTypeTranslation = {
[const_1.NodeType.API]: migrations_2.default,
[const_1.NodeType.BinarySensor]: migrations_3.default,
[const_1.NodeType.Action]: migrations_1.default,
[const_1.NodeType.Server]: migrations_4.default,
[const_1.NodeType.CurrentState]: migrations_5.default,
[const_1.NodeType.Device]: migrations_6.default,
[const_1.NodeType.DeviceConfig]: migrations_7.default,
[const_1.NodeType.Entity]: migrations_8.default,
[const_1.NodeType.EntityConfig]: migrations_9.default,
[const_1.NodeType.EventsAll]: migrations_10.default,
[const_1.NodeType.EventsCalendar]: migrations_11.default,
[const_1.NodeType.EventsState]: migrations_12.default,
[const_1.NodeType.FireEvent]: migrations_13.default,
[const_1.NodeType.GetEntities]: migrations_14.default,
[const_1.NodeType.GetHistory]: migrations_15.default,
[const_1.NodeType.Number]: migrations_16.default,
[const_1.NodeType.PollState]: migrations_17.default,
[const_1.NodeType.RenderTemplate]: migrations_18.default,
[const_1.NodeType.Select]: migrations_19.default,
[const_1.NodeType.Sensor]: migrations_20.default,
[const_1.NodeType.Sentence]: migrations_21.default,
[const_1.NodeType.Switch]: migrations_22.default,
[const_1.NodeType.TriggerState]: migrations_26.default,
[const_1.NodeType.Tag]: migrations_23.default,
[const_1.NodeType.Text]: migrations_24.default,
[const_1.NodeType.Time]: migrations_25.default,
[const_1.NodeType.WaitUntil]: migrations_27.default,
[const_1.NodeType.Webhook]: migrations_28.default,
[const_1.NodeType.Zone]: migrations_29.default,
};
function migrate(schema) {
var _a;
const currentVersion = getCurrentVersion(schema.type);
if (schema.version !== undefined && schema.version >= currentVersion) {
return schema;
}
const currentMigration = (_a = findMigration(schema.type, schema.version)) === null || _a === void 0 ? void 0 : _a.up;
if (currentMigration) {
const newSchema = currentMigration(schema);
return migrate(newSchema);
}
return schema;
}
function findMigration(nodeType, version = -1) {
const migrations = getMigrationsByType(nodeType);
const migration = migrations === null || migrations === void 0 ? void 0 : migrations.find((m) => m.version === Number(version) + 1);
return migration;
}
function getMigrationsByType(nodeType) {
return nodeTypeTranslation[nodeType];
}
function getCurrentVersion(nodeType) {
var _a;
const migrations = (_a = getMigrationsByType(nodeType)) !== null && _a !== void 0 ? _a : [];
const currentVersion = migrations.reduce((acc, i) => {
return i.version > acc ? i.version : acc;
}, 0);
return currentVersion;
}
function isMigrationArray(migrations) {
if (!Array.isArray(migrations)) {
throw new Error('Migrations must be an array');
}
return migrations.every((m) => {
if (typeof m.version !== 'number') {
throw new Error('Migration version must be a number');
}
if (typeof m.up !== 'function') {
throw new Error('Migration up must be a function');
}
return true;
});
}