From 390377932bc17752b4ea48c77b65fbfadecd163a Mon Sep 17 00:00:00 2001 From: arkcia Date: Tue, 25 Aug 2026 21:45:37 +0800 Subject: [PATCH] fix(template): preserve advanced template imports --- packages/core/src/services/data/manager.ts | 8 +- .../core/src/services/template/manager.ts | 168 ++++++------ packages/core/src/utils/error.ts | 7 + packages/core/tests/unit/data/manager.test.ts | 33 +++ .../tests/unit/template/import-export.test.ts | 240 ++++++++++++++++-- packages/desktop/main.js | 14 +- packages/ui/src/components/DataManager.vue | 3 +- 7 files changed, 370 insertions(+), 103 deletions(-) diff --git a/packages/core/src/services/data/manager.ts b/packages/core/src/services/data/manager.ts index 1b3ef13e..2475835a 100644 --- a/packages/core/src/services/data/manager.ts +++ b/packages/core/src/services/data/manager.ts @@ -10,7 +10,7 @@ import { DataInvalidFormatError, DataInvalidJsonError, } from './errors'; -import { toErrorWithCode } from '../../utils/error'; +import { stripErrorCodeMarkers, toErrorWithCode } from '../../utils/error'; /** * 数据导入导出管理器 @@ -142,7 +142,11 @@ export class DataManager implements IDataManager { await service.importData(dataToImport[dataKey]); console.log(`Successfully imported ${dataKey}`); } catch (error) { - const errorMessage = `Failed to import ${dataKey}: ${error instanceof Error ? error.message : String(error)}`; + // Nested structured errors may contain markers outside the leading position. + const detail = stripErrorCodeMarkers( + error instanceof Error ? error.message : String(error) + ); + const errorMessage = `Failed to import ${dataKey}: ${detail}`; errors.push(errorMessage); console.error(errorMessage, error); } diff --git a/packages/core/src/services/template/manager.ts b/packages/core/src/services/template/manager.ts index 00778a63..54419751 100644 --- a/packages/core/src/services/template/manager.ts +++ b/packages/core/src/services/template/manager.ts @@ -7,6 +7,7 @@ import { BuiltinTemplateLanguage, ITemplateLanguageService } from './languageSer import { CORE_SERVICE_KEYS } from '../../constants/storage-keys'; import { ImportExportError } from '../../interfaces/import-export'; import { IMPORT_EXPORT_ERROR_CODES, TEMPLATE_ERROR_CODES } from '../../constants/error-codes'; +import { stripErrorCodeMarkers } from '../../utils/error'; @@ -332,11 +333,67 @@ export class TemplateManager implements ITemplateManager { } } + /** + * Normalize and validate a template from imported data. + */ + private normalizeImportedTemplate( + item: unknown, + builtinTemplateIds: ReadonlySet = new Set() + ): Template { + if (typeof item !== 'object' || item === null) { + throw new TemplateValidationError('Template must be an object'); + } + + const template = item as Partial