Skip to main content
Version: v2.10.x LTS

Plug-ins definition and structure

Plug-ins definition and structure

The Zowe™ Application Server (zlux-app-server) enables extensiblity with application Plugins. Application Plugins are a subcategory of the unit of extensibility in the server called a plugin.

The files that define a Plugin are located in the pluginsDir directory.

pluginDefinition.json

This file describes an application Plugin to the Zowe Application Server. (A Plugin is the unit of extensibility for the Zowe Application Server. An application Plugin is a Plugin of the type "Application", the most common and visible type of Plugin.) A definition file informs the server whether the application Plugin has server-side dataservices, client-side web content, or both. The attributes of this file are defined within the pluginDefinition json-schema document

Application Plugin filesystem structure

An application Plugin can be loaded from a filesystem that is accessible to the Zowe Application Server, or it can be loaded dynamically at runtime. When accessed from a filesystem, there are important considerations for the developer and the user as to where to place the files for proper build, packaging, and operation.

Root files and directories

The root of an application Plugin directory contains the pluginDefinition.json file, and the following other files and directories.

Dev and source content

Aside from demonstration or open source application Plugins, the following directories should not be visible on a deployed server because the directories are used to build content and are not read by the server.

nodeServer

When an application Plugin has router-type dataservices, they are interpreted by the Zowe Application Server by attaching them as ExpressJS routers. It is recommended that you write application Plugins using Typescript, because it facilitates well-structured code. Use of Typescript results in build steps because the pre-transpilation Typescript content is not to be consumed by NodeJS. Therefore, keep server-side source code in the nodeServer directory. At runtime, the server loads router dataservices from the lib directory.

webClient

When an application Plugin has the webContent attribute in its definition, the server serves static content for a client. To optimize loading of the application Plugin to the user, use Typescript to write the application Plugin and then package it using Webpack. Use of Typescript and Webpack result in build steps because the pre-transpilation Typescript and the pre-webpack content are not to be consumed by the browser. Therefore, separate the source code from the served content by placing source code in the webClient directory.

Runtime content

At runtime, the following set of directories are used by the server and client.

lib

The lib directory is where router-type dataservices are loaded by use in the Zowe Application Server. If the JS files that are loaded from the lib directory require NodeJS modules, which are not provided by the server base (the modules zlux-server-framework requires are added to NODE_PATH at runtime), then you must include these modules in lib/node_modules for local directory lookup or ensure that they are found on the NODE_PATH environment variable. nodeServer/node_modules is not automatically accessed at runtime because it is a dev and build directory.

web

The web directory is where the server serves static content for an application Plugin that includes the webContent attribute in its definition. Typically, this directory contains the output of a webpack build. Anything you place in this directory can be accessed by a client, so only include content that is intended to be consumed by clients.

Packaging applications as compressed files

Application Plugin files can be served to browsers as compressed files in brotli (.br) or gzip (.gz) format. The file must be below the application's /web directory, and the browser must support the compression method. If there are multiple compressed files in the /web directory, the Zowe Application Server and browser perform runtime negotiation to decide which file to use.

Default user configuration

Configuration Dataservice default settings for users can be packaged within a Plugin.
This is done by putting content within the /config/storageDefaults folder, and more on that subject can be found here

App-to-App Communication

App-to-App communication behaviors can be statically defined or dynamically created at runtime. Static definitions help as a form of documentation and to be able to depend upon them, so it is recommended that these be packaged with a Plugin if you wish other's to be able to use App-to-App communication on your App.
This page describes the subject in more detail.
In summary, App-to-App Actions and Recognizers can be stored within an App's /config/actions and /config/recognizers folders, respectively, where the filenames much match the identifiers of Apps.

Documentation

In order for Zowe servers to pick up documentation to present to UIs, they must be in a uniform place.

The /doc folder of any Plugin can contain at its root any READMEs or documents that an administrator or developer may care about when working with a Plugin for the first time.

The /doc/swagger folder on the other hand, will be used to store .yaml extension Swagger 2.0 files that document the APIs of a Plugin's dataservices if they exist.

Other folders may exist, such as /doc/ui to document help behavior that may be shown in a UI, but is not implemented at this time.

Location of Plugin files

The files that define a Plugin are located in the plugins directory.

pluginsDir directory

At startup, the server reads from the plugins directory. The server loads the valid Plugins that are found by the information that is provided in the JSON files.

Within the pluginsDir directory are a collection of JSON files. Each file has two attributes, which serve to locate a Plugin on disk:

location: This is a directory path that is relative to the server's executable (such as zlux-app-server/bin/start.sh) at which a pluginDefinition.json file is expected to be found.

identifier: The unique string (commonly styled as a Java resource) of a Plugin, which must match what is in the pluginDefinition.json file.

Application Dataservices

See Dataservices

Application Configuration Data

The App server has a component for managing an App's configuration & user data, organized by scope such as user, group, and server instance. For more information, see Configuration Dataservice Documentation.