@sap-ux/preview-middleware 0.12.3 → 0.12.5

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 (30) hide show
  1. package/README.md +9 -0
  2. package/dist/base/flp.js +4 -11
  3. package/dist/client/adp/api-handler.js +141 -141
  4. package/dist/client/adp/command-executor.js +54 -54
  5. package/dist/client/adp/control-utils.js +44 -44
  6. package/dist/client/adp/controllers/AddFragment.controller.js +206 -206
  7. package/dist/client/adp/controllers/BaseDialog.controller.js +57 -57
  8. package/dist/client/adp/controllers/ControllerExtension.controller.js +174 -174
  9. package/dist/client/adp/controllers/ExtensionPoint.controller.js +100 -100
  10. package/dist/client/adp/init-dialogs.js +74 -74
  11. package/dist/client/adp/ui5-version-utils.js +63 -63
  12. package/dist/client/adp/utils.js +33 -33
  13. package/dist/client/cpe/changes/flex-change.js +51 -51
  14. package/dist/client/cpe/changes/index.js +10 -10
  15. package/dist/client/cpe/changes/validator.js +35 -35
  16. package/dist/client/cpe/documentation.js +164 -164
  17. package/dist/client/cpe/logger.js +30 -30
  18. package/dist/client/cpe/outline/nodes.js +84 -84
  19. package/dist/client/cpe/outline/utils.js +37 -37
  20. package/dist/client/cpe/types.js +4 -4
  21. package/dist/client/cpe/ui5-utils.js +49 -49
  22. package/dist/client/cpe/utils.js +48 -48
  23. package/dist/client/flp/WorkspaceConnector.js +69 -69
  24. package/dist/client/flp/common.js +28 -28
  25. package/dist/client/flp/enableFakeConnector.js +77 -77
  26. package/dist/client/flp/init.js +212 -212
  27. package/dist/client/flp/initConnectors.js +33 -33
  28. package/dist/client/flp/initRta.js +178 -178
  29. package/package.json +1 -1
  30. package/templates/flp/editor.html +1 -0
package/README.md CHANGED
@@ -3,6 +3,15 @@
3
3
  The `@sap-ux/preview-middleware` is a [Custom UI5 Server Middleware](https://sap.github.io/ui5-tooling/pages/extensibility/CustomServerMiddleware) for previewing an application in a local Fiori launchpad . It can be used either with the `ui5 serve` or the `fiori run` commands.
4
4
  It hosts a local Fiori launchpad based on your configuration as well as offers an API to modify flex changes in your project. The API is available at `/preview/api` and additional client code required for the preview is available at `/preview/client`.
5
5
 
6
+ When this middleware is used together with the `reload-middleware`, then the order in which the middlewares are loaded is important. The `reload-middleware` needs to be loaded before the `preview-middleware`. Hence the configuration in the `ui5.yaml` needs to look e.g. like this:
7
+
8
+ ```
9
+ - name: reload-middleware
10
+ afterMiddleware: compression
11
+ - name: preview-middleware
12
+ afterMiddleware: reload-middleware
13
+ ```
14
+
6
15
  ## Configuration Options
7
16
  | Option | Type | Default Value | Description |
8
17
  | ---------------------- | --------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
package/dist/base/flp.js CHANGED
@@ -125,7 +125,7 @@ class FlpSandbox {
125
125
  const supportedThemes = (_b = (_a = manifest['sap.ui5']) === null || _a === void 0 ? void 0 : _a.supportedThemes) !== null && _b !== void 0 ? _b : [DEFAULT_THEME];
126
126
  const ui5Theme = (_c = this.config.theme) !== null && _c !== void 0 ? _c : (supportedThemes.includes(DEFAULT_THEME) ? DEFAULT_THEME : supportedThemes[0]);
127
127
  this.templateConfig = {
128
- basePath: (_d = (0, path_1.relative)((0, path_1.dirname)(this.config.path), '/')) !== null && _d !== void 0 ? _d : '.',
128
+ basePath: (_d = path_1.posix.relative(path_1.posix.dirname(this.config.path), '/')) !== null && _d !== void 0 ? _d : '.',
129
129
  apps: {},
130
130
  ui5: {
131
131
  libs: this.getUI5Libs(manifest),
@@ -217,7 +217,7 @@ class FlpSandbox {
217
217
  this.router.use(`${path}editor`, (0, express_1.static)(cpe));
218
218
  }
219
219
  this.router.get(previewUrl, (_req, res) => {
220
- const html = this.generateSandboxForEditor(rta, editor);
220
+ const html = this.generateSandboxForEditor(rta, editor).replace('</body>', `</body>\n<!-- livereload disabled for editor </body>-->`);
221
221
  res.status(200).contentType('html').send(html);
222
222
  });
223
223
  }
@@ -229,7 +229,7 @@ class FlpSandbox {
229
229
  // register static client sources
230
230
  this.router.use(PREVIEW_URL.client.url, (0, express_1.static)(PREVIEW_URL.client.local));
231
231
  // add route for the sandbox.html
232
- this.router.get(this.config.path, ((req, res) => __awaiter(this, void 0, void 0, function* () {
232
+ this.router.get(this.config.path, ((_req, res) => __awaiter(this, void 0, void 0, function* () {
233
233
  // warn the user if a file with the same name exists in the filesystem
234
234
  const file = yield this.project.byPath(this.config.path);
235
235
  if (file) {
@@ -237,14 +237,7 @@ class FlpSandbox {
237
237
  }
238
238
  const template = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../templates/flp/sandbox.html'), 'utf-8');
239
239
  const html = (0, ejs_1.render)(template, this.templateConfig);
240
- // if livereload is enabled, don't send it but let other middleware modify the content
241
- if (res._livereload) {
242
- res.write(html);
243
- res.end();
244
- }
245
- else {
246
- res.status(200).contentType('html').send(html);
247
- }
240
+ res.status(200).contentType('html').send(html);
248
241
  })));
249
242
  }
250
243
  /**
@@ -1,143 +1,143 @@
1
- "use strict";
2
-
3
- sap.ui.define([], function () {
4
- "use strict";
5
-
6
- var ApiEndpoints = /*#__PURE__*/function (ApiEndpoints) {
7
- ApiEndpoints["CHANGES"] = "/preview/api/changes";
8
- ApiEndpoints["FRAGMENT"] = "/adp/api/fragment";
9
- ApiEndpoints["CONTROLLER"] = "/adp/api/controller";
10
- ApiEndpoints["CODE_EXT"] = "/adp/api/code_ext";
11
- ApiEndpoints["MANIFEST_APP_DESCRIPTOR"] = "/manifest.appdescr_variant";
12
- return ApiEndpoints;
13
- }(ApiEndpoints || {});
14
- var RequestMethod = /*#__PURE__*/function (RequestMethod) {
15
- RequestMethod["GET"] = "GET";
16
- RequestMethod["PUT"] = "PUT";
17
- RequestMethod["POST"] = "POST";
18
- RequestMethod["PATCH"] = "PATCH";
19
- RequestMethod["DELETE"] = "DELETE";
20
- return RequestMethod;
21
- }(RequestMethod || {});
22
- /**
23
- * Requests a given endpoint
24
- *
25
- * @param endpoint API Endpoint
26
- * @param method RequestMethod
27
- * @param data Data to be sent to the server
28
- * @returns Data from the server request
29
- */
30
- async function request(endpoint, method, data) {
31
- const config = {
32
- method,
33
- body: JSON.stringify(data),
34
- headers: {
35
- 'content-type': 'application/json'
36
- }
37
- };
38
- try {
39
- const response = await fetch(endpoint, config);
40
- if (!response.ok) {
41
- const errorData = await response.json();
42
- const message = errorData?.message ?? '';
43
- throw new Error(`Request failed, status: ${response.status}. ${message}`.trim());
44
- }
45
- switch (method) {
46
- case RequestMethod.GET:
47
- return response.json();
48
- case RequestMethod.POST:
49
- /**
50
- * Since POST usually creates something
51
- * and returns nothing (or a message) we just parse the text from res.send(msg)
52
- */
53
- return response.text();
54
- default:
55
- return response.json();
56
- }
57
- } catch (e) {
58
- throw new Error(e.message);
59
- }
60
- }
61
-
62
- /**
63
- * Retrieves all XML fragments from the project's workspace
64
- *
65
- * @returns Generic Promise<T>
66
- */
67
- async function getFragments() {
68
- return request(ApiEndpoints.FRAGMENT, RequestMethod.GET);
69
- }
70
-
71
- /**
72
- * Writes an XML fragment to the project's workspace
73
- *
74
- * @param data Data to be send to the server
75
- * @returns Generic Promise<T>
76
- */
77
- async function writeFragment(data) {
78
- return request(ApiEndpoints.FRAGMENT, RequestMethod.POST, data);
79
- }
80
-
81
- /**
82
- * Retrieves manifest.appdescr_variant from the project's workspace
83
- *
84
- * @returns Generic Promise<T>
85
- */
86
- async function getManifestAppdescr() {
87
- return request(ApiEndpoints.MANIFEST_APP_DESCRIPTOR, RequestMethod.GET);
88
- }
89
-
90
- /**
91
- * Retrieves all controller extensions from the project's workspace
92
- *
93
- * @returns Generic Promise<T>
94
- */
95
- async function readControllers() {
96
- return request(ApiEndpoints.CONTROLLER, RequestMethod.GET);
97
- }
98
-
99
- /**
100
- * Writes a Controller to the project's workspace
101
- *
102
- * @param data Data to be send to the server
103
- * @returns Generic Promise<T>
104
- */
105
- async function writeController(data) {
106
- return request(ApiEndpoints.CONTROLLER, RequestMethod.POST, data);
107
- }
108
-
109
- /**
110
- * Checks for existing controller in the project's workspace
111
- *
112
- * @param controllerName Name of the controller
113
- * @returns {CodeExtResponse} Returns path to existing controller if found
114
- */
115
- async function getExistingController(controllerName) {
116
- return request(`${ApiEndpoints.CODE_EXT}/${controllerName}`, RequestMethod.GET);
117
- }
118
-
119
- /**
120
- * Writes a change object to the project's workspace
121
- *
122
- * @param data Data to be send to the server
123
- * @returns Generic Promise<T>
124
- */
125
- async function writeChange(data) {
126
- return request(ApiEndpoints.CHANGES, RequestMethod.POST, data);
127
- }
128
- var __exports = {
129
- __esModule: true
130
- };
131
- __exports.ApiEndpoints = ApiEndpoints;
132
- __exports.RequestMethod = RequestMethod;
133
- __exports.request = request;
134
- __exports.getFragments = getFragments;
135
- __exports.writeFragment = writeFragment;
136
- __exports.getManifestAppdescr = getManifestAppdescr;
137
- __exports.readControllers = readControllers;
138
- __exports.writeController = writeController;
139
- __exports.getExistingController = getExistingController;
140
- __exports.writeChange = writeChange;
141
- return __exports;
1
+ "use strict";
2
+
3
+ sap.ui.define([], function () {
4
+ "use strict";
5
+
6
+ var ApiEndpoints = /*#__PURE__*/function (ApiEndpoints) {
7
+ ApiEndpoints["CHANGES"] = "/preview/api/changes";
8
+ ApiEndpoints["FRAGMENT"] = "/adp/api/fragment";
9
+ ApiEndpoints["CONTROLLER"] = "/adp/api/controller";
10
+ ApiEndpoints["CODE_EXT"] = "/adp/api/code_ext";
11
+ ApiEndpoints["MANIFEST_APP_DESCRIPTOR"] = "/manifest.appdescr_variant";
12
+ return ApiEndpoints;
13
+ }(ApiEndpoints || {});
14
+ var RequestMethod = /*#__PURE__*/function (RequestMethod) {
15
+ RequestMethod["GET"] = "GET";
16
+ RequestMethod["PUT"] = "PUT";
17
+ RequestMethod["POST"] = "POST";
18
+ RequestMethod["PATCH"] = "PATCH";
19
+ RequestMethod["DELETE"] = "DELETE";
20
+ return RequestMethod;
21
+ }(RequestMethod || {});
22
+ /**
23
+ * Requests a given endpoint
24
+ *
25
+ * @param endpoint API Endpoint
26
+ * @param method RequestMethod
27
+ * @param data Data to be sent to the server
28
+ * @returns Data from the server request
29
+ */
30
+ async function request(endpoint, method, data) {
31
+ const config = {
32
+ method,
33
+ body: JSON.stringify(data),
34
+ headers: {
35
+ 'content-type': 'application/json'
36
+ }
37
+ };
38
+ try {
39
+ const response = await fetch(endpoint, config);
40
+ if (!response.ok) {
41
+ const errorData = await response.json();
42
+ const message = errorData?.message ?? '';
43
+ throw new Error(`Request failed, status: ${response.status}. ${message}`.trim());
44
+ }
45
+ switch (method) {
46
+ case RequestMethod.GET:
47
+ return response.json();
48
+ case RequestMethod.POST:
49
+ /**
50
+ * Since POST usually creates something
51
+ * and returns nothing (or a message) we just parse the text from res.send(msg)
52
+ */
53
+ return response.text();
54
+ default:
55
+ return response.json();
56
+ }
57
+ } catch (e) {
58
+ throw new Error(e.message);
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Retrieves all XML fragments from the project's workspace
64
+ *
65
+ * @returns Generic Promise<T>
66
+ */
67
+ async function getFragments() {
68
+ return request(ApiEndpoints.FRAGMENT, RequestMethod.GET);
69
+ }
70
+
71
+ /**
72
+ * Writes an XML fragment to the project's workspace
73
+ *
74
+ * @param data Data to be send to the server
75
+ * @returns Generic Promise<T>
76
+ */
77
+ async function writeFragment(data) {
78
+ return request(ApiEndpoints.FRAGMENT, RequestMethod.POST, data);
79
+ }
80
+
81
+ /**
82
+ * Retrieves manifest.appdescr_variant from the project's workspace
83
+ *
84
+ * @returns Generic Promise<T>
85
+ */
86
+ async function getManifestAppdescr() {
87
+ return request(ApiEndpoints.MANIFEST_APP_DESCRIPTOR, RequestMethod.GET);
88
+ }
89
+
90
+ /**
91
+ * Retrieves all controller extensions from the project's workspace
92
+ *
93
+ * @returns Generic Promise<T>
94
+ */
95
+ async function readControllers() {
96
+ return request(ApiEndpoints.CONTROLLER, RequestMethod.GET);
97
+ }
98
+
99
+ /**
100
+ * Writes a Controller to the project's workspace
101
+ *
102
+ * @param data Data to be send to the server
103
+ * @returns Generic Promise<T>
104
+ */
105
+ async function writeController(data) {
106
+ return request(ApiEndpoints.CONTROLLER, RequestMethod.POST, data);
107
+ }
108
+
109
+ /**
110
+ * Checks for existing controller in the project's workspace
111
+ *
112
+ * @param controllerName Name of the controller
113
+ * @returns {CodeExtResponse} Returns path to existing controller if found
114
+ */
115
+ async function getExistingController(controllerName) {
116
+ return request(`${ApiEndpoints.CODE_EXT}/${controllerName}`, RequestMethod.GET);
117
+ }
118
+
119
+ /**
120
+ * Writes a change object to the project's workspace
121
+ *
122
+ * @param data Data to be send to the server
123
+ * @returns Generic Promise<T>
124
+ */
125
+ async function writeChange(data) {
126
+ return request(ApiEndpoints.CHANGES, RequestMethod.POST, data);
127
+ }
128
+ var __exports = {
129
+ __esModule: true
130
+ };
131
+ __exports.ApiEndpoints = ApiEndpoints;
132
+ __exports.RequestMethod = RequestMethod;
133
+ __exports.request = request;
134
+ __exports.getFragments = getFragments;
135
+ __exports.writeFragment = writeFragment;
136
+ __exports.getManifestAppdescr = getManifestAppdescr;
137
+ __exports.readControllers = readControllers;
138
+ __exports.writeController = writeController;
139
+ __exports.getExistingController = getExistingController;
140
+ __exports.writeChange = writeChange;
141
+ return __exports;
142
142
  });
143
143
  //# sourceMappingURL=api-handler.js.map
@@ -1,56 +1,56 @@
1
- "use strict";
2
-
3
- sap.ui.define(["sap/m/MessageToast", "sap/ui/rta/command/CommandFactory"], function (MessageToast, CommandFactory) {
4
- "use strict";
5
-
6
- /**
7
- * Class responsible for handling rta calls
8
- */
9
- class CommandExecutor {
10
- /**
11
- *
12
- * @param rta Runtime Authoring
13
- */
14
- constructor(rta) {
15
- this.rta = rta;
16
- }
17
-
18
- /**
19
- * Generates command based on given values
20
- *
21
- * @param runtimeControl Managed object
22
- * @param commandName Command name
23
- * @param modifiedValue Modified value/s
24
- * @param designMetadata Design time metadata
25
- * @param flexSettings Additional flex settings
26
- */
27
- async getCommand(runtimeControl, commandName, modifiedValue, designMetadata, flexSettings) {
28
- try {
29
- return await CommandFactory.getCommandFor(runtimeControl, commandName, modifiedValue, designMetadata, flexSettings);
30
- } catch (e) {
31
- const errorMsg = `Could not get command for '${commandName}'. ${e.message}`;
32
- MessageToast.show(errorMsg);
33
- throw new Error(errorMsg);
34
- }
35
- }
36
-
37
- /**
38
- * Pushed and executes the provided command
39
- *
40
- * @param command Command
41
- */
42
- async pushAndExecuteCommand(command) {
43
- try {
44
- /**
45
- * The change will have pending state and will only be saved to the workspace when the user clicks save icon
46
- */
47
- await this.rta.getCommandStack().pushAndExecute(command);
48
- } catch (e) {
49
- MessageToast.show(e.message);
50
- throw new Error(e.message);
51
- }
52
- }
53
- }
54
- return CommandExecutor;
1
+ "use strict";
2
+
3
+ sap.ui.define(["sap/m/MessageToast", "sap/ui/rta/command/CommandFactory"], function (MessageToast, CommandFactory) {
4
+ "use strict";
5
+
6
+ /**
7
+ * Class responsible for handling rta calls
8
+ */
9
+ class CommandExecutor {
10
+ /**
11
+ *
12
+ * @param rta Runtime Authoring
13
+ */
14
+ constructor(rta) {
15
+ this.rta = rta;
16
+ }
17
+
18
+ /**
19
+ * Generates command based on given values
20
+ *
21
+ * @param runtimeControl Managed object
22
+ * @param commandName Command name
23
+ * @param modifiedValue Modified value/s
24
+ * @param designMetadata Design time metadata
25
+ * @param flexSettings Additional flex settings
26
+ */
27
+ async getCommand(runtimeControl, commandName, modifiedValue, designMetadata, flexSettings) {
28
+ try {
29
+ return await CommandFactory.getCommandFor(runtimeControl, commandName, modifiedValue, designMetadata, flexSettings);
30
+ } catch (e) {
31
+ const errorMsg = `Could not get command for '${commandName}'. ${e.message}`;
32
+ MessageToast.show(errorMsg);
33
+ throw new Error(errorMsg);
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Pushed and executes the provided command
39
+ *
40
+ * @param command Command
41
+ */
42
+ async pushAndExecuteCommand(command) {
43
+ try {
44
+ /**
45
+ * The change will have pending state and will only be saved to the workspace when the user clicks save icon
46
+ */
47
+ await this.rta.getCommandStack().pushAndExecute(command);
48
+ } catch (e) {
49
+ MessageToast.show(e.message);
50
+ throw new Error(e.message);
51
+ }
52
+ }
53
+ }
54
+ return CommandExecutor;
55
55
  });
56
56
  //# sourceMappingURL=command-executor.js.map
@@ -1,46 +1,46 @@
1
- "use strict";
2
-
3
- sap.ui.define([], function () {
4
- "use strict";
5
-
6
- /**
7
- * Handles calling control specific functions for retrieving control data
8
- */
9
- class ControlUtils {
10
- /**
11
- * Returns ManagedObject runtime control
12
- *
13
- * @param overlayControl Overlay
14
- * @returns {ManagedObject} Managed Object instance
15
- */
16
- static getRuntimeControl(overlayControl) {
17
- let runtimeControl;
18
- if (overlayControl.getElementInstance) {
19
- runtimeControl = overlayControl.getElementInstance();
20
- } else {
21
- runtimeControl = overlayControl.getElement();
22
- }
23
- return runtimeControl;
24
- }
25
-
26
- /**
27
- * Returns control aggregation names in an array
28
- *
29
- * @param control Managed Object runtime control
30
- * @param name Aggregation name
31
- * @returns Array of control aggregations
32
- */
33
- static getControlAggregationByName(control, name) {
34
- let result = [];
35
- const aggregation = (control ? control.getMetadata().getAllAggregations() : {})[name];
36
- if (aggregation) {
37
- // This executes a _sGetter function that can vary from control to control (_sGetter can be: getContent, getItems, etc)
38
- const names = aggregation._sGetter && control[aggregation._sGetter]() || [];
39
- result = Array.isArray(names) ? names : [names];
40
- }
41
- return result;
42
- }
43
- }
44
- return ControlUtils;
1
+ "use strict";
2
+
3
+ sap.ui.define([], function () {
4
+ "use strict";
5
+
6
+ /**
7
+ * Handles calling control specific functions for retrieving control data
8
+ */
9
+ class ControlUtils {
10
+ /**
11
+ * Returns ManagedObject runtime control
12
+ *
13
+ * @param overlayControl Overlay
14
+ * @returns {ManagedObject} Managed Object instance
15
+ */
16
+ static getRuntimeControl(overlayControl) {
17
+ let runtimeControl;
18
+ if (overlayControl.getElementInstance) {
19
+ runtimeControl = overlayControl.getElementInstance();
20
+ } else {
21
+ runtimeControl = overlayControl.getElement();
22
+ }
23
+ return runtimeControl;
24
+ }
25
+
26
+ /**
27
+ * Returns control aggregation names in an array
28
+ *
29
+ * @param control Managed Object runtime control
30
+ * @param name Aggregation name
31
+ * @returns Array of control aggregations
32
+ */
33
+ static getControlAggregationByName(control, name) {
34
+ let result = [];
35
+ const aggregation = (control ? control.getMetadata().getAllAggregations() : {})[name];
36
+ if (aggregation) {
37
+ // This executes a _sGetter function that can vary from control to control (_sGetter can be: getContent, getItems, etc)
38
+ const names = aggregation._sGetter && control[aggregation._sGetter]() || [];
39
+ result = Array.isArray(names) ? names : [names];
40
+ }
41
+ return result;
42
+ }
43
+ }
44
+ return ControlUtils;
45
45
  });
46
46
  //# sourceMappingURL=control-utils.js.map