Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] Server: Add handling for custom middleware #200

Merged
merged 9 commits into from
Jul 10, 2019
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.
RandomByte marked this conversation as resolved.
Show resolved Hide resolved
*/
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