@contrail/flexplm 1.3.2-alpha.c32d413 → 1.4.0-alpha.6954f61
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/CHANGELOG.md +5 -1
- package/lib/util/config-defaults.d.ts +1 -0
- package/lib/util/config-defaults.js +3 -0
- package/lib/util/config-defaults.spec.js +32 -0
- package/lib/util/data-converter.js +6 -0
- package/lib/util/data-converter.spec.js +66 -0
- package/package.json +1 -1
- package/src/util/config-defaults.spec.ts +42 -0
- package/src/util/config-defaults.ts +4 -0
- package/src/util/data-converter.spec.ts +79 -0
- package/src/util/data-converter.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,10 +7,14 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [1.
|
|
10
|
+
## [1.4.0] - 2026-05-06
|
|
11
11
|
### Added
|
|
12
12
|
- Added `getEntityUsingIdentityService` method to `BaseEntityProcessor` for looking up entities via the identity service using a pool key and property criteria. Returns the resolved entity from the identity's `entityReference`, `undefined` if not found, or throws if multiple matches exist.
|
|
13
13
|
|
|
14
|
+
## [1.3.2] - 2026-05-01
|
|
15
|
+
### Added
|
|
16
|
+
- Added syncing Size Range properties; they sync as the raw VibeIQ data. For Example: { "sizes": { "30": ["30","32"], "32": ["30","32"]}, "dimension1": {"slug": "width","label": "Width"}, "dimension2": {"slug": "length", "label": "Length"}}
|
|
17
|
+
|
|
14
18
|
## [1.3.0] - 2026-04-15
|
|
15
19
|
### Added
|
|
16
20
|
- Added inbound thumbnail/primary content syncing from FlexPLM to VibeIQ via `ThumbnailUtil.syncThumbnailToVibeIQ`.
|
|
@@ -264,6 +264,38 @@ describe('all tests', () => {
|
|
|
264
264
|
}
|
|
265
265
|
});
|
|
266
266
|
});
|
|
267
|
+
describe('isPropertyTrue', () => {
|
|
268
|
+
it('returns true for boolean true', () => {
|
|
269
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue(true)).toBe(true);
|
|
270
|
+
});
|
|
271
|
+
it('returns true for string true', () => {
|
|
272
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue('true')).toBe(true);
|
|
273
|
+
});
|
|
274
|
+
it('returns true for string TRUE', () => {
|
|
275
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue('TRUE')).toBe(true);
|
|
276
|
+
});
|
|
277
|
+
it('returns true for string True', () => {
|
|
278
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue('True')).toBe(true);
|
|
279
|
+
});
|
|
280
|
+
it('returns false for boolean false', () => {
|
|
281
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue(false)).toBe(false);
|
|
282
|
+
});
|
|
283
|
+
it('returns false for string false', () => {
|
|
284
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue('false')).toBe(false);
|
|
285
|
+
});
|
|
286
|
+
it('returns false for null', () => {
|
|
287
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue(null)).toBe(false);
|
|
288
|
+
});
|
|
289
|
+
it('returns false for undefined', () => {
|
|
290
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue(undefined)).toBe(false);
|
|
291
|
+
});
|
|
292
|
+
it('returns false for empty string', () => {
|
|
293
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue('')).toBe(false);
|
|
294
|
+
});
|
|
295
|
+
it('returns false for number 1', () => {
|
|
296
|
+
expect(config_defaults_1.ConfigDefaults.isPropertyTrue(1)).toBe(false);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
267
299
|
describe('getConfigFile', () => {
|
|
268
300
|
beforeEach(() => {
|
|
269
301
|
config_defaults_1.ConfigDefaults.clearConfigCache();
|
|
@@ -110,6 +110,9 @@ class DataConverter {
|
|
|
110
110
|
else if ('userList' === propertyType) {
|
|
111
111
|
value = await this.getUserListValue(prop, newData);
|
|
112
112
|
}
|
|
113
|
+
else if ('size_range' === propertyType) {
|
|
114
|
+
value = nd;
|
|
115
|
+
}
|
|
113
116
|
return value;
|
|
114
117
|
}
|
|
115
118
|
getEnumerationValue(prop, nd) {
|
|
@@ -291,6 +294,9 @@ class DataConverter {
|
|
|
291
294
|
else if ('userList' === propertyType) {
|
|
292
295
|
value = await this.setUserListValue(prop, nd);
|
|
293
296
|
}
|
|
297
|
+
else if ('size_range' === propertyType) {
|
|
298
|
+
value = nd;
|
|
299
|
+
}
|
|
294
300
|
return value;
|
|
295
301
|
}
|
|
296
302
|
setEnumerationKeys(prop, nd, matchByDisplay) {
|
|
@@ -902,3 +902,69 @@ describe('getUserListValue', () => {
|
|
|
902
902
|
expect(returnValue.lastName).toEqual('Smith');
|
|
903
903
|
});
|
|
904
904
|
});
|
|
905
|
+
describe('getFlexPLMValue size_range', () => {
|
|
906
|
+
const config = {
|
|
907
|
+
apiHost: 'host',
|
|
908
|
+
userName: () => 'user',
|
|
909
|
+
password: () => 'pass',
|
|
910
|
+
urlContext: 'xxx',
|
|
911
|
+
vibeEventEndpoint: '/rfa/vibeiq/vibeEvents',
|
|
912
|
+
csrfEndpoint: '/servlet/rest/security/csrf',
|
|
913
|
+
itemPreDevelopmentLifecycleStages: ['concept']
|
|
914
|
+
};
|
|
915
|
+
const mapFileUtil = new transform_data_1.MapFileUtil(new sdk_1.Entities());
|
|
916
|
+
const dc = new data_converter_1.DataConverter(config, mapFileUtil);
|
|
917
|
+
const sizeRangeProp = {
|
|
918
|
+
propertyType: 'size_range',
|
|
919
|
+
slug: 'sizeRange',
|
|
920
|
+
label: 'Size Range',
|
|
921
|
+
};
|
|
922
|
+
it('returns sizeRange object when value is present', async () => {
|
|
923
|
+
const newData = { sizeRange: { sizes: ['PRE', 'NB'] } };
|
|
924
|
+
const returnValue = await dc.getFlexPLMValue(sizeRangeProp, newData, true);
|
|
925
|
+
expect(returnValue).toEqual({ sizes: ['PRE', 'NB'] });
|
|
926
|
+
});
|
|
927
|
+
it('returns null when sizeRange is null', async () => {
|
|
928
|
+
const newData = { sizeRange: null };
|
|
929
|
+
const returnValue = await dc.getFlexPLMValue(sizeRangeProp, newData, true);
|
|
930
|
+
expect(returnValue).toBeNull();
|
|
931
|
+
});
|
|
932
|
+
it('returns undefined when sizeRange is missing', async () => {
|
|
933
|
+
const newData = {};
|
|
934
|
+
const returnValue = await dc.getFlexPLMValue(sizeRangeProp, newData, true);
|
|
935
|
+
expect(returnValue).toBeUndefined();
|
|
936
|
+
});
|
|
937
|
+
});
|
|
938
|
+
describe('getEntityValue size_range', () => {
|
|
939
|
+
const config = {
|
|
940
|
+
apiHost: 'host',
|
|
941
|
+
userName: () => 'user',
|
|
942
|
+
password: () => 'pass',
|
|
943
|
+
urlContext: 'xxx',
|
|
944
|
+
vibeEventEndpoint: '/rfa/vibeiq/vibeEvents',
|
|
945
|
+
csrfEndpoint: '/servlet/rest/security/csrf',
|
|
946
|
+
itemPreDevelopmentLifecycleStages: ['concept']
|
|
947
|
+
};
|
|
948
|
+
const mapFileUtil = new transform_data_1.MapFileUtil(new sdk_1.Entities());
|
|
949
|
+
const dc = new data_converter_1.DataConverter(config, mapFileUtil);
|
|
950
|
+
const sizeRangeProp = {
|
|
951
|
+
propertyType: 'size_range',
|
|
952
|
+
slug: 'sizeRange',
|
|
953
|
+
label: 'Size Range',
|
|
954
|
+
};
|
|
955
|
+
it('returns sizeRange object when value is present', async () => {
|
|
956
|
+
const data = { sizeRange: { sizes: ['PRE', 'NB'] } };
|
|
957
|
+
const returnValue = await dc.getEntityValue(sizeRangeProp, data);
|
|
958
|
+
expect(returnValue).toEqual({ sizes: ['PRE', 'NB'] });
|
|
959
|
+
});
|
|
960
|
+
it('returns null when sizeRange is null', async () => {
|
|
961
|
+
const data = { sizeRange: null };
|
|
962
|
+
const returnValue = await dc.getEntityValue(sizeRangeProp, data);
|
|
963
|
+
expect(returnValue).toBeNull();
|
|
964
|
+
});
|
|
965
|
+
it('returns undefined when sizeRange is missing', async () => {
|
|
966
|
+
const data = {};
|
|
967
|
+
const returnValue = await dc.getEntityValue(sizeRangeProp, data);
|
|
968
|
+
expect(returnValue).toBeUndefined();
|
|
969
|
+
});
|
|
970
|
+
});
|
package/package.json
CHANGED
|
@@ -314,6 +314,48 @@ describe('all tests', () => {
|
|
|
314
314
|
|
|
315
315
|
});
|
|
316
316
|
|
|
317
|
+
describe('isPropertyTrue', () => {
|
|
318
|
+
it('returns true for boolean true', () => {
|
|
319
|
+
expect(ConfigDefaults.isPropertyTrue(true)).toBe(true);
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
it('returns true for string true', () => {
|
|
323
|
+
expect(ConfigDefaults.isPropertyTrue('true')).toBe(true);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('returns true for string TRUE', () => {
|
|
327
|
+
expect(ConfigDefaults.isPropertyTrue('TRUE')).toBe(true);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it('returns true for string True', () => {
|
|
331
|
+
expect(ConfigDefaults.isPropertyTrue('True')).toBe(true);
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
it('returns false for boolean false', () => {
|
|
335
|
+
expect(ConfigDefaults.isPropertyTrue(false)).toBe(false);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('returns false for string false', () => {
|
|
339
|
+
expect(ConfigDefaults.isPropertyTrue('false')).toBe(false);
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
it('returns false for null', () => {
|
|
343
|
+
expect(ConfigDefaults.isPropertyTrue(null)).toBe(false);
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
it('returns false for undefined', () => {
|
|
347
|
+
expect(ConfigDefaults.isPropertyTrue(undefined)).toBe(false);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('returns false for empty string', () => {
|
|
351
|
+
expect(ConfigDefaults.isPropertyTrue('')).toBe(false);
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it('returns false for number 1', () => {
|
|
355
|
+
expect(ConfigDefaults.isPropertyTrue(1)).toBe(false);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
|
|
317
359
|
describe('getConfigFile', () => {
|
|
318
360
|
beforeEach(() => {
|
|
319
361
|
ConfigDefaults.clearConfigCache();
|
|
@@ -87,6 +87,10 @@ export class ConfigDefaults {
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
static isPropertyTrue(value: any): boolean {
|
|
91
|
+
return value === true || (typeof value === 'string' && value.toLowerCase() === 'true');
|
|
92
|
+
}
|
|
93
|
+
|
|
90
94
|
static clearConfigCache(){
|
|
91
95
|
ConfigDefaults.STATIC_CONFIG_CACHE = {};
|
|
92
96
|
}
|
|
@@ -1038,4 +1038,83 @@ describe('getUserListValue', () =>{
|
|
|
1038
1038
|
expect(returnValue.lastName).toEqual('Smith');
|
|
1039
1039
|
});
|
|
1040
1040
|
|
|
1041
|
+
});
|
|
1042
|
+
|
|
1043
|
+
|
|
1044
|
+
describe('getFlexPLMValue size_range', () => {
|
|
1045
|
+
const config: FCConfig = {
|
|
1046
|
+
apiHost: 'host',
|
|
1047
|
+
userName: () => 'user',
|
|
1048
|
+
password: () => 'pass',
|
|
1049
|
+
urlContext: 'xxx',
|
|
1050
|
+
vibeEventEndpoint: '/rfa/vibeiq/vibeEvents',
|
|
1051
|
+
csrfEndpoint: '/servlet/rest/security/csrf',
|
|
1052
|
+
itemPreDevelopmentLifecycleStages: ['concept']
|
|
1053
|
+
};
|
|
1054
|
+
|
|
1055
|
+
const mapFileUtil = new MapFileUtil(new Entities());
|
|
1056
|
+
const dc = new DataConverter(config, mapFileUtil);
|
|
1057
|
+
|
|
1058
|
+
const sizeRangeProp = {
|
|
1059
|
+
propertyType: 'size_range',
|
|
1060
|
+
slug: 'sizeRange',
|
|
1061
|
+
label: 'Size Range',
|
|
1062
|
+
};
|
|
1063
|
+
|
|
1064
|
+
it('returns sizeRange object when value is present', async () => {
|
|
1065
|
+
const newData = { sizeRange: { sizes: ['PRE', 'NB'] } };
|
|
1066
|
+
const returnValue = await dc.getFlexPLMValue(sizeRangeProp, newData, true);
|
|
1067
|
+
expect(returnValue).toEqual({ sizes: ['PRE', 'NB'] });
|
|
1068
|
+
});
|
|
1069
|
+
|
|
1070
|
+
it('returns null when sizeRange is null', async () => {
|
|
1071
|
+
const newData = { sizeRange: null };
|
|
1072
|
+
const returnValue = await dc.getFlexPLMValue(sizeRangeProp, newData, true);
|
|
1073
|
+
expect(returnValue).toBeNull();
|
|
1074
|
+
});
|
|
1075
|
+
|
|
1076
|
+
it('returns undefined when sizeRange is missing', async () => {
|
|
1077
|
+
const newData = {};
|
|
1078
|
+
const returnValue = await dc.getFlexPLMValue(sizeRangeProp, newData, true);
|
|
1079
|
+
expect(returnValue).toBeUndefined();
|
|
1080
|
+
});
|
|
1081
|
+
});
|
|
1082
|
+
|
|
1083
|
+
describe('getEntityValue size_range', () => {
|
|
1084
|
+
const config: FCConfig = {
|
|
1085
|
+
apiHost: 'host',
|
|
1086
|
+
userName: () => 'user',
|
|
1087
|
+
password: () => 'pass',
|
|
1088
|
+
urlContext: 'xxx',
|
|
1089
|
+
vibeEventEndpoint: '/rfa/vibeiq/vibeEvents',
|
|
1090
|
+
csrfEndpoint: '/servlet/rest/security/csrf',
|
|
1091
|
+
itemPreDevelopmentLifecycleStages: ['concept']
|
|
1092
|
+
};
|
|
1093
|
+
|
|
1094
|
+
const mapFileUtil = new MapFileUtil(new Entities());
|
|
1095
|
+
const dc = new DataConverter(config, mapFileUtil);
|
|
1096
|
+
|
|
1097
|
+
const sizeRangeProp = {
|
|
1098
|
+
propertyType: 'size_range',
|
|
1099
|
+
slug: 'sizeRange',
|
|
1100
|
+
label: 'Size Range',
|
|
1101
|
+
};
|
|
1102
|
+
|
|
1103
|
+
it('returns sizeRange object when value is present', async () => {
|
|
1104
|
+
const data = { sizeRange: { sizes: ['PRE', 'NB'] } };
|
|
1105
|
+
const returnValue = await dc.getEntityValue(sizeRangeProp, data);
|
|
1106
|
+
expect(returnValue).toEqual({ sizes: ['PRE', 'NB'] });
|
|
1107
|
+
});
|
|
1108
|
+
|
|
1109
|
+
it('returns null when sizeRange is null', async () => {
|
|
1110
|
+
const data = { sizeRange: null };
|
|
1111
|
+
const returnValue = await dc.getEntityValue(sizeRangeProp, data);
|
|
1112
|
+
expect(returnValue).toBeNull();
|
|
1113
|
+
});
|
|
1114
|
+
|
|
1115
|
+
it('returns undefined when sizeRange is missing', async () => {
|
|
1116
|
+
const data = {};
|
|
1117
|
+
const returnValue = await dc.getEntityValue(sizeRangeProp, data);
|
|
1118
|
+
expect(returnValue).toBeUndefined();
|
|
1119
|
+
});
|
|
1041
1120
|
});
|
|
@@ -119,6 +119,8 @@ export class DataConverter {
|
|
|
119
119
|
value = nd;
|
|
120
120
|
} else if ('userList' === propertyType) {
|
|
121
121
|
value = await this.getUserListValue(prop, newData);
|
|
122
|
+
}else if ('size_range' === propertyType){
|
|
123
|
+
value = nd;
|
|
122
124
|
}
|
|
123
125
|
|
|
124
126
|
return value;
|
|
@@ -353,6 +355,8 @@ export class DataConverter {
|
|
|
353
355
|
// console.log('TODO-json');
|
|
354
356
|
} else if ('userList' === propertyType) {
|
|
355
357
|
value = await this.setUserListValue(prop, nd);
|
|
358
|
+
}else if ('size_range' === propertyType){
|
|
359
|
+
value = nd;
|
|
356
360
|
}
|
|
357
361
|
|
|
358
362
|
// console.log(value);
|