@elliemae/pui-app-sdk 5.22.0 → 5.23.0

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 (141) hide show
  1. package/dist/cjs/analytics/index.js +2 -1
  2. package/dist/cjs/index.js +3 -0
  3. package/dist/cjs/utils/micro-frontend/app-bridge.js +38 -0
  4. package/dist/cjs/utils/micro-frontend/guest.js +101 -14
  5. package/dist/cjs/utils/micro-frontend/host.js +36 -3
  6. package/dist/cjs/utils/micro-frontend/scripting-objects/analytics.js +8 -14
  7. package/dist/cjs/utils/micro-frontend/tests/app.config.json +200 -0
  8. package/dist/cjs/utils/micro-frontend/tests/utils.js +116 -0
  9. package/dist/cjs/utils/testing/index.js +15 -1
  10. package/dist/cjs/view/guest-microapp.js +113 -0
  11. package/dist/cjs/view/micro-iframe-app/iframe/index.js +1 -1
  12. package/dist/cjs/view/micro-iframe-app/iframe.html +5 -1
  13. package/dist/cjs/view/micro-iframe-app/use-frame-loaded.js +3 -1
  14. package/dist/cjs/view/tests/__snapshots__/guest-microapp.test.tsx.snap +21 -0
  15. package/dist/cjs/view/tests/__snapshots__/micro-iframe-app.test.tsx.snap +208 -0
  16. package/dist/cjs/view/tests/app.config.json +200 -0
  17. package/dist/cjs/view/tests/constants.js +44 -0
  18. package/dist/cjs/view/tests/flights/23.1/app.checksum1.css +3 -0
  19. package/dist/cjs/view/tests/flights/23.1/app.checksum1.js +52 -0
  20. package/dist/cjs/view/tests/flights/23.1/manifest.json +4 -0
  21. package/dist/cjs/view/tests/flights/latest/app.checksum.css +3 -0
  22. package/dist/cjs/view/tests/flights/latest/app.checksum.js +52 -0
  23. package/dist/cjs/view/tests/flights/latest/manifest.json +4 -0
  24. package/dist/cjs/view/tests/hotels/23.1/app.checksum.css +3 -0
  25. package/dist/cjs/view/tests/hotels/23.1/app.checksum.js +52 -0
  26. package/dist/cjs/view/tests/hotels/23.1/manifest.json +4 -0
  27. package/dist/cjs/view/tests/hotels/latest/app.checksum.css +3 -0
  28. package/dist/cjs/view/tests/hotels/latest/app.checksum.js +52 -0
  29. package/dist/cjs/view/tests/hotels/latest/manifest.json +4 -0
  30. package/dist/cjs/view/tests/loan/latest/index.js +116 -0
  31. package/dist/cjs/view/tests/loan/latest/manifest.json +3 -0
  32. package/dist/cjs/view/tests/scriptingObjects/appraisalServiceModule.js +81 -0
  33. package/dist/cjs/{utils/micro-frontend/host-app.js → view/tests/scriptingObjects/constant.js} +5 -10
  34. package/dist/cjs/view/tests/scriptingObjects/global.js +40 -0
  35. package/dist/cjs/view/tests/scriptingObjects/loan.js +200 -0
  36. package/dist/cjs/view/tests/server.js +29 -0
  37. package/dist/cjs/view/tests/serverHandlers.js +210 -0
  38. package/dist/cjs/view/tests/task/latest/index.dev.js +67 -0
  39. package/dist/cjs/view/tests/task/latest/index.js +67 -0
  40. package/dist/cjs/view/tests/task/latest/manifest.json +4 -0
  41. package/dist/cjs/view/tests/travelhub/23.1/app.checksum.css +3 -0
  42. package/dist/cjs/view/tests/travelhub/23.1/app.checksum.js +25 -0
  43. package/dist/cjs/view/tests/travelhub/23.1/landing.checksum1.css +3 -0
  44. package/dist/cjs/view/tests/travelhub/23.1/landing.checksum1.js +6 -0
  45. package/dist/cjs/view/tests/travelhub/23.1/manifest.json +6 -0
  46. package/dist/cjs/view/tests/travelhub/latest/app.checksum.css +3 -0
  47. package/dist/cjs/view/tests/travelhub/latest/app.checksum.js +30 -0
  48. package/dist/cjs/view/tests/travelhub/latest/landing.checksum.css +3 -0
  49. package/dist/cjs/view/tests/travelhub/latest/landing.checksum.js +8 -0
  50. package/dist/cjs/view/tests/travelhub/latest/manifest.json +6 -0
  51. package/dist/cjs/{utils/micro-frontend/ssfguest-adapter.js → view/tests/utils.js} +34 -29
  52. package/dist/esm/analytics/index.js +2 -1
  53. package/dist/esm/index.js +7 -1
  54. package/dist/esm/utils/micro-frontend/app-bridge.js +18 -0
  55. package/dist/esm/utils/micro-frontend/guest.js +101 -14
  56. package/dist/esm/utils/micro-frontend/host.js +36 -3
  57. package/dist/esm/utils/micro-frontend/scripting-objects/analytics.js +8 -4
  58. package/dist/esm/utils/micro-frontend/tests/app.config.json +200 -0
  59. package/dist/esm/utils/micro-frontend/tests/utils.js +96 -0
  60. package/dist/esm/utils/testing/index.js +5 -1
  61. package/dist/esm/view/guest-microapp.js +83 -0
  62. package/dist/esm/view/micro-iframe-app/iframe/index.js +1 -1
  63. package/dist/esm/view/micro-iframe-app/iframe.html +5 -1
  64. package/dist/esm/view/micro-iframe-app/use-frame-loaded.js +3 -1
  65. package/dist/esm/view/tests/__snapshots__/guest-microapp.test.tsx.snap +21 -0
  66. package/dist/esm/view/tests/__snapshots__/micro-iframe-app.test.tsx.snap +208 -0
  67. package/dist/esm/view/tests/app.config.json +200 -0
  68. package/dist/esm/view/tests/constants.js +24 -0
  69. package/dist/esm/view/tests/flights/23.1/app.checksum1.css +3 -0
  70. package/dist/esm/view/tests/flights/23.1/app.checksum1.js +51 -0
  71. package/dist/esm/view/tests/flights/23.1/manifest.json +4 -0
  72. package/dist/esm/view/tests/flights/latest/app.checksum.css +3 -0
  73. package/dist/esm/view/tests/flights/latest/app.checksum.js +51 -0
  74. package/dist/esm/view/tests/flights/latest/manifest.json +4 -0
  75. package/dist/esm/view/tests/hotels/23.1/app.checksum.css +3 -0
  76. package/dist/esm/view/tests/hotels/23.1/app.checksum.js +51 -0
  77. package/dist/esm/view/tests/hotels/23.1/manifest.json +4 -0
  78. package/dist/esm/view/tests/hotels/latest/app.checksum.css +3 -0
  79. package/dist/esm/view/tests/hotels/latest/app.checksum.js +51 -0
  80. package/dist/esm/view/tests/hotels/latest/manifest.json +4 -0
  81. package/dist/esm/view/tests/loan/latest/index.js +115 -0
  82. package/dist/esm/view/tests/loan/latest/manifest.json +3 -0
  83. package/dist/esm/view/tests/scriptingObjects/appraisalServiceModule.js +63 -0
  84. package/dist/esm/view/tests/scriptingObjects/constant.js +4 -0
  85. package/dist/esm/view/tests/scriptingObjects/global.js +22 -0
  86. package/dist/esm/view/tests/scriptingObjects/loan.js +180 -0
  87. package/dist/esm/view/tests/server.js +9 -0
  88. package/dist/esm/view/tests/serverHandlers.js +180 -0
  89. package/dist/esm/view/tests/task/latest/index.dev.js +66 -0
  90. package/dist/esm/view/tests/task/latest/index.js +66 -0
  91. package/dist/esm/view/tests/task/latest/manifest.json +4 -0
  92. package/dist/esm/view/tests/travelhub/23.1/app.checksum.css +3 -0
  93. package/dist/esm/view/tests/travelhub/23.1/app.checksum.js +24 -0
  94. package/dist/esm/view/tests/travelhub/23.1/landing.checksum1.css +3 -0
  95. package/dist/esm/view/tests/travelhub/23.1/landing.checksum1.js +5 -0
  96. package/dist/esm/view/tests/travelhub/23.1/manifest.json +6 -0
  97. package/dist/esm/view/tests/travelhub/latest/app.checksum.css +3 -0
  98. package/dist/esm/view/tests/travelhub/latest/app.checksum.js +29 -0
  99. package/dist/esm/view/tests/travelhub/latest/landing.checksum.css +3 -0
  100. package/dist/esm/view/tests/travelhub/latest/landing.checksum.js +7 -0
  101. package/dist/esm/view/tests/travelhub/latest/manifest.json +6 -0
  102. package/dist/esm/view/tests/utils.js +33 -0
  103. package/dist/types/lib/index.d.ts +2 -1
  104. package/dist/types/lib/utils/micro-frontend/app-bridge.d.ts +4 -0
  105. package/dist/types/lib/utils/micro-frontend/guest.d.ts +46 -11
  106. package/dist/types/lib/utils/micro-frontend/host.d.ts +27 -10
  107. package/dist/types/lib/utils/micro-frontend/scripting-objects/analytics.d.ts +8 -5
  108. package/dist/types/lib/utils/micro-frontend/tests/utils.d.ts +39 -0
  109. package/dist/types/lib/utils/micro-frontend/types.d.ts +2 -1
  110. package/dist/types/lib/utils/testing/index.d.ts +57 -1
  111. package/dist/types/lib/utils/window.d.ts +13 -6
  112. package/dist/types/lib/view/guest-microapp.d.ts +13 -0
  113. package/dist/types/lib/view/micro-app/index.d.ts +5 -0
  114. package/dist/types/lib/view/micro-iframe-app/index.d.ts +5 -0
  115. package/dist/types/lib/view/tests/constants.d.ts +11 -0
  116. package/dist/types/lib/view/tests/flights/23.1/app.checksum1.d.ts +7 -0
  117. package/dist/types/lib/view/tests/flights/latest/app.checksum.d.ts +7 -0
  118. package/dist/types/lib/view/tests/hotels/23.1/app.checksum.d.ts +7 -0
  119. package/dist/types/lib/view/tests/hotels/latest/app.checksum.d.ts +7 -0
  120. package/dist/types/lib/view/tests/loan/latest/index.d.ts +11 -0
  121. package/dist/types/lib/view/tests/micro-iframe-app.test.d.ts +1 -0
  122. package/dist/types/lib/view/tests/scriptingObjects/appraisalServiceModule.d.ts +36 -0
  123. package/dist/types/lib/view/tests/scriptingObjects/constant.d.ts +1 -0
  124. package/dist/types/lib/view/tests/scriptingObjects/global.d.ts +9 -0
  125. package/dist/types/lib/view/tests/scriptingObjects/loan.d.ts +31 -0
  126. package/dist/types/lib/view/tests/server.d.ts +1 -0
  127. package/dist/types/lib/view/tests/serverHandlers.d.ts +5 -0
  128. package/dist/types/lib/view/tests/task/latest/index.d.ts +10 -0
  129. package/dist/types/lib/view/tests/task/latest/index.dev.d.ts +10 -0
  130. package/dist/types/lib/view/tests/travelhub/23.1/app.checksum.d.ts +7 -0
  131. package/dist/types/lib/view/tests/travelhub/23.1/landing.checksum1.d.ts +2 -0
  132. package/dist/types/lib/view/tests/travelhub/latest/app.checksum.d.ts +0 -0
  133. package/dist/types/lib/view/tests/travelhub/latest/landing.checksum.d.ts +0 -0
  134. package/dist/types/lib/view/tests/utils.d.ts +7 -0
  135. package/dist/types/tsconfig.tsbuildinfo +1 -1
  136. package/package.json +44 -44
  137. package/dist/esm/utils/micro-frontend/host-app.js +0 -9
  138. package/dist/esm/utils/micro-frontend/ssfguest-adapter.js +0 -28
  139. package/dist/types/lib/utils/micro-frontend/host-app.d.ts +0 -11
  140. package/dist/types/lib/utils/micro-frontend/ssfguest-adapter.d.ts +0 -7
  141. /package/dist/types/lib/{utils/micro-frontend/tests/guest-ssf-host.test.d.ts → view/tests/guest-microapp.test.d.ts} +0 -0
@@ -0,0 +1,22 @@
1
+ import {
2
+ ScriptingObjectNames
3
+ } from "@elliemae/pui-scripting-object";
4
+ import { ScriptingObject, Event } from "@elliemae/microfe-common";
5
+ class Global extends ScriptingObject {
6
+ #data = /* @__PURE__ */ new Map();
7
+ constructor() {
8
+ super("Global");
9
+ }
10
+ Change = new Event({
11
+ name: "Change",
12
+ objectId: ScriptingObjectNames.Global
13
+ });
14
+ set = (key, value) => {
15
+ this.#data.set(key, value);
16
+ return Promise.resolve();
17
+ };
18
+ get = (key) => Promise.resolve(this.#data.get(key) || "");
19
+ }
20
+ export {
21
+ Global
22
+ };
@@ -0,0 +1,180 @@
1
+ import { ScriptingObject, Event } from "@elliemae/pui-app-bridge";
2
+ class Loan extends ScriptingObject {
3
+ #loanData;
4
+ #appBridge;
5
+ constructor(appBridge) {
6
+ super("loan");
7
+ this.#appBridge = appBridge;
8
+ this.#loanData = {
9
+ id: "1234567890",
10
+ status: "active",
11
+ loanAmount: 1e5,
12
+ interestRate: 3.5,
13
+ term: 30
14
+ };
15
+ window.__TEST__ = window.__TEST__ ?? {};
16
+ window.__TEST__.soLogs = window.__TEST__.soLogs ?? [];
17
+ }
18
+ #log(message) {
19
+ window.__TEST__.soLogs.push(message);
20
+ }
21
+ ApplicationSelected = new Event({
22
+ name: "applicationselected",
23
+ objectId: "loan"
24
+ });
25
+ Close = new Event({
26
+ name: "close",
27
+ objectId: "loan"
28
+ });
29
+ Change = new Event({
30
+ name: "change",
31
+ objectId: "loan"
32
+ });
33
+ Committed = new Event({
34
+ name: "committed",
35
+ objectId: "loan"
36
+ });
37
+ EditModeChange = new Event({
38
+ name: "editmodechange",
39
+ objectId: "loan"
40
+ });
41
+ MilestoneCompleted = new Event({
42
+ name: "milestonecompleted",
43
+ objectId: "loan"
44
+ });
45
+ Open = new Event({
46
+ name: "open",
47
+ objectId: "loan"
48
+ });
49
+ PreCommit = new Event({
50
+ name: "precommit",
51
+ objectId: "loan"
52
+ });
53
+ PreMilestoneComplete = new Event({
54
+ name: "premilestonecomplete",
55
+ objectId: "loan"
56
+ });
57
+ Sync = new Event({
58
+ name: "sync",
59
+ objectId: "loan"
60
+ });
61
+ all = () => {
62
+ this.#log("loan.all");
63
+ return Promise.resolve(this.#loanData);
64
+ };
65
+ applyLock = (fieldId, lock) => {
66
+ this.#log(`loan.applyLock: fieldId: ${fieldId}, lock: ${String(lock)}`);
67
+ return Promise.resolve();
68
+ };
69
+ calculate = () => {
70
+ this.#log("loan.calculate");
71
+ return Promise.resolve(this.#loanData);
72
+ };
73
+ commit = async () => {
74
+ this.#log("loan.commit");
75
+ const feedBack = await this.#appBridge.dispatchEvent({
76
+ event: this.PreCommit,
77
+ eventParams: {
78
+ id: this.#loanData.id
79
+ },
80
+ eventOptions: {
81
+ timeout: 1e3
82
+ }
83
+ });
84
+ this.#log(`loan.precommit:event:feedback: ${JSON.stringify(feedBack)}`);
85
+ if (feedBack.every((item) => item === true)) {
86
+ this.#log("loan.commit:succeed");
87
+ } else {
88
+ this.#log("loan.commit:failed");
89
+ }
90
+ return this.#loanData.id;
91
+ };
92
+ execAction = (type, params) => {
93
+ this.#log(
94
+ `loan.execAction: type: ${type}, params: ${JSON.stringify(params)}`
95
+ );
96
+ return Promise.resolve({
97
+ status: "success",
98
+ message: "Action executed successfully"
99
+ });
100
+ };
101
+ getCollection = (name) => {
102
+ this.#log(`loan.getCollection: name: ${name}`);
103
+ return Promise.resolve({
104
+ name,
105
+ data: [],
106
+ id: "collection-id",
107
+ objectType: "LoanCollection",
108
+ removeAt: (index) => {
109
+ this.#log(`loan.getCollection.removeAt: index: ${index}`);
110
+ }
111
+ });
112
+ };
113
+ getCurrentApplication = () => {
114
+ this.#log("loan.getCurrentApplication");
115
+ return Promise.resolve({
116
+ ...this.#loanData,
117
+ index: 0,
118
+ legacyId: "legacy-id"
119
+ });
120
+ };
121
+ getField = (id) => {
122
+ this.#log(`loan.getField: id: ${id}`);
123
+ return Promise.resolve(this.#loanData.name);
124
+ };
125
+ getFieldOptions = (param) => {
126
+ this.#log(`loan.getFieldOptions: param: ${JSON.stringify(param)}`);
127
+ return Promise.resolve({
128
+ fieldId: [
129
+ {
130
+ id: "option1",
131
+ label: "Option 1",
132
+ name: "OptionName1",
133
+ value: "OptionValue1"
134
+ },
135
+ {
136
+ id: "option2",
137
+ label: "Option 2",
138
+ name: "OptionName2",
139
+ value: "OptionValue2"
140
+ }
141
+ ]
142
+ });
143
+ };
144
+ getFields = (ids) => {
145
+ this.#log(`loan.getFields: ids: ${JSON.stringify(ids)}`);
146
+ const fields = ids.reduce((acc, id) => {
147
+ acc[id] = this.#loanData.name;
148
+ return acc;
149
+ }, {});
150
+ return Promise.resolve(fields);
151
+ };
152
+ isReadOnly = () => {
153
+ this.#log("loan.isReadOnly");
154
+ return Promise.resolve(false);
155
+ };
156
+ merge = () => {
157
+ this.#log("loan.merge");
158
+ return Promise.resolve();
159
+ };
160
+ setCurrentApplication = (options) => {
161
+ this.#log(
162
+ `loan.setCurrentApplication: options: ${JSON.stringify(options)}`
163
+ );
164
+ return Promise.resolve();
165
+ };
166
+ setEditMode = (options) => {
167
+ this.#log(`loan.setEditMode: options: ${JSON.stringify(options)}`);
168
+ return Promise.resolve();
169
+ };
170
+ setFields = (fields) => {
171
+ this.#log(`loan.setFields: fields: ${JSON.stringify(fields)}`);
172
+ Object.keys(fields).forEach((key) => {
173
+ const field = fields[key];
174
+ });
175
+ return Promise.resolve();
176
+ };
177
+ }
178
+ export {
179
+ Loan
180
+ };
@@ -0,0 +1,9 @@
1
+ import { setupServer } from "msw/node";
2
+ import { serverHandlers } from "./serverHandlers.js";
3
+ const initServer = () => {
4
+ const server = setupServer(...serverHandlers);
5
+ return server;
6
+ };
7
+ export {
8
+ initServer
9
+ };
@@ -0,0 +1,180 @@
1
+ import { rest } from "msw";
2
+ import { readFile } from "fs/promises";
3
+ import path from "node:path";
4
+ import appConfig from "./app.config.json";
5
+ import loanAppManifest from "./loan/latest/manifest.json";
6
+ import latestTaskManifest from "./task/latest/manifest.json";
7
+ import latestAppManifest from "./travelhub/latest/manifest.json";
8
+ import versionedAppManifest from "./travelhub/23.1/manifest.json";
9
+ import latestFlightsManifest from "./flights/latest/manifest.json";
10
+ import versionedFlightsManifest from "./flights/23.1/manifest.json";
11
+ import latestHotelsManifest from "./hotels/latest/manifest.json";
12
+ import versionedHotelsManifest from "./hotels/23.1/manifest.json";
13
+ import { LATEST_VERSION, RELEASE_VERSION } from "./constants.js";
14
+ import { getMajorMinorVersion } from "./utils.js";
15
+ const relMajorMinorVersion = getMajorMinorVersion(RELEASE_VERSION);
16
+ var ResourceType = /* @__PURE__ */ ((ResourceType2) => {
17
+ ResourceType2["JS"] = "js";
18
+ ResourceType2["CSS"] = "css";
19
+ return ResourceType2;
20
+ })(ResourceType || {});
21
+ const manifests = {
22
+ task: {
23
+ latest: latestTaskManifest
24
+ },
25
+ travelHub: {
26
+ latest: latestAppManifest
27
+ },
28
+ flights: {
29
+ latest: latestFlightsManifest
30
+ },
31
+ hotels: {
32
+ latest: latestHotelsManifest
33
+ }
34
+ };
35
+ manifests.task[relMajorMinorVersion] = {};
36
+ manifests.travelHub[relMajorMinorVersion] = versionedAppManifest;
37
+ manifests.flights[relMajorMinorVersion] = versionedFlightsManifest;
38
+ manifests.hotels[relMajorMinorVersion] = versionedHotelsManifest;
39
+ const sendResource = async (res, ctx, filePath, type = "js" /* JS */) => {
40
+ const fileContent = await readFile(path.join(__dirname, filePath), "utf-8");
41
+ return res(
42
+ ctx.status(200),
43
+ ctx.set(
44
+ "Content-Type",
45
+ type === "js" /* JS */ ? "application/javascript" : "text/css"
46
+ ),
47
+ ctx.body(fileContent)
48
+ );
49
+ };
50
+ const getAppResourceHandlers = (urls, baseFolder) => urls.map((url) => {
51
+ const handler = rest.get(url, async (req, res, ctx) => {
52
+ const newRes = await sendResource(
53
+ res,
54
+ ctx,
55
+ `${baseFolder}${url}`,
56
+ url.includes(".css") ? "css" /* CSS */ : "js" /* JS */
57
+ );
58
+ return newRes;
59
+ });
60
+ return handler;
61
+ });
62
+ const sendJS = async (res, ctx, filePath) => {
63
+ const fileContent = await readFile(path.join(__dirname, filePath), "utf-8");
64
+ return res(
65
+ ctx.status(200),
66
+ ctx.set("Content-Type", "application/javascript"),
67
+ ctx.body(fileContent)
68
+ );
69
+ };
70
+ const getServerHandlers = () => {
71
+ const relVersion = getMajorMinorVersion(RELEASE_VERSION);
72
+ const versionedHandlers = [LATEST_VERSION, relVersion].reduce(
73
+ (prevValue, version) => {
74
+ prevValue = prevValue.concat([
75
+ rest.get(
76
+ `/travelhub/${version}/manifest.json`,
77
+ (req, res, ctx) => res(ctx.json(manifests.travelHub[version]))
78
+ ),
79
+ rest.get(
80
+ `/subfolder/${version}/manifest.json`,
81
+ (req, res, ctx) => res(ctx.json(manifests.travelHub[version]))
82
+ ),
83
+ rest.get(
84
+ `/task/${version}/manifest.json`,
85
+ (req, res, ctx) => res(ctx.json(manifests.task[version]))
86
+ ),
87
+ rest.get(
88
+ `/flights/${version}/manifest.json`,
89
+ (req, res, ctx) => res(ctx.json(manifests.flights[version]))
90
+ ),
91
+ rest.get(
92
+ `/hotels/${version}/manifest.json`,
93
+ (req, res, ctx) => res(ctx.json(manifests.hotels[version]))
94
+ ),
95
+ ...getAppResourceHandlers(
96
+ [
97
+ `/task/${version}/index.js`,
98
+ `/task/${version}/index.dev.js`,
99
+ `/travelhub/${version}/app.checksum.js`,
100
+ `/travelhub/${version}/app.checksum.css`,
101
+ `/travelhub/${version}/landing.checksum.js`,
102
+ `/travelhub/${version}/landing.checksum.css`,
103
+ `/travelhub/${version}/landing.checksum1.js`,
104
+ `/travelhub/${version}/landing.checksum1.css`,
105
+ `/flights/${version}/app.checksum.js`,
106
+ `/flights/${version}/app.checksum.css`,
107
+ `/flights/${version}/app.checksum1.js`,
108
+ `/flights/${version}/app.checksum1.css`,
109
+ `/hotels/${version}/app.checksum.js`,
110
+ `/hotels/${version}/app.checksum.css`,
111
+ `/hotels/${version}/app.checksum1.js`,
112
+ `/hotels/${version}/app.checksum1.css`
113
+ ],
114
+ "./"
115
+ )
116
+ ]);
117
+ return prevValue;
118
+ },
119
+ []
120
+ );
121
+ return versionedHandlers;
122
+ };
123
+ const serverHandlers = [
124
+ rest.get(
125
+ "https://www.google-analytics.com/analytics.js",
126
+ (req, res, ctx) => res(
127
+ ctx.status(200),
128
+ ctx.set("Content-Type", "application/javascript"),
129
+ ctx.body("")
130
+ )
131
+ ),
132
+ rest.get(
133
+ "/latest/app.config.json",
134
+ (req, res, ctx) => res(ctx.json(appConfig))
135
+ ),
136
+ rest.get(
137
+ `/${relMajorMinorVersion}/app.config.json`,
138
+ (req, res, ctx) => res(ctx.json(appConfig))
139
+ ),
140
+ // frame html
141
+ rest.get("/iframe.html", async (req, res, ctx) => {
142
+ const fileContent = await readFile(
143
+ path.join(__dirname, "../micro-iframe-app/iframe.html"),
144
+ "utf-8"
145
+ );
146
+ return res(
147
+ ctx.status(200),
148
+ ctx.set("Content-Type", "text/html"),
149
+ ctx.body(fileContent)
150
+ );
151
+ }),
152
+ rest.get("/frame.html", async (req, res, ctx) => {
153
+ const fileContent = await readFile(
154
+ path.join(
155
+ process.cwd(),
156
+ "node_modules/@elliemae/pui-app-bridge/dist/esm/frame.html"
157
+ ),
158
+ "utf-8"
159
+ );
160
+ return res(
161
+ ctx.status(200),
162
+ ctx.set("Content-Type", "text/html"),
163
+ ctx.body(fileContent)
164
+ );
165
+ }),
166
+ rest.get("/loan/latest/index.js", async (req, res, ctx) => {
167
+ const newRes = await sendJS(res, ctx, "./loan/latest/index.js");
168
+ return newRes;
169
+ }),
170
+ // loan microapp handler
171
+ rest.get(
172
+ "/loan/latest/manifest.json",
173
+ (req, res, ctx) => res(ctx.json(loanAppManifest))
174
+ ),
175
+ ...getServerHandlers()
176
+ ];
177
+ export {
178
+ getServerHandlers,
179
+ serverHandlers
180
+ };
@@ -0,0 +1,66 @@
1
+ const appId = "taskapp";
2
+ const appName = "Task App Dev";
3
+ const appElementId = `pui-app-container-${appId}`;
4
+ const pipelinePath = "/pipeline";
5
+ const pipelineLinkText = "Pipeline";
6
+ const getWindow = () => {
7
+ try {
8
+ window.parent.document;
9
+ return window.parent;
10
+ } catch (err) {
11
+ return window;
12
+ }
13
+ };
14
+ let host = null;
15
+ let parentHistory = null;
16
+ let logger = null;
17
+ const browserWindow = getWindow();
18
+ browserWindow.__TEST__ = browserWindow.__TEST__ ?? {
19
+ logs: []
20
+ };
21
+ window.emui = window.emui || { uuid: crypto.randomUUID() };
22
+ window.emui.app = {
23
+ uuid: window.emui.uuid,
24
+ init: async (options) => {
25
+ browserWindow.__TEST__.logs.push(`${appId} initializing`);
26
+ host = options.host;
27
+ parentHistory = options.history;
28
+ logger = options.logger;
29
+ },
30
+ mount: async () => {
31
+ browserWindow.__TEST__.logs.push(`${appId} mounting`);
32
+ const appContainer = document.getElementById(appElementId);
33
+ if (appContainer) {
34
+ const mainElement = document.createElement("main");
35
+ appContainer.appendChild(mainElement);
36
+ const pageHeaderEle = document.createElement("h1");
37
+ pageHeaderEle.textContent = appName;
38
+ mainElement.appendChild(pageHeaderEle);
39
+ const contentEle = document.createElement("p");
40
+ contentEle.textContent = "Go to ";
41
+ mainElement.appendChild(contentEle);
42
+ const linkEle = document.createElement("a");
43
+ linkEle.href = "#";
44
+ linkEle.onclick = () => {
45
+ parentHistory?.push?.(pipelinePath);
46
+ };
47
+ linkEle.textContent = pipelineLinkText;
48
+ contentEle.appendChild(linkEle);
49
+ browserWindow.__TEST__.logs.push(`${appId} mounted`);
50
+ } else {
51
+ throw new Error(
52
+ `App container element with id ${appElementId} not found`
53
+ );
54
+ }
55
+ },
56
+ unmount: () => {
57
+ browserWindow.__TEST__.logs.push(`${appId} unmounting`);
58
+ const appContainer = document.getElementById(appElementId);
59
+ if (appContainer) {
60
+ appContainer.removeChild(appContainer.getElementsByTagName("main")[0]);
61
+ }
62
+ browserWindow.__TEST__.logs.push(`${appId} unmounted`);
63
+ return Promise.resolve();
64
+ }
65
+ };
66
+ browserWindow.emui?.registerApp?.({ appId, app: window.emui.app });
@@ -0,0 +1,66 @@
1
+ const appId = "taskapp";
2
+ const appName = "Task App";
3
+ const appElementId = `pui-app-container-${appId}`;
4
+ const pipelinePath = "/pipeline";
5
+ const pipelineLinkText = "Pipeline";
6
+ const getWindow = () => {
7
+ try {
8
+ window.parent.document;
9
+ return window.parent;
10
+ } catch (err) {
11
+ return window;
12
+ }
13
+ };
14
+ let host = null;
15
+ let parentHistory = null;
16
+ let logger = null;
17
+ const browserWindow = getWindow();
18
+ browserWindow.__TEST__ = browserWindow.__TEST__ ?? {
19
+ logs: []
20
+ };
21
+ window.emui = window.emui || { uuid: crypto.randomUUID() };
22
+ window.emui.app = {
23
+ uuid: window.emui.uuid,
24
+ init: async (options) => {
25
+ browserWindow.__TEST__.logs.push(`${appId} initializing`);
26
+ host = options.host;
27
+ parentHistory = options.history;
28
+ logger = options.logger;
29
+ },
30
+ mount: async () => {
31
+ browserWindow.__TEST__.logs.push(`${appId} mounting`);
32
+ const appContainer = document.getElementById(appElementId);
33
+ if (appContainer) {
34
+ const mainElement = document.createElement("main");
35
+ appContainer.appendChild(mainElement);
36
+ const pageHeaderEle = document.createElement("h1");
37
+ pageHeaderEle.textContent = appName;
38
+ mainElement.appendChild(pageHeaderEle);
39
+ const contentEle = document.createElement("p");
40
+ contentEle.textContent = "Go to ";
41
+ mainElement.appendChild(contentEle);
42
+ const linkEle = document.createElement("a");
43
+ linkEle.href = "#";
44
+ linkEle.onclick = () => {
45
+ parentHistory?.push?.(pipelinePath);
46
+ };
47
+ linkEle.textContent = pipelineLinkText;
48
+ contentEle.appendChild(linkEle);
49
+ browserWindow.__TEST__.logs.push(`${appId} mounted`);
50
+ } else {
51
+ throw new Error(
52
+ `App container element with id ${appElementId} not found`
53
+ );
54
+ }
55
+ },
56
+ unmount: () => {
57
+ browserWindow.__TEST__.logs.push(`${appId} unmounting`);
58
+ const appContainer = document.getElementById(appElementId);
59
+ if (appContainer) {
60
+ appContainer.removeChild(appContainer.getElementsByTagName("main")[0]);
61
+ }
62
+ browserWindow.__TEST__.logs.push(`${appId} unmounted`);
63
+ return Promise.resolve();
64
+ }
65
+ };
66
+ browserWindow.emui?.registerApp?.({ appId, app: window.emui.app });
@@ -0,0 +1,4 @@
1
+ {
2
+ "index.js": "latest/index.js",
3
+ "index.dev.js": "latest/index.dev.js"
4
+ }
@@ -0,0 +1,3 @@
1
+ h1 {
2
+ color: red;
3
+ }
@@ -0,0 +1,24 @@
1
+ const appId = "travelhub";
2
+ const appName = "Travel Hub";
3
+ const getWindow = () => {
4
+ try {
5
+ window.parent.document;
6
+ return window.parent;
7
+ } catch (err) {
8
+ return window;
9
+ }
10
+ };
11
+ const browserWindow = getWindow();
12
+ browserWindow.emui = browserWindow.emui || {};
13
+ browserWindow.emui[appId] = browserWindow.emui[appId] || {};
14
+ const mainElement = document.createElement("main");
15
+ mainElement.id = "travelhub";
16
+ const pageHeaderEle = document.createElement("h1");
17
+ pageHeaderEle.id = "header";
18
+ pageHeaderEle.textContent = appName;
19
+ mainElement.appendChild(pageHeaderEle);
20
+ const versionEle = document.createElement("p");
21
+ versionEle.id = "version";
22
+ versionEle.textContent = "Version: 23.1";
23
+ mainElement.appendChild(versionEle);
24
+ document.body.appendChild(mainElement);
@@ -0,0 +1,3 @@
1
+ #content {
2
+ color: green;
3
+ }
@@ -0,0 +1,5 @@
1
+ const mainElement = document.getElementById("travelhub");
2
+ const contentEle = document.createElement("p");
3
+ contentEle.id = "greeting";
4
+ contentEle.textContent = "Hello Travellers!";
5
+ mainElement.appendChild(contentEle);
@@ -0,0 +1,6 @@
1
+ {
2
+ "app.js": "23.1/app.checksum.js",
3
+ "landing.js": "23.1/landing.checksum1.js",
4
+ "app.css": "23.1/app.checksum.css",
5
+ "landing.css": "23.1/landing.checksum1.css"
6
+ }
@@ -0,0 +1,3 @@
1
+ h1 {
2
+ color: red;
3
+ }
@@ -0,0 +1,29 @@
1
+ (function() {
2
+ const appId = "travelhub";
3
+ const appName = "Travel Hub";
4
+ const getWindow = () => {
5
+ try {
6
+ window.parent.document;
7
+ return window.parent;
8
+ } catch (err) {
9
+ return window;
10
+ }
11
+ };
12
+ const browserWindow = getWindow();
13
+ browserWindow.emui = browserWindow.emui ?? {};
14
+ browserWindow.emui[appId] = browserWindow.emui[appId] ?? {};
15
+ browserWindow.__TEST__ = browserWindow.__TEST__ ?? {
16
+ logs: []
17
+ };
18
+ const mainElement = document.createElement("main");
19
+ mainElement.id = "travelhub";
20
+ const pageHeaderEle = document.createElement("h1");
21
+ pageHeaderEle.id = "header";
22
+ pageHeaderEle.textContent = appName;
23
+ mainElement.appendChild(pageHeaderEle);
24
+ const versionEle = document.createElement("p");
25
+ versionEle.id = "version";
26
+ versionEle.textContent = "Version: latest";
27
+ mainElement.appendChild(versionEle);
28
+ document.body.appendChild(mainElement);
29
+ })();
@@ -0,0 +1,3 @@
1
+ #content {
2
+ color: green;
3
+ }
@@ -0,0 +1,7 @@
1
+ (function() {
2
+ const mainElement = document.getElementById("travelhub");
3
+ const contentEle = document.createElement("p");
4
+ contentEle.id = "greeting";
5
+ contentEle.textContent = "Hello Travellers!";
6
+ mainElement.appendChild(contentEle);
7
+ })();
@@ -0,0 +1,6 @@
1
+ {
2
+ "app.js": "latest/app.checksum.js",
3
+ "landing.js": "latest/landing.checksum.js",
4
+ "app.css": "latest/app.checksum.css",
5
+ "landing.css": "latest/landing.checksum.css"
6
+ }
@@ -0,0 +1,33 @@
1
+ import { readFile } from "fs/promises";
2
+ import path from "node:path";
3
+ import { logger as puiLogger, Console } from "@elliemae/pui-diagnostics";
4
+ const getMajorMinorVersion = (version) => version.split(".").slice(0, 2).join(".");
5
+ const sendJS = async (res, ctx, filePath) => {
6
+ const fileContent = await readFile(path.join(__dirname, filePath), "utf-8");
7
+ return res.once(
8
+ ctx.status(200),
9
+ ctx.set("Content-Type", "application/javascript"),
10
+ ctx.body(fileContent)
11
+ );
12
+ };
13
+ const sendJSText = async (res, ctx, fileContent) => res.once(
14
+ ctx.status(200),
15
+ ctx.set("Content-Type", "application/javascript"),
16
+ ctx.body(fileContent)
17
+ );
18
+ const releaseJSThread = () => new Promise((resolve) => {
19
+ setTimeout(resolve, 0);
20
+ });
21
+ const logger = puiLogger({
22
+ transport: Console(),
23
+ index: "microfe",
24
+ team: "ui platform",
25
+ appName: "MicroFE Tests"
26
+ });
27
+ export {
28
+ getMajorMinorVersion,
29
+ logger,
30
+ releaseJSThread,
31
+ sendJS,
32
+ sendJSText
33
+ };