@integromat/module-migrator-core 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +11 -0
  2. package/cjs/lib/blueprint-parser.d.ts +7 -0
  3. package/cjs/lib/blueprint-parser.js +60 -0
  4. package/cjs/lib/blueprint-parser.js.map +1 -0
  5. package/cjs/lib/domain/field-entry.d.ts +16 -0
  6. package/cjs/lib/domain/field-entry.js +36 -0
  7. package/cjs/lib/domain/field-entry.js.map +1 -0
  8. package/cjs/lib/domain/field-mapping.d.ts +32 -0
  9. package/cjs/lib/domain/field-mapping.js +104 -0
  10. package/cjs/lib/domain/field-mapping.js.map +1 -0
  11. package/cjs/lib/domain/migration.d.ts +12 -0
  12. package/cjs/lib/domain/migration.js +19 -0
  13. package/cjs/lib/domain/migration.js.map +1 -0
  14. package/cjs/lib/errors/migration-error.d.ts +37 -0
  15. package/cjs/lib/errors/migration-error.js +53 -0
  16. package/cjs/lib/errors/migration-error.js.map +1 -0
  17. package/cjs/lib/expression-parser.d.ts +26 -0
  18. package/cjs/lib/expression-parser.js +155 -0
  19. package/cjs/lib/expression-parser.js.map +1 -0
  20. package/cjs/lib/migrator.d.ts +16 -0
  21. package/cjs/lib/migrator.js +264 -0
  22. package/cjs/lib/migrator.js.map +1 -0
  23. package/cjs/lib/ports/config-repository.d.ts +19 -0
  24. package/cjs/lib/ports/migration-service.d.ts +28 -0
  25. package/cjs/lib/schemas.d.ts +246 -0
  26. package/cjs/lib/types.d.ts +322 -0
  27. package/cjs/lib/types.js +81 -0
  28. package/cjs/lib/types.js.map +1 -0
  29. package/cjs/lib/utils/path.d.ts +25 -0
  30. package/cjs/lib/utils/path.js +55 -0
  31. package/cjs/lib/utils/path.js.map +1 -0
  32. package/cjs/lib/utils/type-guards.d.ts +16 -0
  33. package/cjs/lib/utils/type-guards.js +22 -0
  34. package/cjs/lib/utils/type-guards.js.map +1 -0
  35. package/cjs/lib/validation.d.ts +17 -0
  36. package/cjs/lib/validation.js +55 -0
  37. package/cjs/lib/validation.js.map +1 -0
  38. package/cjs/main.d.ts +9 -0
  39. package/cjs/main.js +24 -0
  40. package/cjs/main.js.map +1 -0
  41. package/esm/lib/blueprint-parser.d.ts +7 -0
  42. package/esm/lib/blueprint-parser.js +54 -0
  43. package/esm/lib/blueprint-parser.js.map +1 -0
  44. package/esm/lib/domain/field-entry.d.ts +16 -0
  45. package/esm/lib/domain/field-entry.js +32 -0
  46. package/esm/lib/domain/field-entry.js.map +1 -0
  47. package/esm/lib/domain/field-mapping.d.ts +32 -0
  48. package/esm/lib/domain/field-mapping.js +100 -0
  49. package/esm/lib/domain/field-mapping.js.map +1 -0
  50. package/esm/lib/domain/migration.d.ts +12 -0
  51. package/esm/lib/domain/migration.js +17 -0
  52. package/esm/lib/domain/migration.js.map +1 -0
  53. package/esm/lib/errors/migration-error.d.ts +37 -0
  54. package/esm/lib/errors/migration-error.js +50 -0
  55. package/esm/lib/errors/migration-error.js.map +1 -0
  56. package/esm/lib/expression-parser.d.ts +26 -0
  57. package/esm/lib/expression-parser.js +151 -0
  58. package/esm/lib/expression-parser.js.map +1 -0
  59. package/esm/lib/migrator.d.ts +16 -0
  60. package/esm/lib/migrator.js +262 -0
  61. package/esm/lib/migrator.js.map +1 -0
  62. package/esm/lib/ports/config-repository.d.ts +19 -0
  63. package/esm/lib/ports/migration-service.d.ts +28 -0
  64. package/esm/lib/schemas.d.ts +246 -0
  65. package/esm/lib/types.d.ts +322 -0
  66. package/esm/lib/types.js +74 -0
  67. package/esm/lib/types.js.map +1 -0
  68. package/esm/lib/utils/path.d.ts +25 -0
  69. package/esm/lib/utils/path.js +52 -0
  70. package/esm/lib/utils/path.js.map +1 -0
  71. package/esm/lib/utils/type-guards.d.ts +16 -0
  72. package/esm/lib/utils/type-guards.js +20 -0
  73. package/esm/lib/utils/type-guards.js.map +1 -0
  74. package/esm/lib/validation.d.ts +17 -0
  75. package/esm/lib/validation.js +51 -0
  76. package/esm/lib/validation.js.map +1 -0
  77. package/esm/main.d.ts +9 -0
  78. package/esm/main.js +6 -0
  79. package/esm/main.js.map +1 -0
  80. package/esm/package.json +3 -0
  81. package/package.json +35 -0
@@ -0,0 +1,262 @@
1
+ import { cloneBlueprint, collectAllModules } from './blueprint-parser.js';
2
+ import { flattenFieldMappings, buildOutputMappings, applyFieldMappings } from './domain/field-mapping.js';
3
+ import { findMigration } from './domain/migration.js';
4
+ import { MigrationError, MigrationErrorCode } from './errors/migration-error.js';
5
+ import { findAllReferences, rewriteReferences } from './expression-parser.js';
6
+ import { getRootField } from './utils/path.js';
7
+ import { isPlainObject } from './utils/type-guards.js';
8
+ import { validateBlueprint, validateBundle, validateModuleIds } from './validation.js';
9
+
10
+ /**
11
+ * Migrates mapper fields using field mappings.
12
+ * Returns the migrated mapper (does not mutate the original).
13
+ */
14
+ const migrateMapper = (flowModule, mapperMappings, messages) => {
15
+ if (!flowModule.mapper) {
16
+ return undefined;
17
+ }
18
+ return applyFieldMappings(flowModule.mapper, mapperMappings, messages);
19
+ };
20
+ /**
21
+ * Migrates parameters using field mappings.
22
+ * Returns the migrated parameters (does not mutate the original).
23
+ */
24
+ const migrateParameters = (flowModule, paramMappings, messages) => {
25
+ if (!flowModule.parameters) {
26
+ return undefined;
27
+ }
28
+ return applyFieldMappings(flowModule.parameters, paramMappings, messages);
29
+ };
30
+ /**
31
+ * Pre-builds a map from field names to referencing module IDs.
32
+ * Optimizes lookup from O(n) per field to O(1).
33
+ */
34
+ const buildFieldToModulesMap = (refs) => {
35
+ const fieldToModules = new Map();
36
+ for (const ref of refs) {
37
+ const field = ref.referencedField;
38
+ const rootField = getRootField(field);
39
+ // Add exact field reference
40
+ if (!fieldToModules.has(field)) {
41
+ fieldToModules.set(field, new Set());
42
+ }
43
+ fieldToModules.get(field).add(ref.moduleId);
44
+ // Add root field reference
45
+ if (rootField && rootField !== field) {
46
+ if (!fieldToModules.has(rootField)) {
47
+ fieldToModules.set(rootField, new Set());
48
+ }
49
+ fieldToModules.get(rootField).add(ref.moduleId);
50
+ }
51
+ }
52
+ return fieldToModules;
53
+ };
54
+ /**
55
+ * Gets all module IDs that reference a field or its descendants.
56
+ */
57
+ const getReferencingModules = (field, fieldToModules) => {
58
+ const moduleIds = new Set();
59
+ const rootField = getRootField(field);
60
+ // Exact match
61
+ const exactModules = fieldToModules.get(field);
62
+ if (exactModules) {
63
+ for (const id of exactModules) {
64
+ moduleIds.add(id);
65
+ }
66
+ }
67
+ // Root field match
68
+ if (rootField && rootField !== field) {
69
+ const rootModules = fieldToModules.get(rootField);
70
+ if (rootModules) {
71
+ for (const id of rootModules) {
72
+ moduleIds.add(id);
73
+ }
74
+ }
75
+ }
76
+ // Check for descendant references (field.* or field[*)
77
+ for (const [refField, modules] of fieldToModules) {
78
+ if (refField.startsWith(rootField + '.') || refField.startsWith(rootField + '[')) {
79
+ for (const id of modules) {
80
+ moduleIds.add(id);
81
+ }
82
+ }
83
+ }
84
+ return [...moduleIds];
85
+ };
86
+ /**
87
+ * Generates output messages for fields that were removed or renamed.
88
+ * Uses pre-built map for O(1) lookups instead of O(n) filtering per field.
89
+ */
90
+ const generateOutputMessages = (flatEntries, moduleId, messages, allModules, knownFields) => {
91
+ const refs = findAllReferences(allModules, moduleId);
92
+ const fieldToModules = buildFieldToModulesMap(refs);
93
+ const referencedFields = new Set(fieldToModules.keys());
94
+ for (const { field, mapsTo, note } of flatEntries) {
95
+ const rootField = getRootField(field);
96
+ const isReferenced = referencedFields.has(field) || referencedFields.has(rootField);
97
+ if (!isReferenced) {
98
+ continue;
99
+ }
100
+ const uniqueReferencingModules = getReferencingModules(field, fieldToModules);
101
+ if (mapsTo === undefined) {
102
+ messages.push({
103
+ type: 'warning',
104
+ category: 'output',
105
+ field,
106
+ message: `Output field '${field}' was removed and is referenced by other modules`,
107
+ note,
108
+ certain: true,
109
+ referencedBy: uniqueReferencingModules,
110
+ });
111
+ }
112
+ else if (mapsTo !== field) {
113
+ messages.push({
114
+ type: 'info',
115
+ category: 'output',
116
+ field,
117
+ message: `Output field '${field}' renamed to '${mapsTo}'`,
118
+ certain: true,
119
+ autoFixed: true,
120
+ referencedBy: uniqueReferencingModules,
121
+ });
122
+ }
123
+ }
124
+ for (const ref of refs) {
125
+ const rootField = getRootField(ref.referencedField);
126
+ if (rootField && !knownFields.has(rootField) && !knownFields.has(ref.referencedField)) {
127
+ messages.push({
128
+ type: 'warning',
129
+ category: 'output',
130
+ field: ref.referencedField,
131
+ message: `Output field '${ref.referencedField}' may no longer exist, please verify`,
132
+ certain: false,
133
+ referencedBy: [ref.moduleId],
134
+ });
135
+ }
136
+ }
137
+ };
138
+ /**
139
+ * Recursively rewrites field references in a mapper object.
140
+ * Mutates the object in place (called on already-cloned data).
141
+ */
142
+ const rewriteMapperReferences = (obj, targetModuleId, fieldMappings) => {
143
+ for (const key of Object.keys(obj)) {
144
+ const value = obj[key];
145
+ if (typeof value === 'string') {
146
+ const { newValue } = rewriteReferences(value, targetModuleId, fieldMappings);
147
+ if (newValue !== value) {
148
+ obj[key] = newValue;
149
+ }
150
+ }
151
+ else if (Array.isArray(value)) {
152
+ for (let i = 0; i < value.length; i += 1) {
153
+ const element = value[i];
154
+ if (isPlainObject(element)) {
155
+ rewriteMapperReferences(element, targetModuleId, fieldMappings);
156
+ }
157
+ else if (typeof element === 'string') {
158
+ const { newValue } = rewriteReferences(element, targetModuleId, fieldMappings);
159
+ if (newValue !== element) {
160
+ value[i] = newValue;
161
+ }
162
+ }
163
+ }
164
+ }
165
+ else if (isPlainObject(value)) {
166
+ rewriteMapperReferences(value, targetModuleId, fieldMappings);
167
+ }
168
+ }
169
+ };
170
+ const rewriteDownstreamReferences = (allModules, migratedModuleId, fieldMappings) => {
171
+ for (const flowModule of allModules) {
172
+ if (flowModule.id === migratedModuleId) {
173
+ continue;
174
+ }
175
+ if (!flowModule.mapper) {
176
+ continue;
177
+ }
178
+ rewriteMapperReferences(flowModule.mapper, migratedModuleId, fieldMappings);
179
+ }
180
+ };
181
+ /**
182
+ * Migrates a blueprint by applying module migrations.
183
+ * Validates inputs, applies field mappings, and generates a migration report.
184
+ *
185
+ * @param blueprint - The blueprint to migrate
186
+ * @param selectedModuleIds - IDs of modules to migrate
187
+ * @param config - Bundle containing migration configurations
188
+ * @returns Object containing migrated blueprint and migration report
189
+ * @throws MigrationError if validation fails or migration encounters an error
190
+ */
191
+ const migrateBlueprint = (blueprint, selectedModuleIds, config) => {
192
+ // Validate inputs
193
+ validateBlueprint(blueprint);
194
+ validateBundle(config);
195
+ validateModuleIds(selectedModuleIds);
196
+ const migrated = cloneBlueprint(blueprint);
197
+ const allModules = collectAllModules(migrated);
198
+ const report = {
199
+ summary: {
200
+ totalModules: allModules.length,
201
+ deprecatedFound: 0,
202
+ migrated: 0,
203
+ warnings: 0,
204
+ infos: 0,
205
+ },
206
+ modules: [],
207
+ };
208
+ const modulesToMigrate = allModules.filter((flowModule) => {
209
+ return selectedModuleIds.includes(flowModule.id);
210
+ });
211
+ for (const flowModule of modulesToMigrate) {
212
+ const migration = findMigration(config, flowModule.module, flowModule.version);
213
+ if (!migration) {
214
+ continue;
215
+ }
216
+ report.summary.deprecatedFound += 1;
217
+ const moduleReport = {
218
+ moduleId: flowModule.id,
219
+ fromModule: flowModule.module,
220
+ toModule: migration.to.module,
221
+ messages: [],
222
+ };
223
+ try {
224
+ flowModule.module = migration.to.module;
225
+ flowModule.version = migration.to.version;
226
+ if (flowModule.mapper && migration.mapper) {
227
+ flowModule.mapper = migrateMapper(flowModule, migration.mapper, moduleReport.messages);
228
+ }
229
+ if (flowModule.parameters && migration.parameters) {
230
+ flowModule.parameters = migrateParameters(flowModule, migration.parameters, moduleReport.messages);
231
+ }
232
+ // Create new metadata object with only designer preserved (immutable pattern)
233
+ if (flowModule.metadata) {
234
+ flowModule.metadata = { designer: flowModule.metadata.designer };
235
+ }
236
+ const outputs = migration.outputs ?? {};
237
+ const flatEntries = flattenFieldMappings(outputs);
238
+ const { fieldMappings, knownFields } = buildOutputMappings(outputs);
239
+ generateOutputMessages(flatEntries, flowModule.id, moduleReport.messages, allModules, knownFields);
240
+ rewriteDownstreamReferences(allModules, flowModule.id, fieldMappings);
241
+ report.modules.push(moduleReport);
242
+ report.summary.migrated += 1;
243
+ }
244
+ catch (error) {
245
+ throw new MigrationError(MigrationErrorCode.MIGRATION_FAILED, `Failed to migrate module ${flowModule.module}`, { moduleId: flowModule.id, cause: error });
246
+ }
247
+ }
248
+ for (const moduleReport of report.modules) {
249
+ for (const msg of moduleReport.messages) {
250
+ if (msg.type === 'warning') {
251
+ report.summary.warnings += 1;
252
+ }
253
+ else {
254
+ report.summary.infos += 1;
255
+ }
256
+ }
257
+ }
258
+ return { migratedBlueprint: migrated, report };
259
+ };
260
+
261
+ export { migrateBlueprint };
262
+ //# sourceMappingURL=migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.js","sources":["../../src/lib/migrator.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Bundle } from '../types.ts';
2
+ /**
3
+ * Port type for loading migration configuration.
4
+ * Adapters implement this to provide config from different sources
5
+ * (HTTP fetch, filesystem, in-memory, etc.)
6
+ */
7
+ type ConfigRepository = {
8
+ /**
9
+ * Load the migration configuration bundle.
10
+ * Implementations may cache internally.
11
+ */
12
+ load: () => Promise<Bundle>;
13
+ /**
14
+ * Get cached config if available, null otherwise.
15
+ * Does not trigger loading.
16
+ */
17
+ getCached: () => Bundle | null;
18
+ };
19
+ export type { ConfigRepository };
@@ -0,0 +1,28 @@
1
+ import type { Blueprint, Bundle, DeprecatedModule, MigrationReport } from '../types.ts';
2
+ /**
3
+ * Port type for the migration use cases.
4
+ * This is the primary driving port - what consumers call.
5
+ */
6
+ type MigrationService = {
7
+ /**
8
+ * Parse a blueprint JSON string into a Blueprint object.
9
+ */
10
+ parseBlueprint: (json: string) => Blueprint;
11
+ /**
12
+ * Find all modules in a blueprint that have available migrations.
13
+ */
14
+ findDeprecatedModules: (blueprint: Blueprint, config: Bundle) => DeprecatedModule[];
15
+ /**
16
+ * Migrate selected modules in a blueprint to newer versions.
17
+ * Returns the migrated blueprint and a report of changes.
18
+ */
19
+ migrateBlueprint: (blueprint: Blueprint, selectedModuleIds: number[], config: Bundle) => {
20
+ migratedBlueprint: Blueprint;
21
+ report: MigrationReport;
22
+ };
23
+ /**
24
+ * Serialize a blueprint back to JSON string.
25
+ */
26
+ serializeBlueprint: (blueprint: Blueprint) => string;
27
+ };
28
+ export type { MigrationService };
@@ -0,0 +1,246 @@
1
+ import type { Static } from '@sinclair/typebox';
2
+ /**
3
+ * Schema for FieldEntry - union of keep, map, or remove.
4
+ */
5
+ declare const FieldEntrySchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
6
+ op: import("@sinclair/typebox").TLiteral<"keep">;
7
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
8
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
9
+ }>, import("@sinclair/typebox").TObject<{
10
+ op: import("@sinclair/typebox").TLiteral<"map">;
11
+ to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
12
+ toSection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"parameters">, import("@sinclair/typebox").TLiteral<"mapper">]>>;
13
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
14
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
15
+ }>, import("@sinclair/typebox").TObject<{
16
+ op: import("@sinclair/typebox").TLiteral<"remove">;
17
+ note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
18
+ }>]>;
19
+ /**
20
+ * Schema for FieldMappings - record of field name to entry.
21
+ */
22
+ declare const FieldMappingsSchema: import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
23
+ op: import("@sinclair/typebox").TLiteral<"keep">;
24
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
25
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
26
+ }>, import("@sinclair/typebox").TObject<{
27
+ op: import("@sinclair/typebox").TLiteral<"map">;
28
+ to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
29
+ toSection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"parameters">, import("@sinclair/typebox").TLiteral<"mapper">]>>;
30
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
31
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
32
+ }>, import("@sinclair/typebox").TObject<{
33
+ op: import("@sinclair/typebox").TLiteral<"remove">;
34
+ note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
35
+ }>]>>;
36
+ /**
37
+ * Schema for MigrationConfigV1.
38
+ */
39
+ declare const MigrationConfigV1Schema: import("@sinclair/typebox").TObject<{
40
+ configVersion: import("@sinclair/typebox").TLiteral<"1.0">;
41
+ from: import("@sinclair/typebox").TObject<{
42
+ module: import("@sinclair/typebox").TString;
43
+ version: import("@sinclair/typebox").TNumber;
44
+ }>;
45
+ to: import("@sinclair/typebox").TObject<{
46
+ module: import("@sinclair/typebox").TString;
47
+ version: import("@sinclair/typebox").TNumber;
48
+ }>;
49
+ parameters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
50
+ op: import("@sinclair/typebox").TLiteral<"keep">;
51
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
52
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
53
+ }>, import("@sinclair/typebox").TObject<{
54
+ op: import("@sinclair/typebox").TLiteral<"map">;
55
+ to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
56
+ toSection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"parameters">, import("@sinclair/typebox").TLiteral<"mapper">]>>;
57
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
58
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
59
+ }>, import("@sinclair/typebox").TObject<{
60
+ op: import("@sinclair/typebox").TLiteral<"remove">;
61
+ note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
62
+ }>]>>>;
63
+ mapper: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
64
+ op: import("@sinclair/typebox").TLiteral<"keep">;
65
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
66
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
67
+ }>, import("@sinclair/typebox").TObject<{
68
+ op: import("@sinclair/typebox").TLiteral<"map">;
69
+ to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
70
+ toSection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"parameters">, import("@sinclair/typebox").TLiteral<"mapper">]>>;
71
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
72
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
73
+ }>, import("@sinclair/typebox").TObject<{
74
+ op: import("@sinclair/typebox").TLiteral<"remove">;
75
+ note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
76
+ }>]>>>;
77
+ outputs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
78
+ op: import("@sinclair/typebox").TLiteral<"keep">;
79
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
80
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
81
+ }>, import("@sinclair/typebox").TObject<{
82
+ op: import("@sinclair/typebox").TLiteral<"map">;
83
+ to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
84
+ toSection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"parameters">, import("@sinclair/typebox").TLiteral<"mapper">]>>;
85
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
86
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
87
+ }>, import("@sinclair/typebox").TObject<{
88
+ op: import("@sinclair/typebox").TLiteral<"remove">;
89
+ note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
90
+ }>]>>>;
91
+ }>;
92
+ /**
93
+ * Schema for Bundle containing migration configurations.
94
+ */
95
+ declare const BundleSchema: import("@sinclair/typebox").TObject<{
96
+ generatedAt: import("@sinclair/typebox").TString;
97
+ migrations: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
98
+ configVersion: import("@sinclair/typebox").TLiteral<"1.0">;
99
+ from: import("@sinclair/typebox").TObject<{
100
+ module: import("@sinclair/typebox").TString;
101
+ version: import("@sinclair/typebox").TNumber;
102
+ }>;
103
+ to: import("@sinclair/typebox").TObject<{
104
+ module: import("@sinclair/typebox").TString;
105
+ version: import("@sinclair/typebox").TNumber;
106
+ }>;
107
+ parameters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
108
+ op: import("@sinclair/typebox").TLiteral<"keep">;
109
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
110
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
111
+ }>, import("@sinclair/typebox").TObject<{
112
+ op: import("@sinclair/typebox").TLiteral<"map">;
113
+ to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
114
+ toSection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"parameters">, import("@sinclair/typebox").TLiteral<"mapper">]>>;
115
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
116
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
117
+ }>, import("@sinclair/typebox").TObject<{
118
+ op: import("@sinclair/typebox").TLiteral<"remove">;
119
+ note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
120
+ }>]>>>;
121
+ mapper: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
122
+ op: import("@sinclair/typebox").TLiteral<"keep">;
123
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
124
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
125
+ }>, import("@sinclair/typebox").TObject<{
126
+ op: import("@sinclair/typebox").TLiteral<"map">;
127
+ to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
128
+ toSection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"parameters">, import("@sinclair/typebox").TLiteral<"mapper">]>>;
129
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
130
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
131
+ }>, import("@sinclair/typebox").TObject<{
132
+ op: import("@sinclair/typebox").TLiteral<"remove">;
133
+ note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
134
+ }>]>>>;
135
+ outputs: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
136
+ op: import("@sinclair/typebox").TLiteral<"keep">;
137
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
138
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
139
+ }>, import("@sinclair/typebox").TObject<{
140
+ op: import("@sinclair/typebox").TLiteral<"map">;
141
+ to: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
142
+ toSection: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"parameters">, import("@sinclair/typebox").TLiteral<"mapper">]>>;
143
+ fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
144
+ items: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRef<import("@sinclair/typebox").TSchema>>;
145
+ }>, import("@sinclair/typebox").TObject<{
146
+ op: import("@sinclair/typebox").TLiteral<"remove">;
147
+ note: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
148
+ }>]>>>;
149
+ }>>;
150
+ }>;
151
+ /**
152
+ * Schema for FlowModule (recursive for routes).
153
+ */
154
+ declare const FlowModuleSchema: import("@sinclair/typebox").TRecursive<import("@sinclair/typebox").TObject<{
155
+ id: import("@sinclair/typebox").TNumber;
156
+ module: import("@sinclair/typebox").TString;
157
+ version: import("@sinclair/typebox").TNumber;
158
+ parameters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
159
+ mapper: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
160
+ metadata: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
161
+ designer: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
162
+ x: import("@sinclair/typebox").TNumber;
163
+ y: import("@sinclair/typebox").TNumber;
164
+ }>>;
165
+ expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
166
+ interface: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
167
+ restore: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
168
+ parameters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
169
+ }>>;
170
+ routes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
171
+ flow: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TThis>;
172
+ }>>>;
173
+ }>>;
174
+ /**
175
+ * Schema for Blueprint.
176
+ */
177
+ declare const BlueprintSchema: import("@sinclair/typebox").TObject<{
178
+ name: import("@sinclair/typebox").TString;
179
+ flow: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TRecursive<import("@sinclair/typebox").TObject<{
180
+ id: import("@sinclair/typebox").TNumber;
181
+ module: import("@sinclair/typebox").TString;
182
+ version: import("@sinclair/typebox").TNumber;
183
+ parameters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
184
+ mapper: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
185
+ metadata: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
186
+ designer: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
187
+ x: import("@sinclair/typebox").TNumber;
188
+ y: import("@sinclair/typebox").TNumber;
189
+ }>>;
190
+ expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
191
+ interface: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
192
+ restore: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
193
+ parameters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
194
+ }>>;
195
+ routes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
196
+ flow: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TThis>;
197
+ }>>>;
198
+ }>>>;
199
+ metadata: import("@sinclair/typebox").TObject<{
200
+ instant: import("@sinclair/typebox").TBoolean;
201
+ version: import("@sinclair/typebox").TNumber;
202
+ scenario: import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>;
203
+ designer: import("@sinclair/typebox").TObject<{
204
+ orphans: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TRecursive<import("@sinclair/typebox").TObject<{
205
+ id: import("@sinclair/typebox").TNumber;
206
+ module: import("@sinclair/typebox").TString;
207
+ version: import("@sinclair/typebox").TNumber;
208
+ parameters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
209
+ mapper: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
210
+ metadata: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
211
+ designer: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
212
+ x: import("@sinclair/typebox").TNumber;
213
+ y: import("@sinclair/typebox").TNumber;
214
+ }>>;
215
+ expect: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
216
+ interface: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
217
+ restore: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
218
+ parameters: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>>;
219
+ }>>;
220
+ routes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
221
+ flow: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TThis>;
222
+ }>>>;
223
+ }>>>;
224
+ }>;
225
+ zone: import("@sinclair/typebox").TString;
226
+ notes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>;
227
+ }>;
228
+ }>;
229
+ type Blueprint = Static<typeof BlueprintSchema>;
230
+ type Bundle = Static<typeof BundleSchema>;
231
+ /**
232
+ * Validates a blueprint using TypeBox schema.
233
+ * Throws MigrationError if validation fails.
234
+ */
235
+ declare const validateBlueprint: (value: unknown) => Blueprint;
236
+ /**
237
+ * Validates a bundle using TypeBox schema.
238
+ * Throws MigrationError if validation fails.
239
+ */
240
+ declare const validateBundle: (value: unknown) => Bundle;
241
+ /**
242
+ * Validates an array of module IDs.
243
+ * Throws MigrationError if validation fails.
244
+ */
245
+ declare const validateModuleIds: (value: unknown) => number[];
246
+ export { BlueprintSchema, BundleSchema, FieldEntrySchema, FieldMappingsSchema, FlowModuleSchema, MigrationConfigV1Schema, validateBlueprint, validateBundle, validateModuleIds, };