Skip to content

Commit

Permalink
[FEATURE] Server: Add handling for custom middleware
Browse files Browse the repository at this point in the history
As per RFC 0005: SAP/ui5-tooling#151
  • Loading branch information
RandomByte committed Jun 18, 2019
1 parent 840dfb9 commit 9a60bb3
Show file tree
Hide file tree
Showing 8 changed files with 223 additions and 95 deletions.
9 changes: 9 additions & 0 deletions lib/middleware/connectUi5Proxy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const ui5connect = require("connect-openui5");

function createMiddleware() {
return ui5connect.proxy({
secure: false
});
}

module.exports = createMiddleware;
18 changes: 10 additions & 8 deletions lib/middleware/discovery.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@ const urlPattern = /\/(app_pages|all_libs|all_tests)(?:[?#].*)?$/;
* </ul>
*
* @module @ui5/server/middleware/discovery
* @param {Object} resourceCollections Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resourceCollections.source Resource reader or collection for the source project
* @param {module:@ui5/fs.AbstractReader} resourceCollections.combo Resource collection which contains the workspace and the project dependencies
* @param {Object} parameters Parameters
* @param {module:@ui5/fs.AbstractReader} parameters.resources.all Reader or Collection to read resources of the
* root project and its dependencies
* @param {module:@ui5/fs.AbstractReader} parameters.resources.rootProject Reader or Collection to read resources of
* the project the server is started in
* @returns {Function} Returns a server middleware closure.
*/
function createMiddleware({resourceCollections}) {
function createMiddleware({resources}) {
return function discoveryMiddleware(req, res, next) {
const parts = urlPattern.exec(req.url);
const type = parts && parts[1];
Expand Down Expand Up @@ -46,7 +48,7 @@ function createMiddleware({resourceCollections}) {
}

if (type === "app_pages") {
resourceCollections.source.byGlob("/**/*.{html,htm}").then(function(resources) {
resources.rootProject.byGlob("/**/*.{html,htm}").then(function(resources) {
resources.forEach(function(resource) {
const relPath = resource.getPath().substr(1); // cut off leading "/"
response.push({
Expand All @@ -56,7 +58,7 @@ function createMiddleware({resourceCollections}) {
sendResponse();
});
} else if (type === "all_libs") {
resourceCollections.combo.byGlob([
resources.all.byGlob([
"/resources/**/*.library"
]).then(function(resources) {
resources.forEach(function(resource) {
Expand All @@ -72,8 +74,8 @@ function createMiddleware({resourceCollections}) {
});
} else if (type === "all_tests") {
Promise.all([
resourceCollections.combo.byGlob("/resources/**/*.library"),
resourceCollections.combo.byGlob("/test-resources/**/*.{html,htm}")
resources.all.byGlob("/resources/**/*.library"),
resources.all.byGlob("/test-resources/**/*.{html,htm}")
]).then(function(results) {
const libraryResources = results[0];
const testPageResources = results[1];
Expand Down
44 changes: 44 additions & 0 deletions lib/middleware/middlewareRepository.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
const middlewares = {
compression: "compression",
cors: "cors",
csp: "./csp",
serveResources: "./serveResources",
serveIndex: "./serveIndex",
discovery: "./discovery",
versionInfo: "./versionInfo",
connectUi5Proxy: "./connectUi5Proxy",
serveThemes: "./serveThemes",
nonReadRequests: "./nonReadRequests"
};

function getMiddleware(middlewareName) {
const middlewarePath = middlewares[middlewareName];

if (!middlewarePath) {
throw new Error(`middlewareRepository: Unknown Middleware ${middlewareName}`);
}
return require(middlewarePath);
}

function addMiddleware(name, middlewarePath) {
if (middlewares[name]) {
throw new Error(`middlewareRepository: Middleware ${name} already registered`);
}
middlewares[name] = middlewarePath;
}

function getAllMiddleware() {
const modules = {};
for (const middlewareName in middlewares) {
if (middlewares.hasOwnProperty(middlewareName)) {
modules[middlewareName] = require(middlewares[middlewareName]);
}
}
return middlewares;
}

module.exports = {
getMiddleware: getMiddleware,
addMiddleware: addMiddleware,
getAllMiddleware: getAllMiddleware
};
8 changes: 4 additions & 4 deletions lib/middleware/serveIndex.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,16 +133,16 @@ function createContent(path, resourceInfos) {
* Creates and returns the middleware to serve a resource index.
*
* @module @ui5/server/middleware/serveIndex
* @param {Object} resourceCollections Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resourceCollections.combo Resource collection which contains the workspace and the project dependencies
* @param {Object} resources Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resources.all Resource collection which contains the workspace and the project dependencies
* @returns {Function} Returns a server middleware closure.
*/
function createMiddleware({resourceCollections}) {
function createMiddleware({resources}) {
return function serveIndex(req, res, next) {
const pathname = parseurl(req).pathname;
log.verbose("\n Listing index of " + pathname);
const glob = pathname + (pathname.endsWith("/") ? "*" : "/*");
resourceCollections.combo.byGlob(glob, {nodir: false}).then((resources) => {
resources.all.byGlob(glob, {nodir: false}).then((resources) => {
if (!resources || resources.length == 0) { // Not found
next();
return;
Expand Down
8 changes: 4 additions & 4 deletions lib/middleware/serveResources.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ function isFresh(req, res) {
* Creates and returns the middleware to serve application resources.
*
* @module @ui5/server/middleware/serveResources
* @param {Object} resourceCollections Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resourceCollections.combo Resource collection which contains the workspace and the project dependencies
* @param {Object} resources Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resources.all Resource collection which contains the workspace and the project dependencies
* @returns {Function} Returns a server middleware closure.
*/
function createMiddleware({resourceCollections}) {
function createMiddleware({resources}) {
return function serveResources(req, res, next) {
const pathname = parseurl(req).pathname;
resourceCollections.combo.byPath(pathname).then(function(resource) {
resources.all.byPath(pathname).then(function(resource) {
if (!resource) { // Not found
next();
return;
Expand Down
10 changes: 5 additions & 5 deletions lib/middleware/serveThemes.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ const themeRequest = /^(.*\/)library(?:(\.css)|(-RTL\.css)|(-parameters\.json))$
* The theme is built in realtime. If a less file was modified, the theme build is triggered to rebuild the theme.
*
* @module @ui5/server/middleware/serveThemes
* @param {Object} resourceCollections Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resourceCollections.combo Resource collection which contains the workspace and the project dependencies
* @param {Object} resources Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resources.all Resource collection which contains the workspace and the project dependencies
* @returns {Function} Returns a server middleware closure.
*/
function createMiddleware({resourceCollections}) {
function createMiddleware({resources}) {
const builder = new themeBuilder.ThemeBuilder({
fs: fsInterface(resourceCollections.combo)
fs: fsInterface(resources.all)
});

return function theme(req, res, next) {
Expand All @@ -46,7 +46,7 @@ function createMiddleware({resourceCollections}) {
}

const sourceLessPath = themeReq[1] + "library.source.less";
resourceCollections.combo.byPath(sourceLessPath).then((sourceLessResource) => {
resources.all.byPath(sourceLessPath).then((sourceLessResource) => {
if (!sourceLessResource) { // Not found
next();
return;
Expand Down
8 changes: 4 additions & 4 deletions lib/middleware/versionInfo.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const createVersionInfoProcessor = require("@ui5/builder").processors.versionInf
* Creates and returns the middleware to create the version info as json object.
*
* @module @ui5/server/middleware/versionInfo
* @param {Object} resourceCollections Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resourceCollections.dependencies Resource collection which contains the project dependencies
* @param {Object} resources Contains the resource reader or collection to access project related files
* @param {module:@ui5/fs.AbstractReader} resources.dependencies Resource collection which contains the project dependencies
* @returns {Function} Returns a server middleware closure.
*/
function createMiddleware({resourceCollections, tree: project}) {
function createMiddleware({resources, tree: project}) {
return function versionInfo(req, res, next) {
resourceCollections.dependencies.byGlob("/**/.library")
resources.dependencies.byGlob("/**/.library")
.then((resources) => {
resources.sort((a, b) => {
return a._project.metadata.name.localeCompare(b._project.metadata.name);
Expand Down
Loading

0 comments on commit 9a60bb3

Please sign in to comment.