From 5dc41700b86df18a25259a3b75936a8a9b265992 Mon Sep 17 00:00:00 2001 From: KoloMl Date: Wed, 19 Feb 2025 03:42:20 +0400 Subject: [PATCH] Introducing lists of importable entities, renaming some interfaces --- src/lib/extension/transporting/exporters.ts | 12 +++++++----- src/lib/extension/transporting/importables.ts | 18 ++++++++++++++++-- src/lib/extension/transporting/validators.ts | 4 ++-- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/lib/extension/transporting/exporters.ts b/src/lib/extension/transporting/exporters.ts index 16b173b..7e20f19 100644 --- a/src/lib/extension/transporting/exporters.ts +++ b/src/lib/extension/transporting/exporters.ts @@ -1,7 +1,7 @@ import StorageEntity from "$lib/extension/base/StorageEntity"; -import type { ImportableObject } from "$lib/extension/transporting/importables"; +import type { ImportableEntityObject } from "$lib/extension/transporting/importables"; -type ExporterFunction = (entity: EntityType) => ImportableObject; +type ExporterFunction = (entity: EntityType) => ImportableEntityObject; type ExportersMap = { [EntityName in keyof App.EntityNamesMap]: ExporterFunction; @@ -10,7 +10,8 @@ type ExportersMap = { const entitiesExporters: ExportersMap = { profiles: entity => { return { - v: 1, + $type: "profiles", + v: 2, id: entity.id, name: entity.settings.name, tags: entity.settings.tags, @@ -20,7 +21,8 @@ const entitiesExporters: ExportersMap = { }, groups: entity => { return { - v: 1, + $type: "groups", + v: 2, id: entity.id, name: entity.settings.name, tags: entity.settings.tags, @@ -33,7 +35,7 @@ const entitiesExporters: ExportersMap = { export function exportEntityToObject( entityName: EntityName, entityInstance: App.EntityNamesMap[EntityName] -): ImportableObject { +): ImportableEntityObject { if (!(entityName in entitiesExporters) || !entitiesExporters.hasOwnProperty(entityName)) { throw new Error(`Missing exporter for entity: ${entityName}`); } diff --git a/src/lib/extension/transporting/importables.ts b/src/lib/extension/transporting/importables.ts index 5109593..e60dca9 100644 --- a/src/lib/extension/transporting/importables.ts +++ b/src/lib/extension/transporting/importables.ts @@ -1,9 +1,23 @@ import type StorageEntity from "$lib/extension/base/StorageEntity"; +export interface ImportableElement { + /** + * Type of importable. Should be unique to properly import everything. + */ + $type: Type; +} + +export interface ImportableElementsList extends ImportableElement<"list"> { + /** + * List of elements inside. Elements could be of any type and should be checked and mapped. + */ + elements: ElementsType[]; +} + /** * Base information on the object which should be present on every entity. */ -export interface BaseImportableObject { +export interface BaseImportableEntity extends ImportableElement { /** * Numeric version of the entity for upgrading. */ @@ -18,5 +32,5 @@ export interface BaseImportableObject { * Utility type which combines base importable object and the entity type interfaces together. It strips away any types * defined for the properties, since imported object can not be trusted and should be type-checked by the validators. */ -export type ImportableObject = { [ObjectKey in keyof BaseImportableObject]: any } +export type ImportableEntityObject = { [ObjectKey in keyof BaseImportableEntity]: any } & { [SettingKey in keyof EntityType["settings"]]: any }; diff --git a/src/lib/extension/transporting/validators.ts b/src/lib/extension/transporting/validators.ts index 7b8283a..544029f 100644 --- a/src/lib/extension/transporting/validators.ts +++ b/src/lib/extension/transporting/validators.ts @@ -1,12 +1,12 @@ import type StorageEntity from "$lib/extension/base/StorageEntity"; -import type { ImportableObject } from "$lib/extension/transporting/importables"; +import type { ImportableEntityObject } from "$lib/extension/transporting/importables"; /** * Function for validating the entities. * @todo Probably would be better to replace the throw-catch method with some kind of result-error returning type. * Errors are only properly definable in the JSDoc. */ -type ValidationFunction = (importedObject: ImportableObject) => void; +type ValidationFunction = (importedObject: ImportableEntityObject) => void; /** * Mapping of validation functions for all entities present in the extension. Key is a name of entity and value is a