/** * Copyright (c) 2021 OpenLens Authors * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import type Conf from "conf"; import type { Migrations } from "conf/dist/source/types"; import logger from "../common/logger"; import { ExtendedMap, iter } from "../common/utils"; export function migrationLog(...args: any[]) { logger.info(...args); } export interface MigrationDeclaration { version: string, run(store: Conf): void; } export function joinMigrations(...declarations: MigrationDeclaration[]): Migrations { const migrations = new ExtendedMap) => void)[]>(); for (const decl of declarations) { migrations.getOrInsert(decl.version, () => []).push(decl.run); } return Object.fromEntries( iter.map( migrations, ([v, fns]) => [v, (store: Conf) => { migrationLog(`Running ${v} migration for ${store.path}`); for (const fn of fns) { fn(store); } }], ), ); }