rawsql-ts 0.11.0-beta → 0.11.2-beta
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.
- package/README.md +1 -3
- package/dist/esm/index.js +8 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +47 -13
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/src/index.js +8 -1
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/parsers/ValueParser.js +86 -4
- package/dist/esm/src/parsers/ValueParser.js.map +1 -1
- package/dist/esm/src/tokenReaders/OperatorTokenReader.js +4 -0
- package/dist/esm/src/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/CTEDependencyTracer.js +249 -0
- package/dist/esm/src/transformers/CTEDependencyTracer.js.map +1 -0
- package/dist/esm/src/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/esm/src/transformers/EnhancedJsonMapping.js +217 -0
- package/dist/esm/src/transformers/EnhancedJsonMapping.js.map +1 -0
- package/dist/esm/src/transformers/JsonMappingConverter.js +388 -0
- package/dist/esm/src/transformers/JsonMappingConverter.js.map +1 -0
- package/dist/esm/src/transformers/JsonMappingUnifier.js +207 -0
- package/dist/esm/src/transformers/JsonMappingUnifier.js.map +1 -0
- package/dist/esm/src/transformers/ModelDrivenJsonMapping.js +115 -0
- package/dist/esm/src/transformers/ModelDrivenJsonMapping.js.map +1 -0
- package/dist/esm/src/transformers/PostgresArrayEntityCteBuilder.js +293 -70
- package/dist/esm/src/transformers/PostgresArrayEntityCteBuilder.js.map +1 -1
- package/dist/esm/src/transformers/PostgresJsonQueryBuilder.js +26 -15
- package/dist/esm/src/transformers/PostgresJsonQueryBuilder.js.map +1 -1
- package/dist/esm/src/transformers/PostgresObjectEntityCteBuilder.js +75 -15
- package/dist/esm/src/transformers/PostgresObjectEntityCteBuilder.js.map +1 -1
- package/dist/esm/src/transformers/SelectableColumnCollector.js +17 -5
- package/dist/esm/src/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/esm/src/transformers/SqlParamInjector.js +189 -108
- package/dist/esm/src/transformers/SqlParamInjector.js.map +1 -1
- package/dist/esm/src/transformers/UnifiedJsonMapping.js +2 -4
- package/dist/esm/src/transformers/UnifiedJsonMapping.js.map +1 -1
- package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js +51 -3
- package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
- package/dist/esm/src/utils/OperatorPrecedence.js +3 -1
- package/dist/esm/src/utils/OperatorPrecedence.js.map +1 -1
- package/dist/esm/src/utils/SchemaManager.js +0 -1
- package/dist/esm/src/utils/SchemaManager.js.map +1 -1
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/esm/types/src/index.d.ts +8 -1
- package/dist/esm/types/src/parsers/ValueParser.d.ts +8 -0
- package/dist/esm/types/src/transformers/CTEDependencyTracer.d.ts +58 -0
- package/dist/esm/types/src/transformers/DynamicQueryBuilder.d.ts +6 -0
- package/dist/esm/types/src/transformers/EnhancedJsonMapping.d.ts +194 -0
- package/dist/esm/types/src/transformers/JsonMappingConverter.d.ts +200 -0
- package/dist/esm/types/src/transformers/JsonMappingUnifier.d.ts +100 -0
- package/dist/esm/types/src/transformers/ModelDrivenJsonMapping.d.ts +62 -0
- package/dist/esm/types/src/transformers/PostgresArrayEntityCteBuilder.d.ts +93 -52
- package/dist/esm/types/src/transformers/PostgresJsonQueryBuilder.d.ts +3 -3
- package/dist/esm/types/src/transformers/PostgresObjectEntityCteBuilder.d.ts +31 -6
- package/dist/esm/types/src/transformers/SelectableColumnCollector.d.ts +14 -3
- package/dist/esm/types/src/transformers/SqlParamInjector.d.ts +48 -0
- package/dist/esm/types/src/transformers/UnifiedJsonMapping.d.ts +0 -1
- package/dist/esm/types/src/transformers/UpstreamSelectQueryFinder.d.ts +13 -1
- package/dist/index.min.js +47 -13
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +8 -1
- package/dist/src/index.js +15 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/parsers/ValueParser.d.ts +8 -0
- package/dist/src/parsers/ValueParser.js +86 -4
- package/dist/src/parsers/ValueParser.js.map +1 -1
- package/dist/src/tokenReaders/OperatorTokenReader.js +4 -0
- package/dist/src/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/src/transformers/CTEDependencyTracer.d.ts +58 -0
- package/dist/src/transformers/CTEDependencyTracer.js +253 -0
- package/dist/src/transformers/CTEDependencyTracer.js.map +1 -0
- package/dist/src/transformers/DynamicQueryBuilder.d.ts +6 -0
- package/dist/src/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/src/transformers/EnhancedJsonMapping.d.ts +194 -0
- package/dist/src/transformers/EnhancedJsonMapping.js +223 -0
- package/dist/src/transformers/EnhancedJsonMapping.js.map +1 -0
- package/dist/src/transformers/JsonMappingConverter.d.ts +200 -0
- package/dist/src/transformers/JsonMappingConverter.js +392 -0
- package/dist/src/transformers/JsonMappingConverter.js.map +1 -0
- package/dist/src/transformers/JsonMappingUnifier.d.ts +100 -0
- package/dist/src/transformers/JsonMappingUnifier.js +216 -0
- package/dist/src/transformers/JsonMappingUnifier.js.map +1 -0
- package/dist/src/transformers/ModelDrivenJsonMapping.d.ts +62 -0
- package/dist/src/transformers/ModelDrivenJsonMapping.js +122 -0
- package/dist/src/transformers/ModelDrivenJsonMapping.js.map +1 -0
- package/dist/src/transformers/PostgresArrayEntityCteBuilder.d.ts +93 -52
- package/dist/src/transformers/PostgresArrayEntityCteBuilder.js +293 -70
- package/dist/src/transformers/PostgresArrayEntityCteBuilder.js.map +1 -1
- package/dist/src/transformers/PostgresJsonQueryBuilder.d.ts +3 -3
- package/dist/src/transformers/PostgresJsonQueryBuilder.js +26 -15
- package/dist/src/transformers/PostgresJsonQueryBuilder.js.map +1 -1
- package/dist/src/transformers/PostgresObjectEntityCteBuilder.d.ts +31 -6
- package/dist/src/transformers/PostgresObjectEntityCteBuilder.js +75 -15
- package/dist/src/transformers/PostgresObjectEntityCteBuilder.js.map +1 -1
- package/dist/src/transformers/SelectableColumnCollector.d.ts +14 -3
- package/dist/src/transformers/SelectableColumnCollector.js +17 -5
- package/dist/src/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/src/transformers/SqlParamInjector.d.ts +48 -0
- package/dist/src/transformers/SqlParamInjector.js +189 -108
- package/dist/src/transformers/SqlParamInjector.js.map +1 -1
- package/dist/src/transformers/UnifiedJsonMapping.d.ts +0 -1
- package/dist/src/transformers/UnifiedJsonMapping.js +2 -4
- package/dist/src/transformers/UnifiedJsonMapping.js.map +1 -1
- package/dist/src/transformers/UpstreamSelectQueryFinder.d.ts +13 -1
- package/dist/src/transformers/UpstreamSelectQueryFinder.js +51 -3
- package/dist/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
- package/dist/src/utils/OperatorPrecedence.js +3 -1
- package/dist/src/utils/OperatorPrecedence.js.map +1 -1
- package/dist/src/utils/SchemaManager.js +0 -1
- package/dist/src/utils/SchemaManager.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified JSON Mapping processor that supports both legacy and model-driven formats.
|
|
3
|
+
*
|
|
4
|
+
* @deprecated Use JsonMappingConverter instead. This module is kept for backward compatibility.
|
|
5
|
+
* This module provides backward compatibility while encouraging migration to the model-driven format.
|
|
6
|
+
* It automatically detects the input format and normalizes to a consistent internal representation.
|
|
7
|
+
*/
|
|
8
|
+
import { JsonMappingConverter } from './JsonMappingConverter';
|
|
9
|
+
/**
|
|
10
|
+
* Detects the format of a JSON mapping configuration.
|
|
11
|
+
*
|
|
12
|
+
* @param input - The mapping configuration to analyze
|
|
13
|
+
* @returns The detected format type
|
|
14
|
+
*/
|
|
15
|
+
export function detectMappingFormat(input) {
|
|
16
|
+
// Model-driven format: has typeInfo and structure
|
|
17
|
+
if (input.typeInfo && input.structure) {
|
|
18
|
+
return 'model-driven';
|
|
19
|
+
}
|
|
20
|
+
// Unified format: has rootName and rootEntity
|
|
21
|
+
if (input.rootName && input.rootEntity) {
|
|
22
|
+
return 'unified';
|
|
23
|
+
}
|
|
24
|
+
// Legacy format: direct JsonMapping structure
|
|
25
|
+
if (input.columns || input.relationships) {
|
|
26
|
+
return 'legacy';
|
|
27
|
+
}
|
|
28
|
+
// Default fallback
|
|
29
|
+
return 'legacy';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Converts legacy unified format to JsonMapping.
|
|
33
|
+
*
|
|
34
|
+
* @param input - Unified format mapping configuration
|
|
35
|
+
* @returns Converted JsonMapping
|
|
36
|
+
*/
|
|
37
|
+
function convertUnifiedFormat(input) {
|
|
38
|
+
if (!input.rootEntity) {
|
|
39
|
+
throw new Error('Unified format requires rootEntity');
|
|
40
|
+
}
|
|
41
|
+
const result = {
|
|
42
|
+
rootName: input.rootName || 'root',
|
|
43
|
+
rootEntity: {
|
|
44
|
+
id: input.rootEntity.id || 'root',
|
|
45
|
+
name: input.rootEntity.name || 'Root',
|
|
46
|
+
columns: input.rootEntity.columns || {}
|
|
47
|
+
},
|
|
48
|
+
nestedEntities: []
|
|
49
|
+
};
|
|
50
|
+
// Convert nestedEntities
|
|
51
|
+
if (input.nestedEntities && Array.isArray(input.nestedEntities)) {
|
|
52
|
+
result.nestedEntities = input.nestedEntities.map(entity => ({
|
|
53
|
+
id: entity.id || entity.propertyName || 'nested',
|
|
54
|
+
name: entity.name || entity.propertyName || 'Nested',
|
|
55
|
+
parentId: entity.parentId || result.rootEntity.id,
|
|
56
|
+
propertyName: entity.propertyName || 'nested',
|
|
57
|
+
relationshipType: entity.relationshipType || 'object',
|
|
58
|
+
columns: entity.columns || {}
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Converts legacy format directly to JsonMapping.
|
|
65
|
+
*
|
|
66
|
+
* @param input - Legacy format mapping configuration
|
|
67
|
+
* @returns JsonMapping
|
|
68
|
+
*/
|
|
69
|
+
function convertLegacyFormat(input) {
|
|
70
|
+
const result = {
|
|
71
|
+
rootName: input.rootName || 'root',
|
|
72
|
+
rootEntity: {
|
|
73
|
+
id: 'root',
|
|
74
|
+
name: input.rootName || 'Root',
|
|
75
|
+
columns: input.columns || {}
|
|
76
|
+
},
|
|
77
|
+
nestedEntities: []
|
|
78
|
+
};
|
|
79
|
+
// Convert relationships to nestedEntities
|
|
80
|
+
if (input.relationships && typeof input.relationships === 'object') {
|
|
81
|
+
for (const [propertyName, relationship] of Object.entries(input.relationships)) {
|
|
82
|
+
// Type assertion for legacy relationship format
|
|
83
|
+
const rel = relationship;
|
|
84
|
+
result.nestedEntities.push({
|
|
85
|
+
id: propertyName,
|
|
86
|
+
name: propertyName.charAt(0).toUpperCase() + propertyName.slice(1),
|
|
87
|
+
parentId: 'root',
|
|
88
|
+
propertyName,
|
|
89
|
+
relationshipType: rel.type === 'hasMany' ? 'array' : 'object',
|
|
90
|
+
columns: rel.columns || {}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Main processor that unifies all JSON mapping formats into a consistent JsonMapping.
|
|
98
|
+
*
|
|
99
|
+
* @deprecated Use JsonMappingConverter.convert() instead.
|
|
100
|
+
*
|
|
101
|
+
* Features:
|
|
102
|
+
* - Automatic format detection
|
|
103
|
+
* - Backward compatibility with all existing formats
|
|
104
|
+
* - Metadata preservation for advanced features
|
|
105
|
+
* - Zero external dependencies
|
|
106
|
+
*
|
|
107
|
+
* @param input - Any supported JSON mapping format
|
|
108
|
+
* @returns Unified processing result with JsonMapping and metadata
|
|
109
|
+
*/
|
|
110
|
+
export function processJsonMapping(input) {
|
|
111
|
+
var _a;
|
|
112
|
+
// Runtime deprecation warning
|
|
113
|
+
console.warn('⚠️ DEPRECATED: processJsonMapping() is deprecated. Use JsonMappingConverter.convert() instead.');
|
|
114
|
+
console.warn('Migration guide: https://github.com/mk3008/rawsql-ts/blob/main/docs/migration-guide.md');
|
|
115
|
+
// Check for legacy format with columns and relationships
|
|
116
|
+
if ((input.columns || input.relationships) && !input.rootName && !input.rootEntity) {
|
|
117
|
+
const jsonMapping = convertLegacyFormat(input);
|
|
118
|
+
return {
|
|
119
|
+
format: 'legacy',
|
|
120
|
+
jsonMapping,
|
|
121
|
+
originalInput: input,
|
|
122
|
+
metadata: {}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const converter = new JsonMappingConverter();
|
|
126
|
+
const result = converter.convert(input);
|
|
127
|
+
// Map converter formats to unifier formats for backward compatibility
|
|
128
|
+
let format = result.format;
|
|
129
|
+
// If it's detected as 'legacy' by converter but has rootName and rootEntity, it's 'unified' format
|
|
130
|
+
if (result.format === 'legacy' && input.rootName && input.rootEntity) {
|
|
131
|
+
format = 'unified';
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
format,
|
|
135
|
+
jsonMapping: result.mapping,
|
|
136
|
+
originalInput: input,
|
|
137
|
+
metadata: {
|
|
138
|
+
typeInfo: (_a = result.metadata) === null || _a === void 0 ? void 0 : _a.typeInfo,
|
|
139
|
+
typeProtection: result.typeProtection
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Convenience function for direct JsonMapping extraction.
|
|
145
|
+
*
|
|
146
|
+
* @deprecated Use JsonMappingConverter.toLegacyMapping() instead.
|
|
147
|
+
*
|
|
148
|
+
* @param input - Any supported JSON mapping format
|
|
149
|
+
* @returns JsonMapping ready for use with PostgresJsonQueryBuilder
|
|
150
|
+
*/
|
|
151
|
+
export function unifyJsonMapping(input) {
|
|
152
|
+
// Runtime deprecation warning
|
|
153
|
+
console.warn('⚠️ DEPRECATED: unifyJsonMapping() is deprecated. Use JsonMappingConverter.toLegacyMapping() instead.');
|
|
154
|
+
console.warn('Migration guide: https://github.com/mk3008/rawsql-ts/blob/main/docs/migration-guide.md');
|
|
155
|
+
const converter = new JsonMappingConverter();
|
|
156
|
+
return converter.toLegacyMapping(input);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Type guard to check if input uses model-driven format.
|
|
160
|
+
*
|
|
161
|
+
* @param input - Mapping input to check
|
|
162
|
+
* @returns True if input is model-driven format
|
|
163
|
+
*/
|
|
164
|
+
export function isModelDrivenFormat(input) {
|
|
165
|
+
return detectMappingFormat(input) === 'model-driven';
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Type guard to check if input uses unified format.
|
|
169
|
+
*
|
|
170
|
+
* @param input - Mapping input to check
|
|
171
|
+
* @returns True if input is unified format
|
|
172
|
+
*/
|
|
173
|
+
export function isUnifiedFormat(input) {
|
|
174
|
+
return detectMappingFormat(input) === 'unified';
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Type guard to check if input uses legacy format.
|
|
178
|
+
*
|
|
179
|
+
* @param input - Mapping input to check
|
|
180
|
+
* @returns True if input is legacy format
|
|
181
|
+
*/
|
|
182
|
+
export function isLegacyFormat(input) {
|
|
183
|
+
return detectMappingFormat(input) === 'legacy';
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Migration helper that suggests upgrading to model-driven format.
|
|
187
|
+
*
|
|
188
|
+
* @param input - Current mapping configuration
|
|
189
|
+
* @returns Suggestions for migration (if applicable)
|
|
190
|
+
*/
|
|
191
|
+
export function suggestModelDrivenMigration(input) {
|
|
192
|
+
const format = detectMappingFormat(input);
|
|
193
|
+
const suggestions = [];
|
|
194
|
+
if (format !== 'model-driven') {
|
|
195
|
+
suggestions.push('Consider migrating to model-driven JSON mapping format');
|
|
196
|
+
suggestions.push('Benefits: Better type safety, IDE support, and future-proof design');
|
|
197
|
+
suggestions.push('See: Model-Driven JSON Mapping Guide for migration instructions');
|
|
198
|
+
if (format === 'unified') {
|
|
199
|
+
suggestions.push('Your current unified format can be automatically converted');
|
|
200
|
+
}
|
|
201
|
+
if (format === 'legacy') {
|
|
202
|
+
suggestions.push('Legacy format support will be maintained but new features target model-driven format');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return suggestions;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=JsonMappingUnifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonMappingUnifier.js","sourceRoot":"","sources":["../../../../src/transformers/JsonMappingUnifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-driven JSON mapping structure that mirrors TypeScript model definitions.
|
|
3
|
+
* This approach provides intuitive, hierarchical mapping that closely resembles the target data structure.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert a model-driven JSON mapping to the traditional JsonMapping format.
|
|
7
|
+
* This enables backward compatibility with existing PostgresJsonQueryBuilder.
|
|
8
|
+
*/
|
|
9
|
+
export function convertModelDrivenMapping(modelMapping) {
|
|
10
|
+
const protectedStringFields = [];
|
|
11
|
+
let entityIdCounter = 0;
|
|
12
|
+
const propertyNameCounters = {};
|
|
13
|
+
// Generate unique entity IDs
|
|
14
|
+
const generateEntityId = () => `entity_${++entityIdCounter}`;
|
|
15
|
+
// Generate unique property names to avoid JSON key conflicts
|
|
16
|
+
const generateUniquePropertyName = (baseName) => {
|
|
17
|
+
if (!propertyNameCounters[baseName]) {
|
|
18
|
+
propertyNameCounters[baseName] = 0;
|
|
19
|
+
}
|
|
20
|
+
propertyNameCounters[baseName]++;
|
|
21
|
+
return propertyNameCounters[baseName] === 1 ? baseName : `${baseName}_${propertyNameCounters[baseName]}`;
|
|
22
|
+
};
|
|
23
|
+
// Helper function to process structure fields and extract entities
|
|
24
|
+
const processStructure = (structure, parentId = null) => {
|
|
25
|
+
const columns = {};
|
|
26
|
+
const nestedEntities = [];
|
|
27
|
+
for (const [fieldName, config] of Object.entries(structure)) {
|
|
28
|
+
if (typeof config === 'string') {
|
|
29
|
+
// Simple field mapping: "fieldName": "column_name"
|
|
30
|
+
columns[fieldName] = config;
|
|
31
|
+
}
|
|
32
|
+
else if ('column' in config && typeof config.column === 'string' && !('type' in config && (config.type === 'object' || config.type === 'array'))) {
|
|
33
|
+
// Enhanced field mapping: "fieldName": { "column": "column_name", "type": "string" }
|
|
34
|
+
const fieldConfig = config;
|
|
35
|
+
if (typeof fieldConfig === 'object' && 'column' in fieldConfig) {
|
|
36
|
+
columns[fieldName] = fieldConfig.column;
|
|
37
|
+
if (fieldConfig.type === 'string') {
|
|
38
|
+
protectedStringFields.push(fieldConfig.column);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if ('from' in config && typeof config.from === 'string' && !('type' in config && (config.type === 'object' || config.type === 'array'))) {
|
|
43
|
+
// Legacy field mapping: "fieldName": { "from": "column_name", "type": "string" }
|
|
44
|
+
const fieldConfig = config;
|
|
45
|
+
if (typeof fieldConfig === 'object' && 'from' in fieldConfig) {
|
|
46
|
+
columns[fieldName] = fieldConfig.from;
|
|
47
|
+
if (fieldConfig.type === 'string') {
|
|
48
|
+
protectedStringFields.push(fieldConfig.from);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if ('type' in config && (config.type === 'object' || config.type === 'array')) {
|
|
53
|
+
// Nested structure: object or array
|
|
54
|
+
const nestedStructure = config;
|
|
55
|
+
const uniquePropertyName = generateUniquePropertyName(fieldName);
|
|
56
|
+
// Generate globally unique entity ID to ensure unique JSON column names
|
|
57
|
+
const entityId = generateEntityId();
|
|
58
|
+
const processedNested = processStructure(nestedStructure.structure, entityId);
|
|
59
|
+
nestedEntities.push({
|
|
60
|
+
id: entityId, // Use unique ID to avoid column conflicts
|
|
61
|
+
name: fieldName.charAt(0).toUpperCase() + fieldName.slice(1), // Capitalize first letter
|
|
62
|
+
parentId: parentId || 'root',
|
|
63
|
+
propertyName: uniquePropertyName,
|
|
64
|
+
originalPropertyName: fieldName, // Store original name for final mapping
|
|
65
|
+
relationshipType: nestedStructure.type,
|
|
66
|
+
columns: processedNested.columns
|
|
67
|
+
});
|
|
68
|
+
// Add nested entities from deeper levels
|
|
69
|
+
nestedEntities.push(...processedNested.nestedEntities.map(entity => (Object.assign(Object.assign({}, entity), { parentId: entity.parentId === 'root' ? entityId : entity.parentId }))));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return { columns, nestedEntities };
|
|
73
|
+
};
|
|
74
|
+
// Process the root structure
|
|
75
|
+
const processed = processStructure(modelMapping.structure); // Build the traditional JsonMapping
|
|
76
|
+
const jsonMapping = {
|
|
77
|
+
rootName: 'root', // Default root name
|
|
78
|
+
rootEntity: {
|
|
79
|
+
id: 'root',
|
|
80
|
+
name: 'Root',
|
|
81
|
+
columns: processed.columns
|
|
82
|
+
},
|
|
83
|
+
nestedEntities: processed.nestedEntities
|
|
84
|
+
};
|
|
85
|
+
// Add typeInfo for backward compatibility
|
|
86
|
+
jsonMapping.typeInfo = modelMapping.typeInfo;
|
|
87
|
+
return {
|
|
88
|
+
jsonMapping,
|
|
89
|
+
typeProtection: { protectedStringFields }
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Validate that a model-driven mapping structure is well-formed.
|
|
94
|
+
*/
|
|
95
|
+
export function validateModelDrivenMapping(mapping) {
|
|
96
|
+
const errors = [];
|
|
97
|
+
// Validate typeInfo
|
|
98
|
+
if (!mapping.typeInfo) {
|
|
99
|
+
errors.push('typeInfo is required');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
if (!mapping.typeInfo.interface) {
|
|
103
|
+
errors.push('typeInfo.interface is required');
|
|
104
|
+
}
|
|
105
|
+
if (!mapping.typeInfo.importPath) {
|
|
106
|
+
errors.push('typeInfo.importPath is required');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Validate structure
|
|
110
|
+
if (!mapping.structure || typeof mapping.structure !== 'object') {
|
|
111
|
+
errors.push('structure is required and must be an object');
|
|
112
|
+
}
|
|
113
|
+
return errors;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=ModelDrivenJsonMapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelDrivenJsonMapping.js","sourceRoot":"","sources":["../../../../src/transformers/ModelDrivenJsonMapping.ts"],"names":[],"mappings":"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"}
|