@contrail/flexplm 1.4.0 → 1.5.0-alpha.14a4f1b
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/lib/cli/commands/compile.d.ts +4 -0
- package/lib/cli/commands/compile.js +73 -0
- package/lib/cli/commands/compile.spec.d.ts +1 -0
- package/lib/cli/commands/compile.spec.js +80 -0
- package/lib/cli/commands/create.d.ts +5 -0
- package/lib/cli/commands/create.js +77 -0
- package/lib/cli/commands/create.spec.d.ts +1 -0
- package/lib/cli/commands/create.spec.js +78 -0
- package/lib/cli/commands/upload.d.ts +17 -0
- package/lib/cli/commands/upload.js +228 -0
- package/lib/cli/commands/upload.spec.d.ts +1 -0
- package/lib/cli/commands/upload.spec.js +88 -0
- package/lib/cli/index.d.ts +5 -0
- package/lib/cli/index.js +70 -0
- package/lib/cli/index.spec.d.ts +1 -0
- package/lib/cli/index.spec.js +85 -0
- package/lib/cli/template/mapping-template.ts.template +62 -0
- package/lib/entity-processor/base-entity-processor.d.ts +65 -0
- package/lib/entity-processor/base-entity-processor.js +71 -0
- package/lib/entity-processor/base-entity-processor.spec.js +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/interfaces/mapping-file.d.ts +460 -0
- package/lib/interfaces/mapping-file.js +2 -0
- package/lib/publish/base-process-publish-assortment.d.ts +25 -0
- package/lib/publish/base-process-publish-assortment.js +60 -6
- package/lib/publish/base-process-publish-assortment.spec.js +22 -4
- package/lib/publish/mockData.js +5 -0
- package/lib/transform/identifier-conversion-spec-mockData.js +34 -6
- package/lib/transform/identifier-conversion.d.ts +36 -0
- package/lib/transform/identifier-conversion.js +37 -1
- package/lib/transform/identifier-conversion.spec.js +35 -0
- package/lib/util/config-defaults.d.ts +18 -0
- package/lib/util/config-defaults.js +25 -15
- package/lib/util/config-defaults.spec.js +56 -0
- package/lib/util/data-converter-spec-mockData.js +17 -3
- package/lib/util/data-converter.d.ts +102 -0
- package/lib/util/data-converter.js +195 -34
- package/lib/util/data-converter.spec.js +430 -0
- package/lib/util/error-response-object.d.ts +5 -0
- package/lib/util/error-response-object.js +7 -0
- package/lib/util/event-short-message-status.js +1 -0
- package/lib/util/federation.js +8 -0
- package/lib/util/flexplm-connect.d.ts +7 -0
- package/lib/util/flexplm-connect.js +14 -0
- package/lib/util/logger-config.js +1 -0
- package/lib/util/map-util-spec-mockData.js +17 -3
- package/lib/util/map-utils.d.ts +27 -0
- package/lib/util/map-utils.js +27 -0
- package/lib/util/thumbnail-util.d.ts +21 -0
- package/lib/util/thumbnail-util.js +28 -1
- package/lib/util/thumbnail-util.spec.js +6 -0
- package/lib/util/type-conversion-utils-spec-mockData.js +3 -3
- package/lib/util/type-conversion-utils.d.ts +151 -0
- package/lib/util/type-conversion-utils.js +154 -0
- package/lib/util/type-defaults.d.ts +69 -0
- package/lib/util/type-defaults.js +98 -4
- package/lib/util/type-defaults.spec.js +114 -4
- package/lib/util/type-utils.d.ts +21 -0
- package/lib/util/type-utils.js +23 -0
- package/lib/util/type-utils.spec.js +2 -0
- package/package.json +21 -6
- package/scripts/copy-template.js +10 -0
- package/.github/pull_request_template.md +0 -31
- package/.github/workflows/flexplm-lib.yml +0 -27
- package/.github/workflows/publish-to-npm.yml +0 -121
- package/CHANGELOG.md +0 -40
- package/publish.bat +0 -5
- package/publish.sh +0 -5
- package/src/entity-processor/base-entity-processor.spec.ts +0 -689
- package/src/entity-processor/base-entity-processor.ts +0 -583
- package/src/flexplm-request.ts +0 -28
- package/src/flexplm-utils.spec.ts +0 -27
- package/src/flexplm-utils.ts +0 -29
- package/src/index.ts +0 -22
- package/src/interfaces/interfaces.ts +0 -122
- package/src/interfaces/item-family-changes.ts +0 -67
- package/src/interfaces/publish-change-data.ts +0 -43
- package/src/publish/base-process-publish-assortment-callback.ts +0 -50
- package/src/publish/base-process-publish-assortment.spec.ts +0 -1992
- package/src/publish/base-process-publish-assortment.ts +0 -1134
- package/src/publish/mockData.ts +0 -4561
- package/src/transform/identifier-conversion-spec-mockData.ts +0 -496
- package/src/transform/identifier-conversion.spec.ts +0 -354
- package/src/transform/identifier-conversion.ts +0 -282
- package/src/util/config-defaults.spec.ts +0 -392
- package/src/util/config-defaults.ts +0 -97
- package/src/util/data-converter-spec-mockData.ts +0 -231
- package/src/util/data-converter.spec.ts +0 -1120
- package/src/util/data-converter.ts +0 -766
- package/src/util/error-response-object.spec.ts +0 -116
- package/src/util/error-response-object.ts +0 -50
- package/src/util/event-short-message-status.ts +0 -22
- package/src/util/federation.ts +0 -172
- package/src/util/flexplm-connect.spec.ts +0 -132
- package/src/util/flexplm-connect.ts +0 -208
- package/src/util/logger-config.ts +0 -20
- package/src/util/map-util-spec-mockData.ts +0 -231
- package/src/util/map-utils.spec.ts +0 -103
- package/src/util/map-utils.ts +0 -41
- package/src/util/mockData.ts +0 -101
- package/src/util/thumbnail-util.spec.ts +0 -508
- package/src/util/thumbnail-util.ts +0 -272
- package/src/util/type-conversion-utils-spec-mockData.ts +0 -272
- package/src/util/type-conversion-utils.spec.ts +0 -1031
- package/src/util/type-conversion-utils.ts +0 -490
- package/src/util/type-defaults.spec.ts +0 -669
- package/src/util/type-defaults.ts +0 -281
- package/src/util/type-utils.spec.ts +0 -227
- package/src/util/type-utils.ts +0 -144
- package/tsconfig.json +0 -24
- package/tslint.json +0 -57
|
@@ -31,12 +31,26 @@ exports.mapping = {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
+
// flex2vibe: {
|
|
35
|
+
// LCSRevisableEntity: {
|
|
36
|
+
// getMapKey: (object) =>{ return object;}
|
|
37
|
+
// },
|
|
38
|
+
// LCSLast: {
|
|
39
|
+
// getMapKey: (object) => {return object;}
|
|
40
|
+
// },
|
|
41
|
+
// LCSMaterial: {
|
|
42
|
+
// getMapKey: (object) =>{ return object;}
|
|
43
|
+
// },
|
|
44
|
+
// LCSBusinessObject: {
|
|
45
|
+
// getMapKey: (object) => {return object;}
|
|
46
|
+
// }
|
|
47
|
+
// },
|
|
34
48
|
},
|
|
35
49
|
LCSProduct: {
|
|
36
50
|
vibeOwningKeys: ['itemNumber', 'lifecycleStage'],
|
|
37
51
|
vibe2flex: {
|
|
38
52
|
getClass: () => 'LCSProduct',
|
|
39
|
-
getSoftType: (entity) => {
|
|
53
|
+
getSoftType: (entity /*, dependencies*/) => {
|
|
40
54
|
const prodType = entity['prodType'];
|
|
41
55
|
let val = '';
|
|
42
56
|
switch (prodType) {
|
|
@@ -61,7 +75,7 @@ exports.mapping = {
|
|
|
61
75
|
vibeIQIdentifier: 'itemNumber'
|
|
62
76
|
},
|
|
63
77
|
valueTransform: {
|
|
64
|
-
transformEx: (row) => {
|
|
78
|
+
transformEx: (row /*, dependencies*/) => {
|
|
65
79
|
return row['otherProp'] + 'xxx';
|
|
66
80
|
}
|
|
67
81
|
}
|
|
@@ -79,7 +93,7 @@ exports.mapping = {
|
|
|
79
93
|
vibeOwningKeys: ['itemNumber', 'lifecycleStage'],
|
|
80
94
|
vibe2flex: {
|
|
81
95
|
getClass: () => 'LCSSKU',
|
|
82
|
-
getSoftType: (entity) => {
|
|
96
|
+
getSoftType: (entity /*, dependencies*/) => {
|
|
83
97
|
const prodType = entity['prodType'];
|
|
84
98
|
let val = '';
|
|
85
99
|
switch (prodType) {
|
package/lib/util/map-utils.d.ts
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
import { MapFileUtil } from '@contrail/transform-data';
|
|
2
2
|
export declare class MapUtil {
|
|
3
|
+
/** Transforms the data, assumes mapSectionKey has been correctly determined.
|
|
4
|
+
*
|
|
5
|
+
* @param transformMapFile id of map file
|
|
6
|
+
* @param mapFileUtil
|
|
7
|
+
* @param data
|
|
8
|
+
* @param mapSectionKey key for section of map file
|
|
9
|
+
* @param direction vibe2flex or flex2vibe
|
|
10
|
+
* @param transformTaskOrderKey key for the list of tasks to be processed. default is 'transformOrder'
|
|
11
|
+
* @returns The converted data
|
|
12
|
+
*/
|
|
3
13
|
static applyTransformMap(transformMapFile: any, mapFileUtil: any, data: any, mapSectionKey: string, direction: string, transformTaskOrderKey?: string): Promise<any>;
|
|
14
|
+
/** Returns the mapKey based on the 'typeConversion' section of the map file.
|
|
15
|
+
* If the map file doesn't have a section for the type in question, 'undefined' is returned.
|
|
16
|
+
*
|
|
17
|
+
* @param fileId
|
|
18
|
+
* @param mapFileUtil
|
|
19
|
+
* @param data The full object
|
|
20
|
+
* @param type The entity or object class of the object. The functions are keyed based on this.
|
|
21
|
+
* @param direction
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
4
24
|
static getMapKey(transformMapFile: any, mapFileUtil: MapFileUtil, data: any, type: string, direction: string): Promise<string>;
|
|
25
|
+
/** Returns the full map section with both directions; identifier and informational properties; etc.
|
|
26
|
+
*
|
|
27
|
+
* @param transformMapFile id if map file
|
|
28
|
+
* @param mapFileUtil
|
|
29
|
+
* @param mapSectionKey key of the map section
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
5
32
|
static getFullMapSection(transformMapFile: string, mapFileUtil: MapFileUtil, mapSectionKey: string): Promise<any>;
|
|
6
33
|
}
|
package/lib/util/map-utils.js
CHANGED
|
@@ -2,12 +2,39 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MapUtil = void 0;
|
|
4
4
|
class MapUtil {
|
|
5
|
+
/** Transforms the data, assumes mapSectionKey has been correctly determined.
|
|
6
|
+
*
|
|
7
|
+
* @param transformMapFile id of map file
|
|
8
|
+
* @param mapFileUtil
|
|
9
|
+
* @param data
|
|
10
|
+
* @param mapSectionKey key for section of map file
|
|
11
|
+
* @param direction vibe2flex or flex2vibe
|
|
12
|
+
* @param transformTaskOrderKey key for the list of tasks to be processed. default is 'transformOrder'
|
|
13
|
+
* @returns The converted data
|
|
14
|
+
*/
|
|
5
15
|
static async applyTransformMap(transformMapFile, mapFileUtil, data, mapSectionKey, direction, transformTaskOrderKey = 'transformOrder') {
|
|
6
16
|
return await mapFileUtil.applyTransformMap(transformMapFile, data, mapSectionKey, direction, transformTaskOrderKey);
|
|
7
17
|
}
|
|
18
|
+
/** Returns the mapKey based on the 'typeConversion' section of the map file.
|
|
19
|
+
* If the map file doesn't have a section for the type in question, 'undefined' is returned.
|
|
20
|
+
*
|
|
21
|
+
* @param fileId
|
|
22
|
+
* @param mapFileUtil
|
|
23
|
+
* @param data The full object
|
|
24
|
+
* @param type The entity or object class of the object. The functions are keyed based on this.
|
|
25
|
+
* @param direction
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
8
28
|
static async getMapKey(transformMapFile, mapFileUtil, data, type, direction) {
|
|
9
29
|
return await mapFileUtil.getMapKey(transformMapFile, data, type, direction);
|
|
10
30
|
}
|
|
31
|
+
/** Returns the full map section with both directions; identifier and informational properties; etc.
|
|
32
|
+
*
|
|
33
|
+
* @param transformMapFile id if map file
|
|
34
|
+
* @param mapFileUtil
|
|
35
|
+
* @param mapSectionKey key of the map section
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
11
38
|
static async getFullMapSection(transformMapFile, mapFileUtil, mapSectionKey) {
|
|
12
39
|
return await mapFileUtil.getFullMapSection(transformMapFile, mapSectionKey);
|
|
13
40
|
}
|
|
@@ -6,6 +6,7 @@ interface ContentCustomSize {
|
|
|
6
6
|
}
|
|
7
7
|
export declare class ThumbnailUtil {
|
|
8
8
|
private config;
|
|
9
|
+
/** The max_thumbnail_size is for limiting the size of the thumbnail being sent to FlexPLM. It is used when checking the size of the auto generated thumbnails (smallViewable, tinyViewable, etc.). */
|
|
9
10
|
private max_thumbnail_size;
|
|
10
11
|
private entities;
|
|
11
12
|
static NEW_THUMBNAIL_ID: string;
|
|
@@ -16,11 +17,31 @@ export declare class ThumbnailUtil {
|
|
|
16
17
|
}[];
|
|
17
18
|
constructor(config: FCConfig);
|
|
18
19
|
setOutboundThumbnail(data: any, event: any): Promise<any>;
|
|
20
|
+
/** Determines if a new image has been generated. If any viewable is new, there might be a better
|
|
21
|
+
* sized image. So send the fileId as new.
|
|
22
|
+
*/
|
|
19
23
|
isThumbnailNew(event: any, customSizes: any[]): boolean;
|
|
20
24
|
getFileId(primaryViewableId: string): Promise<string | undefined>;
|
|
21
25
|
getCustomSizes(): Promise<ContentCustomSize[]>;
|
|
22
26
|
getContentEntity(primaryViewableId: any, sizes: ContentCustomSize[]): Promise<any>;
|
|
27
|
+
/** This outputs the content entity, without the inflated file entities.
|
|
28
|
+
* To help debugging issues with sending the thumbnail info.
|
|
29
|
+
* The inflated entities are removed, because are large and cause
|
|
30
|
+
* problems with log file size limits.
|
|
31
|
+
*
|
|
32
|
+
* @param content: the content with inflated objects
|
|
33
|
+
* @param relations: string[] of the slugs for inflated objects
|
|
34
|
+
*/
|
|
23
35
|
logContentResults(content: any, relations: string[]): void;
|
|
36
|
+
/** Syncs the thumbnail from FlexPLM to VibeIQ. Handles creating, replacing, or removing
|
|
37
|
+
* the primary viewable content and persists the updates directly to the entity.
|
|
38
|
+
*
|
|
39
|
+
* @param entityId - The ID of the entity to update with thumbnail properties.
|
|
40
|
+
* @param primaryViewableId - The existing primary viewable content ID, if any.
|
|
41
|
+
* @param event - The inbound event containing thumbnail data (NEW_THUMBNAIL_ID / EXISTING_THUMBNAIL_ID).
|
|
42
|
+
* @param entityName - The entity type name (e.g. 'item', 'color') used for API calls.
|
|
43
|
+
* @returns The updated entity, or undefined if no thumbnail changes were needed.
|
|
44
|
+
*/
|
|
24
45
|
syncThumbnailToVibeIQ({ entityId, primaryViewableId, event, entityName }: {
|
|
25
46
|
entityId: string;
|
|
26
47
|
primaryViewableId?: string;
|
|
@@ -8,6 +8,7 @@ const flexplm_connect_1 = require("./flexplm-connect");
|
|
|
8
8
|
class ThumbnailUtil {
|
|
9
9
|
constructor(config) {
|
|
10
10
|
this.config = config;
|
|
11
|
+
/** The max_thumbnail_size is for limiting the size of the thumbnail being sent to FlexPLM. It is used when checking the size of the auto generated thumbnails (smallViewable, tinyViewable, etc.). */
|
|
11
12
|
this.max_thumbnail_size = 5 * 1024 * 1024;
|
|
12
13
|
this.entities = new sdk_1.Entities();
|
|
13
14
|
if (this.config['max_thumbnail_size']) {
|
|
@@ -17,6 +18,7 @@ class ThumbnailUtil {
|
|
|
17
18
|
async setOutboundThumbnail(data, event) {
|
|
18
19
|
if (event?.newData?.primaryViewableId && event?.newData?.largeViewableDownloadUrl) {
|
|
19
20
|
const primaryViewableId = event.newData.primaryViewableId;
|
|
21
|
+
//get custom sizes
|
|
20
22
|
const fileId = await this.getFileId(primaryViewableId);
|
|
21
23
|
if (fileId) {
|
|
22
24
|
const customSizes = await this.getCustomSizes();
|
|
@@ -31,6 +33,9 @@ class ThumbnailUtil {
|
|
|
31
33
|
}
|
|
32
34
|
return data;
|
|
33
35
|
}
|
|
36
|
+
/** Determines if a new image has been generated. If any viewable is new, there might be a better
|
|
37
|
+
* sized image. So send the fileId as new.
|
|
38
|
+
*/
|
|
34
39
|
isThumbnailNew(event, customSizes) {
|
|
35
40
|
const propertyDiffs = event?.propertyDiffs;
|
|
36
41
|
if (propertyDiffs) {
|
|
@@ -52,6 +57,7 @@ class ThumbnailUtil {
|
|
|
52
57
|
const OOBSizes = JSON.parse(JSON.stringify(ThumbnailUtil.OOB_SIZES));
|
|
53
58
|
sizes.push(...OOBSizes);
|
|
54
59
|
console.info('sizes: ' + JSON.stringify(sizes));
|
|
60
|
+
//get Content
|
|
55
61
|
const content = await this.getContentEntity(primaryViewableId, sizes);
|
|
56
62
|
if (!content) {
|
|
57
63
|
return undefined;
|
|
@@ -99,6 +105,14 @@ class ThumbnailUtil {
|
|
|
99
105
|
this.logContentResults(content, relations);
|
|
100
106
|
return content;
|
|
101
107
|
}
|
|
108
|
+
/** This outputs the content entity, without the inflated file entities.
|
|
109
|
+
* To help debugging issues with sending the thumbnail info.
|
|
110
|
+
* The inflated entities are removed, because are large and cause
|
|
111
|
+
* problems with log file size limits.
|
|
112
|
+
*
|
|
113
|
+
* @param content: the content with inflated objects
|
|
114
|
+
* @param relations: string[] of the slugs for inflated objects
|
|
115
|
+
*/
|
|
102
116
|
logContentResults(content, relations) {
|
|
103
117
|
if (app_framework_1.Logger.isDebugOn() && content && relations) {
|
|
104
118
|
const contentCopy = JSON.parse(JSON.stringify(content));
|
|
@@ -108,12 +122,22 @@ class ThumbnailUtil {
|
|
|
108
122
|
console.debug('content: ' + JSON.stringify(contentCopy));
|
|
109
123
|
}
|
|
110
124
|
}
|
|
125
|
+
/** Syncs the thumbnail from FlexPLM to VibeIQ. Handles creating, replacing, or removing
|
|
126
|
+
* the primary viewable content and persists the updates directly to the entity.
|
|
127
|
+
*
|
|
128
|
+
* @param entityId - The ID of the entity to update with thumbnail properties.
|
|
129
|
+
* @param primaryViewableId - The existing primary viewable content ID, if any.
|
|
130
|
+
* @param event - The inbound event containing thumbnail data (NEW_THUMBNAIL_ID / EXISTING_THUMBNAIL_ID).
|
|
131
|
+
* @param entityName - The entity type name (e.g. 'item', 'color') used for API calls.
|
|
132
|
+
* @returns The updated entity, or undefined if no thumbnail changes were needed.
|
|
133
|
+
*/
|
|
111
134
|
async syncThumbnailToVibeIQ({ entityId, primaryViewableId, event, entityName }) {
|
|
112
135
|
console.debug(`syncThumbnailToVibeIQ: entityId=${entityId}, primaryViewableId=${primaryViewableId}, entityName=${entityName}`);
|
|
113
136
|
const eventData = event.data || {};
|
|
114
137
|
const newThumbnailId = eventData[ThumbnailUtil.NEW_THUMBNAIL_ID];
|
|
115
138
|
const existingThumbnailId = eventData[ThumbnailUtil.EXISTING_THUMBNAIL_ID];
|
|
116
139
|
const thumbnailUrl = newThumbnailId || existingThumbnailId;
|
|
140
|
+
// Case 1: REMOVE_THUMBNAIL
|
|
117
141
|
if (newThumbnailId === ThumbnailUtil.REMOVE_THUMBNAIL) {
|
|
118
142
|
if (primaryViewableId) {
|
|
119
143
|
await this.entities.delete({ entityName: 'content', id: primaryViewableId });
|
|
@@ -123,10 +147,12 @@ class ThumbnailUtil {
|
|
|
123
147
|
console.debug(`syncThumbnailToVibeIQ: applied clear updates for entityId=${entityId}`);
|
|
124
148
|
return updatedEntity;
|
|
125
149
|
}
|
|
150
|
+
// Early return if no thumbnail URL
|
|
126
151
|
if (!thumbnailUrl) {
|
|
127
152
|
console.debug(`syncThumbnailToVibeIQ: no thumbnail URL for entityId=${entityId}`);
|
|
128
153
|
return undefined;
|
|
129
154
|
}
|
|
155
|
+
// Case 2: No existing primaryViewableId — create new content
|
|
130
156
|
if (!primaryViewableId) {
|
|
131
157
|
const content = await this.createContentFromFlexPLM(thumbnailUrl, entityId, entityName);
|
|
132
158
|
await this.entities.update({ entityName: 'content', id: content.id, object: { flexplmThumbnailUrl: thumbnailUrl } });
|
|
@@ -135,10 +161,11 @@ class ThumbnailUtil {
|
|
|
135
161
|
console.debug(`syncThumbnailToVibeIQ: created new content ${content.id} for entityId=${entityId}`);
|
|
136
162
|
return updatedEntity;
|
|
137
163
|
}
|
|
164
|
+
// Case 3: Has primaryViewableId — check if thumbnail changed
|
|
138
165
|
const primaryViewable = await this.entities.get({ entityName: 'content', id: primaryViewableId });
|
|
139
166
|
if (primaryViewable?.flexplmThumbnailUrl === thumbnailUrl) {
|
|
140
167
|
console.debug(`syncThumbnailToVibeIQ: thumbnail already synced for entityId=${entityId}`);
|
|
141
|
-
return undefined;
|
|
168
|
+
return undefined; // Already synced
|
|
142
169
|
}
|
|
143
170
|
const content = await this.createContentFromFlexPLM(thumbnailUrl, entityId, entityName);
|
|
144
171
|
await this.entities.update({ entityName: 'content', id: content.id, object: { flexplmThumbnailUrl: thumbnailUrl } });
|
|
@@ -327,11 +327,13 @@ describe('ThumbnailUtil Tests', () => {
|
|
|
327
327
|
contentType: 'image/png',
|
|
328
328
|
contentHolderReference: 'color:entity1',
|
|
329
329
|
}));
|
|
330
|
+
// Updates content with flexplmThumbnailUrl
|
|
330
331
|
expect(mockEntitiesUpdate).toHaveBeenCalledWith(expect.objectContaining({
|
|
331
332
|
entityName: 'content',
|
|
332
333
|
id: 'newContent1',
|
|
333
334
|
object: { flexplmThumbnailUrl: '/rest/thumbnail/thumb.png' },
|
|
334
335
|
}));
|
|
336
|
+
// Updates the main entity
|
|
335
337
|
expect(mockEntitiesUpdate).toHaveBeenCalledWith(expect.objectContaining({
|
|
336
338
|
entityName: 'color',
|
|
337
339
|
id: 'entity1',
|
|
@@ -405,13 +407,17 @@ describe('ThumbnailUtil Tests', () => {
|
|
|
405
407
|
mockContentCreate.mockResolvedValue(createdContent);
|
|
406
408
|
const event = { data: { [thumbnail_util_1.ThumbnailUtil.NEW_THUMBNAIL_ID]: '/rest/thumbnail/new.jpg' } };
|
|
407
409
|
await tu.syncThumbnailToVibeIQ({ entityId: 'entity1', primaryViewableId: 'oldPv', event, entityName: 'item' });
|
|
410
|
+
// Creates new content
|
|
408
411
|
expect(mockContentCreate).toHaveBeenCalled();
|
|
412
|
+
// Updates new content with flexplmThumbnailUrl
|
|
409
413
|
expect(mockEntitiesUpdate).toHaveBeenCalledWith(expect.objectContaining({
|
|
410
414
|
entityName: 'content',
|
|
411
415
|
id: 'newContent2',
|
|
412
416
|
object: { flexplmThumbnailUrl: '/rest/thumbnail/new.jpg' },
|
|
413
417
|
}));
|
|
418
|
+
// Updates the main entity
|
|
414
419
|
expect(mockEntitiesUpdate).toHaveBeenCalledWith(expect.objectContaining({ entityName: 'item', id: 'entity1' }));
|
|
420
|
+
// Deletes old content
|
|
415
421
|
expect(mockEntitiesDelete).toHaveBeenCalledWith({ entityName: 'content', id: 'oldPv' });
|
|
416
422
|
});
|
|
417
423
|
it('does not update when primaryViewable.flexplmThumbnailUrl matches', async () => {
|
|
@@ -57,7 +57,7 @@ exports.mapping = {
|
|
|
57
57
|
vibeOwningKeys: ['itemNumber', 'lifecycleStage'],
|
|
58
58
|
vibe2flex: {
|
|
59
59
|
getClass: () => 'LCSProduct',
|
|
60
|
-
getSoftType: (entity) => {
|
|
60
|
+
getSoftType: (entity /*, dependencies*/) => {
|
|
61
61
|
const prodType = entity['prodType'];
|
|
62
62
|
let val = '';
|
|
63
63
|
switch (prodType) {
|
|
@@ -82,7 +82,7 @@ exports.mapping = {
|
|
|
82
82
|
vibeIQIdentifier: 'itemNumber'
|
|
83
83
|
},
|
|
84
84
|
valueTransform: {
|
|
85
|
-
transformEx: (row) => {
|
|
85
|
+
transformEx: (row /*, dependencies*/) => {
|
|
86
86
|
return row['otherProp'] + 'xxx';
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -100,7 +100,7 @@ exports.mapping = {
|
|
|
100
100
|
vibeOwningKeys: ['itemNumber', 'lifecycleStage'],
|
|
101
101
|
vibe2flex: {
|
|
102
102
|
getClass: () => 'LCSSKU',
|
|
103
|
-
getSoftType: (entity) => {
|
|
103
|
+
getSoftType: (entity /*, dependencies*/) => {
|
|
104
104
|
const prodType = entity['prodType'];
|
|
105
105
|
let val = '';
|
|
106
106
|
switch (prodType) {
|
|
@@ -1,24 +1,175 @@
|
|
|
1
1
|
import { MapFileUtil } from '@contrail/transform-data';
|
|
2
|
+
/** This class is helper functions to get the data for converting
|
|
3
|
+
* VibeIQ entities to / from FlexPLM Objects
|
|
4
|
+
*/
|
|
2
5
|
export declare class TypeConversionUtils {
|
|
3
6
|
static NO_ENTITY_TYPE: string;
|
|
4
7
|
static VIBE2FLEX_DIRECTION: string;
|
|
5
8
|
static FLEX2VIBE_DIRECTION: string;
|
|
6
9
|
constructor();
|
|
10
|
+
/** Takes in a VibeIQ entity object and returns the correct FlexPLM
|
|
11
|
+
* object class associated to the entity. Order of precedence
|
|
12
|
+
* Property 'flexPLMObjectClass'
|
|
13
|
+
* Map file entry in 'typeConversion:vibe2flex:<value>:getObjectClass()'
|
|
14
|
+
* for value from 'entityClass' or root from 'typePath'
|
|
15
|
+
* TypeDefaults.getDefaultObjectClass() function
|
|
16
|
+
* @param transformMapFile id for mapFile
|
|
17
|
+
* @param mapFileUtil class to get mapfile
|
|
18
|
+
* @param entity
|
|
19
|
+
* @returns Promise<string>
|
|
20
|
+
*/
|
|
7
21
|
static getObjectClass(transformMapFile: any, mapFileUtil: any, entity: any): Promise<string>;
|
|
22
|
+
/** Takes in a VibeIQ entity object and returns the correct FlexPLM
|
|
23
|
+
* FlexType associated to the entity. Order of precedence
|
|
24
|
+
* Property 'flexPLMTypePath'
|
|
25
|
+
* Map file entry in 'typeConversion:vibe2flex:<value>:getSoftType()'
|
|
26
|
+
* for value from 'entityClass' or root from 'typePath'
|
|
27
|
+
* TypeDefaults.getDefaultObjectTypePath() function
|
|
28
|
+
*
|
|
29
|
+
* @param transformMapFile id for mapFile
|
|
30
|
+
* @param mapFileUtil class to get mapfile
|
|
31
|
+
* @param entity VibeIQ entity
|
|
32
|
+
* @returns Promise<string>
|
|
33
|
+
*/
|
|
8
34
|
static getObjectTypePath(transformMapFile: any, mapFileUtil: any, entity: any): Promise<string>;
|
|
35
|
+
/**Takes in a VibeIQ entity object and returns the correct
|
|
36
|
+
* identifier properties. Order of precedence
|
|
37
|
+
* Property 'flexPLMIdentifierProperties'
|
|
38
|
+
* Map file entry in 'typeConversion:vibe2flex:<value>:getIdentifierProperties()'
|
|
39
|
+
* for value from 'entityClass' or root from 'typePath'
|
|
40
|
+
* TypeDefaults.getDefaultIdentifierProperties() function
|
|
41
|
+
*
|
|
42
|
+
* @param transformMapFile id for mapFile
|
|
43
|
+
* @param mapFileUtil class to get mapfile
|
|
44
|
+
* @param entity
|
|
45
|
+
* @returns Promise<string[]>
|
|
46
|
+
*/
|
|
9
47
|
static getIdentifierProperties(transformMapFile: any, mapFileUtil: any, entity: any): Promise<string[]>;
|
|
48
|
+
/**Takes in a VibeIQ entity object and returns the correct
|
|
49
|
+
* informational properties. Order of precedence
|
|
50
|
+
* Property 'flexPLMInformationalProperties'
|
|
51
|
+
* Map file entry in 'typeConversion:vibe2flex:<value>:getInformationalProperties()'
|
|
52
|
+
* for value from 'entityClass' or root from 'typePath'
|
|
53
|
+
* TypeDefaults.getDefaultObjectTypePath() function
|
|
54
|
+
*
|
|
55
|
+
* @param transformMapFile id for mapFile
|
|
56
|
+
* @param mapFileUtil class to get mapfile
|
|
57
|
+
* @param entity
|
|
58
|
+
* @returns string
|
|
59
|
+
*/
|
|
10
60
|
static getInformationalProperties(transformMapFile: any, mapFileUtil: any, entity: any): Promise<string[]>;
|
|
61
|
+
/**Takes in a VibeIQ entity object and returns the correct mapKey
|
|
62
|
+
* Order of precedence:
|
|
63
|
+
* Map file entry in 'typeConversion:<direction>:<value>:getObjectClass()'
|
|
64
|
+
* for value from 'entityClass' or root from 'typePath'
|
|
65
|
+
* TypeDefaults.getDefaultObjectClass() function
|
|
66
|
+
*
|
|
67
|
+
* @param transformMapFile
|
|
68
|
+
* @param mapFileUtil
|
|
69
|
+
* @param entity
|
|
70
|
+
* @param type
|
|
71
|
+
* @param direction
|
|
72
|
+
* @returns
|
|
73
|
+
*/
|
|
11
74
|
static getMapKey(transformMapFile: any, mapFileUtil: MapFileUtil, entity: any, direction: string): Promise<string>;
|
|
75
|
+
/** Returns the VibeIQ entity type from an entity.
|
|
76
|
+
* Throws error if it can't determine the entity type
|
|
77
|
+
*
|
|
78
|
+
* @param entity
|
|
79
|
+
* @returns string
|
|
80
|
+
*/
|
|
12
81
|
static getEntityType(entity: any): any;
|
|
82
|
+
/** Takes in a FlexPLM object and returns the correct VibeIQ entity
|
|
83
|
+
* class associated to the object. Order of precedence
|
|
84
|
+
* Property 'vibeIQEntityClass'
|
|
85
|
+
* Map file entry in 'typeConversion:flex2vibe:<value>:getObjectClass()'
|
|
86
|
+
* for value from 'objectClass'
|
|
87
|
+
* TypeDefaults.getDefaultEntityClass() function
|
|
88
|
+
*
|
|
89
|
+
* @param fileId id for mapFile
|
|
90
|
+
* @param mapFileUtil class to get mapfile
|
|
91
|
+
* @param object FlexPLM object
|
|
92
|
+
* @returns Promise<string>
|
|
93
|
+
*/
|
|
13
94
|
static getEntityClassFromObject(fileId: any, mapFileUtil: any, object: any): Promise<string>;
|
|
95
|
+
/** Takes in a FlexPLM object and returns the correct VibeIQ uniqueness
|
|
96
|
+
* pool key. Order of precedence:
|
|
97
|
+
* Map file entry in 'typeConversion:flex2vibe:<value>:getUniquenessPool()'
|
|
98
|
+
* for value from 'objectClass'
|
|
99
|
+
* TypeDefaults.getDefaultEntityClass() function
|
|
100
|
+
*
|
|
101
|
+
* @param fileId id for mapFile
|
|
102
|
+
* @param mapFileUtil class to get mapfile
|
|
103
|
+
* @param object FlexPLM object
|
|
104
|
+
* @returns Promise<string>
|
|
105
|
+
*/
|
|
14
106
|
static getUniquenessPoolKeyFromObject(fileId: any, mapFileUtil: any, object: any): Promise<string>;
|
|
15
107
|
static getEntityTypePathFromOjbect(fileId: any, mapFileUtil: any, object: any): Promise<string>;
|
|
108
|
+
/** Takes in a FlexPLM object and returns the correct VibeIQ
|
|
109
|
+
* type associated to the object. Order of precedence
|
|
110
|
+
* Property 'vibeIQTypePath'
|
|
111
|
+
* Map file entry in 'typeConversion:flex2vibe:<value>:getSoftType()'
|
|
112
|
+
* for value from 'objectClass' or root from 'flexPLMTypePath'
|
|
113
|
+
* TypeDefaults.getDefaultEntityTypePath() function
|
|
114
|
+
*
|
|
115
|
+
* @param transformMapFile id for mapFile
|
|
116
|
+
* @param mapFileUtil class to get mapfile
|
|
117
|
+
* @param entity VibeIQ entity
|
|
118
|
+
* @returns Promise<string>
|
|
119
|
+
*/
|
|
120
|
+
static getEntityTypePathFromObject(fileId: any, mapFileUtil: any, object: any): Promise<string>;
|
|
121
|
+
/**Takes in a FlexPLM object and returns the correct
|
|
122
|
+
* identifier properties. Order of precedence
|
|
123
|
+
* Property 'vibeIQIdentifierProperties'
|
|
124
|
+
* Map file entry in 'typeConversion:flex2vibe:<value>:getIdentifierProperties()'
|
|
125
|
+
* for value from 'objectClass'
|
|
126
|
+
* TypeDefaults.getDefaultIdentifierPropertiesFromObject() function
|
|
127
|
+
*
|
|
128
|
+
* @param transformMapFile id for mapFile
|
|
129
|
+
* @param mapFileUtil class to get mapfile
|
|
130
|
+
* @param object
|
|
131
|
+
* @returns Promise<string[]>
|
|
132
|
+
*/
|
|
16
133
|
static getIdentifierPropertiesFromObject(fileId: any, mapFileUtil: MapFileUtil, object: any): Promise<string[]>;
|
|
134
|
+
/**Takes in a FlexPLM object and returns the correct
|
|
135
|
+
* identifier properties. Order of precedence
|
|
136
|
+
* Property 'vibeIQIdentifierProperties'
|
|
137
|
+
* Map file entry in 'typeConversion:flex2vibe:<value>:getInformationalProperties()'
|
|
138
|
+
* for value from 'objectClass'
|
|
139
|
+
* TypeDefaults.getDefaultIdentifierPropertiesFromObject() function
|
|
140
|
+
*
|
|
141
|
+
* @param transformMapFile id for mapFile
|
|
142
|
+
* @param mapFileUtil class to get mapfile
|
|
143
|
+
* @param object
|
|
144
|
+
* @returns Promise<string[]>
|
|
145
|
+
*/
|
|
17
146
|
static getInformationalPropertiesFromObject(fileId: any, mapFileUtil: MapFileUtil, object: any): Promise<string[]>;
|
|
18
147
|
static getMapKeyFromObject(fileId: any, mapFileUtil: MapFileUtil, object: any, direction: string): Promise<string | undefined>;
|
|
19
148
|
static isInboundCreatableFromObject(fileId: string, mapFileUtil: MapFileUtil, object: any, context?: any): Promise<boolean>;
|
|
20
149
|
static isOutboundCreatableFromEntity(fileId: string, mapFileUtil: MapFileUtil, entity: any, context?: any): Promise<boolean>;
|
|
150
|
+
/** Takes in a FlexPLM object and determines whether inbound
|
|
151
|
+
* images should be synced. In most cases, the creation owning system
|
|
152
|
+
* will also control image syncing. Defaults to false if no mapping exists.
|
|
153
|
+
* Map file entry in '<mapKey>:syncInboundImages()'
|
|
154
|
+
*
|
|
155
|
+
* @param fileId id for mapFile
|
|
156
|
+
* @param mapFileUtil class to get mapfile
|
|
157
|
+
* @param object FlexPLM object
|
|
158
|
+
* @param context optional context object
|
|
159
|
+
* @returns Promise<boolean>
|
|
160
|
+
*/
|
|
21
161
|
static syncInboundImages(fileId: string, mapFileUtil: MapFileUtil, object: any, context?: any): Promise<boolean>;
|
|
162
|
+
/** Takes in a VibeIQ entity object and determines whether outbound
|
|
163
|
+
* images should be synced. In most cases, the creation owning system
|
|
164
|
+
* will also control image syncing. Defaults to true if no mapping exists.
|
|
165
|
+
* Map file entry in '<mapKey>:syncOutboundImages()'
|
|
166
|
+
*
|
|
167
|
+
* @param fileId id for mapFile
|
|
168
|
+
* @param mapFileUtil class to get mapfile
|
|
169
|
+
* @param entity VibeIQ entity
|
|
170
|
+
* @param context optional context object
|
|
171
|
+
* @returns Promise<boolean>
|
|
172
|
+
*/
|
|
22
173
|
static syncOutboundImages(fileId: string, mapFileUtil: MapFileUtil, entity: any, context?: any): Promise<boolean>;
|
|
23
174
|
static getObjectType(object: any): any;
|
|
24
175
|
}
|