@contrail/flexplm 1.3.0-alpha.ccc03be → 1.3.1-alpha.3e8dbdd

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 (111) hide show
  1. package/lib/cli/commands/compile.d.ts +1 -0
  2. package/lib/cli/commands/compile.js +71 -0
  3. package/lib/cli/commands/compile.spec.d.ts +1 -0
  4. package/lib/cli/commands/compile.spec.js +80 -0
  5. package/lib/cli/commands/create.d.ts +1 -0
  6. package/lib/cli/commands/create.js +75 -0
  7. package/lib/cli/commands/create.spec.d.ts +1 -0
  8. package/lib/cli/commands/create.spec.js +78 -0
  9. package/lib/cli/commands/upload.d.ts +10 -0
  10. package/lib/cli/commands/upload.js +226 -0
  11. package/lib/cli/commands/upload.spec.d.ts +1 -0
  12. package/lib/cli/commands/upload.spec.js +88 -0
  13. package/lib/cli/index.d.ts +2 -0
  14. package/lib/cli/index.js +64 -0
  15. package/lib/cli/index.spec.d.ts +1 -0
  16. package/lib/cli/index.spec.js +79 -0
  17. package/lib/cli/template/mapping-template.ts.template +62 -0
  18. package/lib/entity-processor/base-entity-processor.d.ts +47 -0
  19. package/lib/entity-processor/base-entity-processor.js +53 -0
  20. package/lib/entity-processor/base-entity-processor.spec.js +1 -0
  21. package/lib/index.d.ts +1 -0
  22. package/lib/index.js +1 -0
  23. package/lib/interfaces/mapping-file.d.ts +460 -0
  24. package/lib/interfaces/mapping-file.js +2 -0
  25. package/lib/publish/base-process-publish-assortment.d.ts +25 -0
  26. package/lib/publish/base-process-publish-assortment.js +60 -6
  27. package/lib/publish/base-process-publish-assortment.spec.js +22 -4
  28. package/lib/publish/mockData.js +5 -0
  29. package/lib/transform/identifier-conversion-spec-mockData.js +34 -6
  30. package/lib/transform/identifier-conversion.d.ts +36 -0
  31. package/lib/transform/identifier-conversion.js +36 -0
  32. package/lib/transform/identifier-conversion.spec.js +4 -0
  33. package/lib/util/config-defaults.js +3 -0
  34. package/lib/util/config-defaults.spec.js +9 -0
  35. package/lib/util/data-converter-spec-mockData.js +17 -3
  36. package/lib/util/data-converter.d.ts +97 -0
  37. package/lib/util/data-converter.js +127 -1
  38. package/lib/util/data-converter.spec.js +2 -0
  39. package/lib/util/error-response-object.d.ts +5 -0
  40. package/lib/util/error-response-object.js +7 -0
  41. package/lib/util/event-short-message-status.js +1 -0
  42. package/lib/util/federation.js +8 -0
  43. package/lib/util/flexplm-connect.d.ts +7 -0
  44. package/lib/util/flexplm-connect.js +14 -0
  45. package/lib/util/logger-config.js +1 -0
  46. package/lib/util/map-util-spec-mockData.js +17 -3
  47. package/lib/util/map-utils.d.ts +27 -0
  48. package/lib/util/map-utils.js +27 -0
  49. package/lib/util/thumbnail-util.d.ts +21 -0
  50. package/lib/util/thumbnail-util.js +28 -1
  51. package/lib/util/thumbnail-util.spec.js +6 -0
  52. package/lib/util/type-conversion-utils-spec-mockData.js +3 -3
  53. package/lib/util/type-conversion-utils.d.ts +140 -0
  54. package/lib/util/type-conversion-utils.js +143 -0
  55. package/lib/util/type-defaults.d.ts +58 -0
  56. package/lib/util/type-defaults.js +58 -0
  57. package/lib/util/type-defaults.spec.js +5 -5
  58. package/lib/util/type-utils.d.ts +21 -0
  59. package/lib/util/type-utils.js +23 -0
  60. package/lib/util/type-utils.spec.js +2 -0
  61. package/package.json +21 -6
  62. package/scripts/copy-template.js +10 -0
  63. package/.github/pull_request_template.md +0 -31
  64. package/.github/workflows/flexplm-lib.yml +0 -27
  65. package/.github/workflows/publish-to-npm.yml +0 -121
  66. package/CHANGELOG.md +0 -32
  67. package/publish.bat +0 -5
  68. package/publish.sh +0 -5
  69. package/src/entity-processor/base-entity-processor.spec.ts +0 -460
  70. package/src/entity-processor/base-entity-processor.ts +0 -515
  71. package/src/flexplm-request.ts +0 -28
  72. package/src/flexplm-utils.spec.ts +0 -27
  73. package/src/flexplm-utils.ts +0 -29
  74. package/src/index.ts +0 -22
  75. package/src/interfaces/interfaces.ts +0 -122
  76. package/src/interfaces/item-family-changes.ts +0 -67
  77. package/src/interfaces/publish-change-data.ts +0 -43
  78. package/src/publish/base-process-publish-assortment-callback.ts +0 -50
  79. package/src/publish/base-process-publish-assortment.spec.ts +0 -1992
  80. package/src/publish/base-process-publish-assortment.ts +0 -1134
  81. package/src/publish/mockData.ts +0 -4561
  82. package/src/transform/identifier-conversion-spec-mockData.ts +0 -496
  83. package/src/transform/identifier-conversion.spec.ts +0 -354
  84. package/src/transform/identifier-conversion.ts +0 -282
  85. package/src/util/config-defaults.spec.ts +0 -350
  86. package/src/util/config-defaults.ts +0 -93
  87. package/src/util/data-converter-spec-mockData.ts +0 -231
  88. package/src/util/data-converter.spec.ts +0 -1041
  89. package/src/util/data-converter.ts +0 -762
  90. package/src/util/error-response-object.spec.ts +0 -116
  91. package/src/util/error-response-object.ts +0 -50
  92. package/src/util/event-short-message-status.ts +0 -22
  93. package/src/util/federation.ts +0 -172
  94. package/src/util/flexplm-connect.spec.ts +0 -132
  95. package/src/util/flexplm-connect.ts +0 -208
  96. package/src/util/logger-config.ts +0 -20
  97. package/src/util/map-util-spec-mockData.ts +0 -231
  98. package/src/util/map-utils.spec.ts +0 -103
  99. package/src/util/map-utils.ts +0 -41
  100. package/src/util/mockData.ts +0 -101
  101. package/src/util/thumbnail-util.spec.ts +0 -508
  102. package/src/util/thumbnail-util.ts +0 -272
  103. package/src/util/type-conversion-utils-spec-mockData.ts +0 -271
  104. package/src/util/type-conversion-utils.spec.ts +0 -968
  105. package/src/util/type-conversion-utils.ts +0 -460
  106. package/src/util/type-defaults.spec.ts +0 -669
  107. package/src/util/type-defaults.ts +0 -281
  108. package/src/util/type-utils.spec.ts +0 -227
  109. package/src/util/type-utils.ts +0 -144
  110. package/tsconfig.json +0 -24
  111. package/tslint.json +0 -57
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.main = void 0;
5
+ const create_1 = require("./commands/create");
6
+ const compile_1 = require("./commands/compile");
7
+ const upload_1 = require("./commands/upload");
8
+ const USAGE = `Usage: flexplm-mapping <command> [args]
9
+
10
+ Commands:
11
+ create Scaffold a new mapping .ts file in the current directory
12
+ compile <path.ts> Transpile a mapping .ts file to .js alongside it
13
+ upload <path.ts> [opts] Compile a mapping .ts file and upload the resulting .js to VibeIQ
14
+
15
+ Upload options:
16
+ -m <message> Git commit message (prompted if omitted)
17
+ -b <branch> Create a new git branch before committing
18
+ --skip-git Skip the post-upload git commit (default: commit)
19
+
20
+ Environment (upload):
21
+ CONTRAIL_CLI_EMAIL VibeIQ user email
22
+ CONTRAIL_CLI_PASSWORD VibeIQ user password
23
+ `;
24
+ async function main() {
25
+ const [, , command, ...rest] = process.argv;
26
+ switch (command) {
27
+ case 'create':
28
+ await (0, create_1.runCreate)();
29
+ return;
30
+ case 'compile':
31
+ if (!rest[0]) {
32
+ console.error('compile: missing <path.ts> argument');
33
+ console.error(USAGE);
34
+ process.exit(1);
35
+ }
36
+ await (0, compile_1.runCompile)(rest[0]);
37
+ return;
38
+ case 'upload':
39
+ if (!rest[0]) {
40
+ console.error('upload: missing <path.ts> argument');
41
+ console.error(USAGE);
42
+ process.exit(1);
43
+ }
44
+ await (0, upload_1.runUpload)(rest);
45
+ return;
46
+ case undefined:
47
+ case '-h':
48
+ case '--help':
49
+ case 'help':
50
+ console.log(USAGE);
51
+ return;
52
+ default:
53
+ console.error(`Unknown command: ${command}`);
54
+ console.error(USAGE);
55
+ process.exit(1);
56
+ }
57
+ }
58
+ exports.main = main;
59
+ if (require.main === module) {
60
+ main().catch((err) => {
61
+ console.error(err && err.message ? err.message : err);
62
+ process.exit(1);
63
+ });
64
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ jest.mock('./commands/create', () => ({ runCreate: jest.fn().mockResolvedValue(undefined) }));
4
+ jest.mock('./commands/compile', () => ({ runCompile: jest.fn().mockResolvedValue(undefined) }));
5
+ jest.mock('./commands/upload', () => ({ runUpload: jest.fn().mockResolvedValue(undefined) }));
6
+ const create_1 = require("./commands/create");
7
+ const compile_1 = require("./commands/compile");
8
+ const upload_1 = require("./commands/upload");
9
+ const index_1 = require("./index");
10
+ describe('cli main dispatcher', () => {
11
+ let originalArgv;
12
+ let logSpy;
13
+ let errorSpy;
14
+ let exitSpy;
15
+ beforeEach(() => {
16
+ originalArgv = process.argv;
17
+ create_1.runCreate.mockClear();
18
+ compile_1.runCompile.mockClear();
19
+ upload_1.runUpload.mockClear();
20
+ logSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
21
+ errorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
22
+ exitSpy = jest.spyOn(process, 'exit').mockImplementation(((code) => {
23
+ throw new Error(`__EXIT__:${code}`);
24
+ }));
25
+ });
26
+ afterEach(() => {
27
+ process.argv = originalArgv;
28
+ logSpy.mockRestore();
29
+ errorSpy.mockRestore();
30
+ exitSpy.mockRestore();
31
+ });
32
+ function setArgv(...args) {
33
+ process.argv = ['node', 'cli', ...args];
34
+ }
35
+ it('dispatches the create command', async () => {
36
+ setArgv('create');
37
+ await (0, index_1.main)();
38
+ expect(create_1.runCreate).toHaveBeenCalledTimes(1);
39
+ expect(compile_1.runCompile).not.toHaveBeenCalled();
40
+ expect(upload_1.runUpload).not.toHaveBeenCalled();
41
+ });
42
+ it('dispatches the compile command with its argument', async () => {
43
+ setArgv('compile', 'mapping.ts');
44
+ await (0, index_1.main)();
45
+ expect(compile_1.runCompile).toHaveBeenCalledWith('mapping.ts');
46
+ });
47
+ it('exits when compile is missing its argument', async () => {
48
+ setArgv('compile');
49
+ await expect((0, index_1.main)()).rejects.toThrow('__EXIT__:1');
50
+ expect(compile_1.runCompile).not.toHaveBeenCalled();
51
+ expect(errorSpy).toHaveBeenCalledWith(expect.stringMatching(/missing <path\.ts>/));
52
+ });
53
+ it('dispatches the upload command and forwards remaining args', async () => {
54
+ setArgv('upload', 'mapping.ts', '-m', 'msg', '--skip-git');
55
+ await (0, index_1.main)();
56
+ expect(upload_1.runUpload).toHaveBeenCalledWith(['mapping.ts', '-m', 'msg', '--skip-git']);
57
+ });
58
+ it('exits when upload is missing its argument', async () => {
59
+ setArgv('upload');
60
+ await expect((0, index_1.main)()).rejects.toThrow('__EXIT__:1');
61
+ expect(upload_1.runUpload).not.toHaveBeenCalled();
62
+ expect(errorSpy).toHaveBeenCalledWith(expect.stringMatching(/missing <path\.ts>/));
63
+ });
64
+ it.each(['help', '-h', '--help'])('prints usage for %s', async (helpFlag) => {
65
+ setArgv(helpFlag);
66
+ await (0, index_1.main)();
67
+ expect(logSpy).toHaveBeenCalledWith(expect.stringMatching(/Usage: flexplm-mapping/));
68
+ });
69
+ it('prints usage when no command is provided', async () => {
70
+ setArgv();
71
+ await (0, index_1.main)();
72
+ expect(logSpy).toHaveBeenCalledWith(expect.stringMatching(/Usage: flexplm-mapping/));
73
+ });
74
+ it('exits on an unknown command', async () => {
75
+ setArgv('bogus');
76
+ await expect((0, index_1.main)()).rejects.toThrow('__EXIT__:1');
77
+ expect(errorSpy).toHaveBeenCalledWith(expect.stringMatching(/Unknown command: bogus/));
78
+ });
79
+ });
@@ -0,0 +1,62 @@
1
+ import type { MappingFile } from '@contrail/flexplm';
2
+
3
+ export const mapping: MappingFile = {
4
+ orgInfo: {
5
+ appIdentifier: '@vibeiq/flexplm-connector',
6
+ orgName: '<ORG_NAME>',
7
+ },
8
+ typeConversion: {
9
+ vibe2flex: {},
10
+ flex2vibe: {},
11
+ },
12
+ LCSSeason: {
13
+ vibeOwningKeys: ['flexPLMSeasonName'],
14
+ vibe2flex: {
15
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
16
+ rekey: {
17
+ seasonName: 'flexPLMSeasonName',
18
+ },
19
+ },
20
+ flex2vibe: {
21
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
22
+ rekey: {
23
+ flexPLMSeasonName: 'seasonName',
24
+ },
25
+ },
26
+ },
27
+ LCSProduct: {
28
+ vibeOwningKeys: ['itemNumber'],
29
+ vibe2flex: {
30
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
31
+ rekey: {
32
+ vibeIQIdentifier: 'itemNumber',
33
+ productName: 'name',
34
+ },
35
+ },
36
+ flex2vibe: {
37
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
38
+ rekey: {
39
+ itemNumber: 'vibeIQIdentifier',
40
+ name: 'productName',
41
+ },
42
+ },
43
+ },
44
+ LCSSKU: {
45
+ vibeOwningKeys: ['itemNumber'],
46
+ vibe2flex: {
47
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
48
+ rekey: {
49
+ vibeIQIdentifier: 'itemNumber',
50
+ skuName: 'optionName',
51
+ },
52
+ },
53
+ flex2vibe: {
54
+ transformOrder: [{ processor: 'REKEY', rekeyDelete: true, rekeyTransformersKey: 'rekey' }],
55
+ rekey: {
56
+ itemNumber: 'vibeIQIdentifier',
57
+ optionName: 'skuName',
58
+ },
59
+ },
60
+ },
61
+
62
+ };
@@ -19,8 +19,36 @@ export declare abstract class BaseEntityProcessor {
19
19
  inbound(event: EntityPayloadType): Promise<any>;
20
20
  handleIncomingUpsert(event: EntityPayloadType): Promise<any>;
21
21
  getInboundStatusMessage(statusObject: any): string;
22
+ /**This will query for the entity, and handle post-processing
23
+ * of any critieria that is defined at the sub-type level.
24
+ * Because sub-type criteria can't be used in the search done
25
+ * on the server. This is expected to be called by getIncomingEntity().
26
+ *
27
+ * @param entityType: the root type of the entity
28
+ * @param entityTypePath: the full type path of the entity. Ex: custom-entity:sample
29
+ * @param propertyCriteria: all the criteria to search for the entity
30
+ * @returns the entities that match the criteria
31
+ */
22
32
  queryEntityWithSubTypeCriteria(entityType: string, entityTypePath: string, propertyCriteria: any): Promise<any[]>;
33
+ /** This is to get the criteria for the entity that is being processed.
34
+ * This is to be overridden for item & project-item because of the need for
35
+ * setting the roles criteria.
36
+ *
37
+ * @param entityType: the root type of the entity
38
+ * @param entityTypePath: the full type path of the entity. Ex: custom-entity:sample
39
+ * @param propertyCriteria: all the criteria to search for the entity
40
+ * @returns the criteria for the entity
41
+ */
23
42
  getCriteriaForEntity(entityType: string, entityTypePath: string, propertyCriteria: any): Promise<any>;
43
+ /** This is to get the properties that are owned by the root type
44
+ * This needs to be overridded for multi-level types, such as item
45
+ * and project-item. And for those types, the propertyCriteria
46
+ * will be needed to determine the correct level.
47
+ *
48
+ * @param rootType: the full root type entity for the processed entity
49
+ * @param propertyCriteria: the criteria to determine the correct level (unused for single level types)
50
+ * @returns: string[] of the property keys
51
+ */
24
52
  getRootTypePropertyKeys(rootType: any, propertyCriteria?: any): string[];
25
53
  handleIncomingDelete(event: any): Promise<void>;
26
54
  getTransformedData(event: any): Promise<any>;
@@ -36,7 +64,26 @@ export declare abstract class BaseEntityProcessor {
36
64
  getOutboundEntityUpdates(event: any, flexResponse: any): Promise<any>;
37
65
  handleOutgoingDelete(entityType: any, event: any): Promise<void>;
38
66
  protected abstract getOutgoingUpsertPayload(entityType: any, event: any): Promise<EntityPayloadType>;
67
+ /** Create a new event-workflow-request to rerun sending the entity to FlexPLM
68
+ * The event must contain any information needed to ensure it is put in the correct queue for the entity
69
+ *
70
+ * @param triggerKey Ex: event.entityType + '|sendUpsertToFlexPLM'
71
+ * @param event
72
+ * @returns
73
+ */
39
74
  protected triggerNewEvent(triggerKey: string, event: any): Promise<any>;
75
+ /** Sends the current state of the entity to FlexPLM.
76
+ * So any changes made in Vibe between the event being generated and the event being processed are sent to FlexPLM.
77
+ *
78
+ * @param event must contain entityType, id; which are used to query for the entity
79
+ * @returns results of sending the entity to FlexPLM
80
+ */
40
81
  protected sendUpsertToFlexPLM(event: any): Promise<any>;
82
+ /** Generates the payload to send to FlexPLM, based on the current state of the entity.
83
+ * The current state of the entity are used as the newData and oldData; which is passed
84
+ * to getOutgoingUpsertPayload to generate the payload.
85
+ * @param event information about the item to send to FlexPLM
86
+ * @returns The payload to send to FlexPLM
87
+ */
41
88
  protected getEntityCurrentStateUpsertPayload(event: any): Promise<EntityPayloadType>;
42
89
  }
@@ -23,6 +23,7 @@ class BaseEntityProcessor {
23
23
  this.entities = new sdk_1.Entities();
24
24
  this.orgSlug = this.config?.orgSlug || 'unset-orgSlug';
25
25
  }
26
+ // inbound
26
27
  async inbound(event) {
27
28
  const eventType = event.eventType;
28
29
  console.log(`inbound entity: ${eventType}:${event.objectClass}`);
@@ -42,6 +43,7 @@ class BaseEntityProcessor {
42
43
  async handleIncomingUpsert(event) {
43
44
  const inboundData = await this.getTransformedData(event);
44
45
  const incomingEntityResponse = await this.getIncomingEntity(event, inboundData);
46
+ // This case means there was an early return in the getIncomingEntity method
45
47
  if (incomingEntityResponse.earlyReturn) {
46
48
  const statusMsg = this.getInboundStatusMessage({
47
49
  status: event_short_message_status_1.EventShortMessageStatus.FAILURE,
@@ -136,7 +138,18 @@ class BaseEntityProcessor {
136
138
  + ', federatedId: ' + statusObject.federatedId
137
139
  + ', orgSlug: ' + this.orgSlug;
138
140
  }
141
+ /**This will query for the entity, and handle post-processing
142
+ * of any critieria that is defined at the sub-type level.
143
+ * Because sub-type criteria can't be used in the search done
144
+ * on the server. This is expected to be called by getIncomingEntity().
145
+ *
146
+ * @param entityType: the root type of the entity
147
+ * @param entityTypePath: the full type path of the entity. Ex: custom-entity:sample
148
+ * @param propertyCriteria: all the criteria to search for the entity
149
+ * @returns the entities that match the criteria
150
+ */
139
151
  async queryEntityWithSubTypeCriteria(entityType, entityTypePath, propertyCriteria) {
152
+ //allCriteria; identifierKeys; entityType; entityTypePath
140
153
  if (!entityType || !entityTypePath) {
141
154
  throw new Error('type and entityTypePath must be defined');
142
155
  }
@@ -147,6 +160,15 @@ class BaseEntityProcessor {
147
160
  const returnedEntities = await this.dc.getAllObjectReferences(entityType, rootTypeCriteria, subTypeCriteria);
148
161
  return returnedEntities;
149
162
  }
163
+ /** This is to get the criteria for the entity that is being processed.
164
+ * This is to be overridden for item & project-item because of the need for
165
+ * setting the roles criteria.
166
+ *
167
+ * @param entityType: the root type of the entity
168
+ * @param entityTypePath: the full type path of the entity. Ex: custom-entity:sample
169
+ * @param propertyCriteria: all the criteria to search for the entity
170
+ * @returns the criteria for the entity
171
+ */
150
172
  async getCriteriaForEntity(entityType, entityTypePath, propertyCriteria) {
151
173
  if (!entityType || !entityTypePath) {
152
174
  throw new Error('type and entityTypePath must be defined');
@@ -171,6 +193,15 @@ class BaseEntityProcessor {
171
193
  }
172
194
  return { rootTypeCriteria, subTypeCriteria };
173
195
  }
196
+ /** This is to get the properties that are owned by the root type
197
+ * This needs to be overridded for multi-level types, such as item
198
+ * and project-item. And for those types, the propertyCriteria
199
+ * will be needed to determine the correct level.
200
+ *
201
+ * @param rootType: the full root type entity for the processed entity
202
+ * @param propertyCriteria: the criteria to determine the correct level (unused for single level types)
203
+ * @returns: string[] of the property keys
204
+ */
174
205
  getRootTypePropertyKeys(rootType, propertyCriteria = null) {
175
206
  const props = rootType['typeProperties'];
176
207
  const rootTypePropertyKeys = props.map(prop => prop.slug);
@@ -203,6 +234,8 @@ class BaseEntityProcessor {
203
234
  async getVibeOwningKeys(entity) {
204
235
  let vibeOwningKeys = [];
205
236
  if (this.transformMapFile && entity) {
237
+ //Technically the transform is flex->vibe. But the vibe entity being updated was passed in,
238
+ // so we use VIBE2FLEX_DIRECTION to get the mapKey
206
239
  const mapKey = await type_conversion_utils_1.TypeConversionUtils.getMapKey(this.transformMapFile, this.mapFileUtil, entity, type_conversion_utils_1.TypeConversionUtils.VIBE2FLEX_DIRECTION);
207
240
  const mapSection = await map_utils_1.MapUtil.getFullMapSection(this.transformMapFile, this.mapFileUtil, mapKey);
208
241
  vibeOwningKeys = mapSection?.vibeOwningKeys || [];
@@ -237,6 +270,7 @@ class BaseEntityProcessor {
237
270
  console.log('updateEntity: ' + JSON.stringify(options));
238
271
  return await new sdk_1.Entities().update(options);
239
272
  }
273
+ // outbound
240
274
  async outbound(event) {
241
275
  const entityType = event.entityType;
242
276
  const eventType = event.eventType;
@@ -313,6 +347,13 @@ class BaseEntityProcessor {
313
347
  async handleOutgoingDelete(entityType, event) {
314
348
  console.warn('delete is not configured', entityType, event.oldData);
315
349
  }
350
+ /** Create a new event-workflow-request to rerun sending the entity to FlexPLM
351
+ * The event must contain any information needed to ensure it is put in the correct queue for the entity
352
+ *
353
+ * @param triggerKey Ex: event.entityType + '|sendUpsertToFlexPLM'
354
+ * @param event
355
+ * @returns
356
+ */
316
357
  async triggerNewEvent(triggerKey, event) {
317
358
  const newEvent = {
318
359
  entityName: 'event-workflow-request',
@@ -324,6 +365,12 @@ class BaseEntityProcessor {
324
365
  const response = await this.entities.create(newEvent);
325
366
  return response;
326
367
  }
368
+ /** Sends the current state of the entity to FlexPLM.
369
+ * So any changes made in Vibe between the event being generated and the event being processed are sent to FlexPLM.
370
+ *
371
+ * @param event must contain entityType, id; which are used to query for the entity
372
+ * @returns results of sending the entity to FlexPLM
373
+ */
327
374
  async sendUpsertToFlexPLM(event) {
328
375
  const payload = await this.getEntityCurrentStateUpsertPayload(event);
329
376
  if (!payload) {
@@ -364,6 +411,12 @@ class BaseEntityProcessor {
364
411
  throw e;
365
412
  }
366
413
  }
414
+ /** Generates the payload to send to FlexPLM, based on the current state of the entity.
415
+ * The current state of the entity are used as the newData and oldData; which is passed
416
+ * to getOutgoingUpsertPayload to generate the payload.
417
+ * @param event information about the item to send to FlexPLM
418
+ * @returns The payload to send to FlexPLM
419
+ */
367
420
  async getEntityCurrentStateUpsertPayload(event) {
368
421
  const id = event.id;
369
422
  if (!id) {
@@ -269,6 +269,7 @@ describe('BaseEntityProcessor', () => {
269
269
  const rootCriteriaResults = Object.assign({}, rootCriteria);
270
270
  const subCriteriaResults = Object.assign({}, subCriteria);
271
271
  const mockGetByRootTypeProperties = jest.spyOn(btep, 'getRootTypePropertyKeys').mockReturnValue(['rootText']);
272
+ // const mockDCgetAllObjectReferences = jest.spyOn(dc, 'getAllObjectReferences').mockReturnValue(Promise.resolve([]));
272
273
  const { rootTypeCriteria, subTypeCriteria } = await btep.getCriteriaForEntity(entityType, entityTypePath, propertyCriteria);
273
274
  expect(mockTypeUtilGetByRootAndPath).toBeCalledTimes(1);
274
275
  expect(mockTypeUtilGetByRootAndPath).toBeCalledWith({ root: entityType });
package/lib/index.d.ts CHANGED
@@ -16,6 +16,7 @@ export * from './util/map-utils';
16
16
  export * from './interfaces/interfaces';
17
17
  export * from './interfaces/item-family-changes';
18
18
  export * from './interfaces/publish-change-data';
19
+ export * from './interfaces/mapping-file';
19
20
  export * from './publish/base-process-publish-assortment';
20
21
  export * from './publish/base-process-publish-assortment-callback';
21
22
  export * from './entity-processor/base-entity-processor';
package/lib/index.js CHANGED
@@ -32,6 +32,7 @@ __exportStar(require("./util/map-utils"), exports);
32
32
  __exportStar(require("./interfaces/interfaces"), exports);
33
33
  __exportStar(require("./interfaces/item-family-changes"), exports);
34
34
  __exportStar(require("./interfaces/publish-change-data"), exports);
35
+ __exportStar(require("./interfaces/mapping-file"), exports);
35
36
  __exportStar(require("./publish/base-process-publish-assortment"), exports);
36
37
  __exportStar(require("./publish/base-process-publish-assortment-callback"), exports);
37
38
  __exportStar(require("./entity-processor/base-entity-processor"), exports);